5.01

18:30,学校图书馆自习室的风扇关了,有高中那味了。

5.08

学校小测看到的题:

  1. 9.具有65个结点的完全二叉树的高度为C________ (根的层次号为1)
  2. A.8 B.7 C.6 D.5

?为什么是65个结点而不是63个结点?
image.png
第一大题的13到22题另找时间谈。
第二大题中

  1. 8.在树形结构中,树根结点没有前驱结点,其余每个结点有且只有1______ 个前驱结点,叶子结点没有后继结点,其余每个结点的后继结点可以有任意多 ___个。

后继结点是啥,孩子结点吗?为啥是任意多个?如果后继结点指的是子孙结点,那前驱结点指的为什么又是父节点,而不是祖先结点?
image.png
image.png
6.16更新:我错了,我5月时没理解透概念。

除开12题,第二大题的11到16题他日再谈。
5.10更新:11,14,15题谈过了,

5.09

第四大题搁置。
5.10更新:

5.10

素拓里的这题,啊咧?
2.png
第三大题的第4题,纯路人,什么叫加上中序线索。。。。。
image.png
5.11更新:百度了一下,按我的理解,中序遍历本身就是线索化,那我加上prior结点的指向完事,希望我没事.jpg
1.jpg

5.11

之前构造哈夫曼树的时候用了最小堆来辅助构造,因为这和前面堆的例子相比,整个函数的参数和返回值都变了,按我的理解,应该是把一整个结构体指针传进堆里去了。个人见解。

  1. typedef struct TreeNode *HuffmanTree;
  2. struct TreeNode{
  3. int Weight;
  4. HuffmanTree Left, Right;
  5. }
  6. HuffmanTree Huffman( MinHeap H ){
  7. /* 假设H->Size个权值已经存在H->Elements[]->Weight里 */
  8. int i; HuffmanTree T;
  9. BuildMinHeap(H); /*将H->Elements[]按权值调整为最小堆*/
  10. for (i = 1; i < H->Size; i++) { /*做H->Size-1次合并*/
  11. T = malloc( sizeof( struct TreeNode) ); /*建立新结点*/
  12. T->Left = DeleteMin(H);
  13. /*从最小堆中删除一个结点,作为新T的左子结点*/
  14. T->Right = DeleteMin(H);
  15. /*从最小堆中删除一个结点,作为新T的右子结点*/
  16. T->Weight = T->Left->Weight+T->Right->Weight;
  17. /*计算新权值*/
  18. Insert( H, T ); /*将新T插入最小堆*/
  19. }
  20. T = DeleteMin(H);
  21. return T;

附上之前最大堆的删除函数对比,变了。

  1. ElementType DeleteMax( MaxHeap H ){
  2. /* 从最大堆H中取出键值为最大的元素,并删除一个结点 */
  3. int Parent, Child;
  4. ElementType MaxItem, X;
  5. if ( IsEmpty(H) ) {
  6. printf("最大堆已为空");
  7. return ERROR;
  8. }
  9. MaxItem = H->Data[1]; /* 取出根结点存放的最大值 */
  10. /* 用最大堆中最后一个元素从根结点开始向上过滤下层结点 */
  11. X = H->Data[H->Size--]; /* 注意当前堆的规模要减小 */
  12. for( Parent=1; Parent*2<=H->Size; Parent=Child ) {
  13. Child = Parent * 2;
  14. if( (Child!=H->Size) && (H->Data[Child]<H->Data[Child+1]) )
  15. Child++; /* Child指向左右子结点的较大者 */
  16. if( X >= H->Data[Child] ) break; /* 找到了合适位置 */
  17. else /* 下滤X */
  18. H->Data[Parent] = H->Data[Child];
  19. }
  20. H->Data[Parent] = X;
  21. return MaxItem;

3.gif
更往前,第四讲的小白专场, 是否同一棵二叉搜索树,那个check()函数,进入if(T->flag)后有个else return 0;
老师说这个情况是已经搜索过的路径中,如果传进来的V和T->v相等,说明同一个元素遇到了两次,这时我们认为V所在的那棵树他不是与T构成一样的搜索树。
我理解不了怎么一颗树搜索下去,一个元素怎么遇到两次。。。。龟龟。
image.png
后面第5讲的小白专场,讲 File Transfer这题时,老师简化了集合的表达形式,其中有句。。。。。

  1. typedef ElementType SetType[MaxSize];

啥玩意,把 ElementType[MaxSize]替换成 SetType,为什么[MaxSize]在SetType后面????后面那个函数验证了,是把 ElementType[MaxSize]替换成 SetType ,可那个[MaxSize]的位置。。。。。明日再说。

  1. SetName Find( SetType S, ElementType X ){
  2. /* 默认集合元素全部初始化为-1 */
  3. for ( ; S[X]>=0; X=S[X] ) ;
  4. return X;
  5. }
  1. 后面有个TSSN的实现,这是什么呢?To Simple sometimes naive,上交大成功(<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2317523/1620747162782-c1657bd9-de66-42bf-b7a9-6703924cee38.png#height=403&id=u1ecfc745&margin=%5Bobject%20Object%5D&name=image.png&originHeight=806&originWidth=1210&originalType=binary&ratio=1&size=140575&status=done&style=none&width=605)<br />Ackermann 函数,就是计算机导论算倒我好一段时间的那个阿克曼函数。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2317523/1620747738875-832af93c-0608-49a0-aac9-34765a051b97.png#height=272&id=uc6482b64&margin=%5Bobject%20Object%5D&name=image.png&originHeight=543&originWidth=820&originalType=binary&ratio=1&size=197974&status=done&style=none&width=410)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2317523/1620747923718-79490f79-9f09-4aa5-bd58-295273829415.png#height=112&id=ufc0c5af1&margin=%5Bobject%20Object%5D&name=image.png&originHeight=223&originWidth=1317&originalType=binary&ratio=1&size=40013&status=done&style=none&width=658.5)

5.12

webyog又整了个新活,Aqua Data Studio。要是有人能资助我一个SQLyog Ultimate就好了。。。。。555老贫下中农了
image.png

5.15

之前mybatis遇到的屑问题,insert的实现没写返回值,只是接口写了,为什么返回值能拿来判断????

  1. @Test
  2. public void addUser() {
  3. SqlSession sqlSession = MybatisUtils.getSqlSession();
  4. UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  5. int res = mapper.addUser(new User(4, "哈哈", "123333"));
  6. if (res > 0) {
  7. System.out.println("插入成功!");
  8. }
  9. sqlSession.commit();
  10. sqlSession.close();
  11. }

好一个if(res>0),嗝。

  1. int addUser(User user);
  1. <insert id="addUser" parameterType="com.kuang.pojo.User">
  2. insert into mybatis.user(id, name, pwd)
  3. values (#{id}, #{name}, #{pwd});
  4. </insert>

5.16

mybatis的结构比较基础,思维导图就不画了。
在mybatis的介绍页,介绍resultmap留了一句,如果这个世界总是这么简单就好了。嗯。。。。
image.png
无法直接把log4j改成log4j2完成升级,老老实实使用log4j先,以后再说。
Mabatiss执行流程剖析把我整破防了,分析SpringBoot的源码好歹还点进去看,分析Mabatis直接靠DEBUG背诵。。。。。。
先引入之前的知识,动态代理,拿结婚类比一下。 博客第三期 2021.05 - 图11然后是流程剖析,变得抽象了。
之前关于mybatis中insert的返回值问题,是我罪过,本来就有,不用设置,无事了。
不知道log4j2里怎么写,把log4j的写法贴上来先。

  1. log4j.properties
  2. #将等级为DEBUG的日志信息输出到console和file两个目的地
  3. log4j.rootLogger=DEBUG,console,file
  4. #控制台输出的相关设置
  5. log4j.appender.console=org.apache.log4j.ConsoleAppender
  6. log4j.appender.console.Target=System.out
  7. log4j.appender.console.Threshold=DEBUG
  8. log4j.appender.console.layout=org.apache.log4j.PatternLayout
  9. log4j.appender.console.layout.ConversionPattern=【%c】-%m%n
  10. #文件输出的相关配置
  11. log4j.appender.file=org.apache.log4j.RollingFileAppender
  12. log4j.appender.file.File=./log/kuang.log
  13. log4j.appender.file.MaxFileSize=10mb
  14. log4j.appender.file.Threshold=DEBUG
  15. log4j.appender.file.layout=org.apache.log4j.PatternLayout
  16. log4j.appender.file.layout.ConversionPattern=【%p】[%d{yy-MM-dd}【%c】%m%n
  17. #日志输出级别
  18. log4j.logger.org.mybatis=DEBUG
  19. log4j.logger.java.sql=DEBUG
  20. log4j.logger.java.sql.Statement=DEBUG
  21. log4j.logger.java.sql.ResultSet=DEBUG
  22. log4j.logger.java.sql.PreparedStatement=DEBUG
  1. 关于利用RowBound来分行,就是在Java代码层面实现SQL语句,而不是直接写SQL语句,发现Mybatis3.5.63.5.2相比又变了,不过2147483647这种刻在DNA里的数字应该不会变吧(<br />![10.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/2317523/1621179529717-9732bb9b-0ccd-4984-beeb-de231f559995.jpeg#height=1080&id=ufe4410f3&margin=%5Bobject%20Object%5D&name=10.jpg&originHeight=1080&originWidth=2400&originalType=binary&ratio=1&size=498806&status=done&style=none&width=2400)<br />![1.png](https://cdn.nlark.com/yuque/0/2021/png/2317523/1621179535197-e4d6f965-c8fc-4501-9b52-e0a3758bf918.png#height=1027&id=u5d319312&margin=%5Bobject%20Object%5D&name=1.png&originHeight=1027&originWidth=1913&originalType=binary&ratio=1&size=190793&status=done&style=none&width=1913)<br />然后RowBound分行这一节,用的不是selectList,我是不知道第二个参数是什么。。。。。虽然说是没有值,直接传null,不过值是什么。。。。。<br />![2.png](https://cdn.nlark.com/yuque/0/2021/png/2317523/1621179969481-77305dc3-8369-4a57-b010-dc6f7e3f0046.png#height=932&id=u23350f08&margin=%5Bobject%20Object%5D&name=2.png&originHeight=932&originWidth=1920&originalType=binary&ratio=1&size=134699&status=done&style=none&width=1920)![3.png](https://cdn.nlark.com/yuque/0/2021/png/2317523/1621179969535-cafae48c-5027-4f5b-9bc3-48730acfe132.png#height=928&id=u9c124119&margin=%5Bobject%20Object%5D&name=3.png&originHeight=928&originWidth=1920&originalType=binary&ratio=1&size=140998&status=done&style=none&width=1920)<br />动态代理我知道怎么一回事,但我不知道怎么实现啊喂<br />![11.jpg](https://cdn.nlark.com/yuque/0/2021/jpeg/2317523/1621180012585-e8e4f24a-463f-4b10-ad16-ae63dfbf0501.jpeg#height=1080&id=u3115f2a1&margin=%5Bobject%20Object%5D&name=11.jpg&originHeight=1080&originWidth=2400&originalType=binary&ratio=1&size=201625&status=done&style=none&width=2400)

5.21

图一章作业的第一大题搁置,第二大题第3-10,12-21搁置。第3大题,第4大题除开第6题,第7题,第9题搁置。第5大题搁置。

5.24

画个继承图,解释了一下为什么通过new ClassPathXmlApplicationContext()返回一个ApplicationContext。 博客第三期 2021.05 - 图12

5.27

被log4j卡住需要更新为log4j2的项目,mybatis-study和springboot-04-data。springboot-03-web为需要更新bootstrap5.0.1的资源。

5.28

上次卡住的动态代理我手动实现了一遍,作为AOP底层还是好解释的(用了租客的例子)。

5.29

看完Spring,开始看SpringMVC

5.30

看了SpringMVC开头跑回去补Servlet的基础知识,手头事多,忙完定时插入的编写马上赶去干课业的活。springboot详解的确没看完,一方面我没看分布式基础,shiro也没看。后面还有个Hadoop,大数据相关,怎么关法我不知道,我又没学。
来个hxd资助我服务器跑数据我就去学Hadoop,我算法都没学完(大数据概论提到的所有算法我手动过一遍也需要时间嘛)
Andrew Ng是真的出名,上个课查csdn的资料,资料里全是他那门微专业课程的ppt233(特指深度学习工程师)
手动把手头的学习资料从Tomcat9迁移到Tomcat10(自然不包括干活那些,我可没时间重构那么大一个工程),不过idea对我限制太大,不用Maven根本导不了JakartaEE9的Jar包
这学期的MOOC清单不包括在该专有思维导图中。
顺便提一嘴,少年谦这壁纸还挺好看的😆 博客第三期 2021.05 - 图131.jpg
关于Jakarta9的资料太少了,我贴个Maven GAV目录在这,来自Eclipse基金会 http://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates
暴扣水果的一个月,好耶1.jpg