20162305 2017-2018-1 《程序设计与数据结构》第9周学习总结
20162305 2017-2018-1 《程序设计与数据结构》第9周学习总结
教材学习内容总结
- 堆是一棵完全二叉树,其中的每个元素大于等于其所有子结点的值。
- 添加元素入堆:首先将这个元素添加为叶结点,然后将其向上移动到合适的位置。
- 删除元素:利用最后的叶结点来取代根,然后将其向下移动到合适的位置。
- 优先队列不是FIFO队列,它根据优先级排列元素,而不是根据它们进入队列的次序来排列。
代码调试中的问题和解决过程
-
问题1:教材中的代码在调试的过程中遇到了问题,其中的addElement和removeMin方法有问题。而且继承的LinkedMaxHeap中也有问题。
-
问题1解决方案:
-
addElement继承的是父类中的方法,在LinkedMaxHeap中,存在有add方法而没有addElement方法,将其改为add方法即可。
-
而removeMin方法,根据removeNext方法的注释
Removes the next highest priority element from this queue and returns a reference to it.
我们可知它应该是需要得到一个最大的元素,所以这里应该使用removeMax方法,而这个方法也存在于父类中,这个问题得到解决。
-
修改完这两个方法后,上面的问题仍然存在。我在张之睿同学的博客中知道了问题出在了哪里。原来PriorityQueueNode类实现了Comparable接口,用到了泛型,把比较的类型设为PriorityQueueNode类型时,漏了一个
,加上后问题就得到了解决。 -
修改后:
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 1、
A full binary tree of height n has _________________ leaves.
A. 2n
B. 3n
C. 2n
D. 2(n+1)
E. 3(n+1)
-
正确答案:A
-
解析:一个完整的二叉树正好有2n个叶子,因为每一片叶子都在同一高度,每个内部节点都有2个孩子。
-
2、
In a full tree, all leaves are at the same level.
A . true
B . false
-
正确答案:A
-
解析:完全树的定义是一棵树,所有的叶子都在同一水平,每个非叶节点有N个孩子。
-
3、
In a postorder traversal, the root is the last element visited in the tree.
A.true
B.false
- 正确答案:B
- 解析:一个后序遍历访问右子树,然后左子树,然后根。因此根始终是访问的最后一个元素。
结对及互评
其他(感悟、思考等,可选)
- 本周学习了堆、优先队列、哈夫曼树这些内容,个人感觉堆这部分内容在有了树的基础上相对容易些,而哈夫曼树我觉得还有很多要去学习,这周是在老师给出了代码的基础上补充方法,对老师给的代码都要好好分析理解。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 20/20 | |
第二周 | 100/100 | 1/2 | 15/35 | |
第三周 | 454/554 | 1/3 | 15/50 | |
第四五周 | 772/1326 | 2/5 | 20/70 | |
第七周 | 745/2071 | 2/7 | 20/90 | |
第八周 | 1125/3196 | 2/9 | 20/110 | |
第九周 | 810/4006 | 1/10 | 20/130 | 哈夫曼树、堆 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)