20162304 2017-2018-1 《程序设计与数据结构》第九周学习总结
20162304 2017-2018-1 《程序设计与数据结构》第九周学习总结
教材学习内容总结
- 堆的定义;
- 堆的实现;
- 堆排序;
- 优先队列以及它与堆的关系
教材学习中的问题和解决过程
-
问题1:优先队列的深入理解。
-
我们知道优先队列其实内部实现就是一个堆的数据结构,java默认的是一个小跟堆,每次取出最小的元素,因为堆的性质他可以做到O(logn)级别的插入和删除操作。
-
我们知道堆的性质是有:
- 堆中某个结点的值总是不大于(或不小于)其父结点的值;
- 堆总是一棵完全二叉树。
-
将根结点最大的堆叫做大根堆,根结点最小的堆叫做小根堆。常见的堆有二叉堆、斐波那契堆等
-
插入:向堆中插入一个新元素;在数组的最末尾插入新结点。然后自下而上调整子结点与父结点:比较当前结点与父结点,不满足堆性质则交换,使得当前子树满足二叉堆的性质。时间复杂度为 O(logn)。
-
弹出:删除堆顶元素,再把堆存储的最后那个结点填在根结点处。再从上而下调整父结点与它的子结点。时间复杂度为 O(logn)。
-
删除:使该元素与堆尾元素交换,调整堆容量,再由原堆尾元素的当前位置自顶向下调整。时间复杂度为 O(logn)。
-
如果经常需要合并两个堆的操作,那么使用二项堆、斜堆、左偏树等数据结构会更好。
-
可并堆支持合并操作,使得合并后的堆也能保持堆的性质。左偏树是可并堆的一种,保证左子树的深度大于右子树的深度,再用右子树与另一个堆合并。
因此,堆支持查询最值、插入、删除操作。
代码调试中的问题和解决过程
- 问题1:getMax()方法的实现
- 问题1解决方案:开始实现getMax方法时,我没有什么头绪,原来的代码中有removeMax方法,于是就先研究这个方法试图通过类比得出getMax方法
- 我发现removeMax方法中直接将根值删去,于是我想到堆中最大值为根,只要得到根的值即为最大值。
代码托管
点评过的同学博客和代码
- 本周结对学习情况
- 20162318
- 结对照片
- 结对学习内容
- 堆的学习
上周考试错题总结
- 上周无考试
其他(感悟、思考等,可选)
本周内容感觉与之前内容有很多相似之处,可以前后联系的学。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | 0/0 | 1/2 | 10/20 | |
第三周 | 163/163 | 1/3 | 12/32 | |
第四周 | 207/370 | 1/3 | 11/43 | |
第五周 | 931/1301 | 1/4 | 12/55 | |
第六周 | 391/1692 | 2/6 | 15/70 | |
第七周 | 760/2452 | 2/8 | 13/83 | |
第八周 | 1178/3630 | 2/8 | 13/83 | |
第八周 | 1199/4829 | 1/9 | 11/94 |
-
计划学习时间:11小时
-
实际学习时间:10小时