您的位置:首页 > 理论基础 > 数据结构算法

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

2017-11-05 15:25 330 查看

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/01/110/10
第二周0/01/210/20
第三周163/1631/312/32
第四周207/3701/311/43
第五周931/13011/412/55
第六周391/16922/615/70
第七周760/24522/813/83
第八周1178/36302/813/83
第八周1199/48291/911/94
计划学习时间:11小时

实际学习时间:10小时

参考资料

《Java程序设计与数据结构教程(第二版)》

《Java程序设计与数据结构教程(第二版)》学习指导
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐