20162304 2017-2018-1 《程序设计与数据结构》第九周学习总结

20162304 2017-2018-1 《程序设计与数据结构》第九周学习总结

教材学习内容总结

  1. 堆的定义;
  2. 堆的实现;
  3. 堆排序;
  4. 优先队列以及它与堆的关系

教材学习中的问题和解决过程

  • 问题1:优先队列的深入理解。

  • 我们知道优先队列其实内部实现就是一个堆的数据结构,java默认的是一个小跟堆,每次取出最小的元素,因为堆的性质他可以做到O(logn)级别的插入和删除操作。

  • 我们知道堆的性质是有:

  1. 堆中某个结点的值总是不大于(或不小于)其父结点的值;
  2. 堆总是一棵完全二叉树。
  • 将根结点最大的堆叫做大根堆,根结点最小的堆叫做小根堆。常见的堆有二叉堆、斐波那契堆等

  • 插入:向堆中插入一个新元素;在数组的最末尾插入新结点。然后自下而上调整子结点与父结点:比较当前结点与父结点,不满足堆性质则交换,使得当前子树满足二叉堆的性质。时间复杂度为 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小时

参考资料

posted @ 2017-11-05 15:25  20162304张浩林  阅读(188)  评论(0编辑  收藏  举报