20172312 2018-2019-1 《程序设计与数据结构》第八周学习总结
教材学习内容总结
第十二章
堆
1.堆:具有两个附加属性的一颗二叉树,它是一颗完全二叉树,对每一结点,它小于或等于其左右孩子(或大于等于其左右孩子)
2.最小堆:对每一结点,它小于或等于其左右孩子,将其最小元素存储在二叉树的根处,且其根的两个孩子同样也是最小堆
3.最大堆:对每一结点,它大于或等于其左右孩子,将其最大元素存储在二叉树的根处,且其根的两个孩子同样也是最大堆
操作 说明
addElement 往堆的合适位置添加一个元素
removeElement 从堆中删除一个元素
removeAllOccurrences 从堆中删除所指定元素的任何存在
removeMin 删除堆中的最小元素并返回它
removeMax 删除树堆的最大元素并返回它
findMin 返回一个指向堆中最小元素的引用
findMax 返回一个指向堆中最大元素的引用
堆的使用:优先级队列
1.优先级队列就是遵循两个排序规则的集合:具有更高优先级的项目在;具有相同优先级的项目使用先进先出方法来确定其排序
2.优先级队列具有多种应用(比如,操作系统中的任务调度,网络中的通信调度,甚至是汽车维修处的作业调度)
3.可以使用某一队列列表(其中每一队列都表示了给定优先级的项目)来实现一个优先级队列
4.按照优先级对堆排序完成了第一次排序(高优先级的项目在先)。但是,我们必须对具有相同优先级项目的先进先出排序进行操纵:
解决方案是创建一个 PriorityQueueNode对象,它存储的是将被放置在队列中的元素,该元素的优先级,以及元素放进队列的顺序
然后,我们只需为 PriorityNode类定义个 compareTo方法,以便先对优先级进行比较,然后在优先级一样的时候再对阶进行比较
堆的实现
1.列表实现堆:堆的链表实现要求在插入元素后能够向上遍历该树,所以堆中的结点必须存储指向其双亲的指针。
2.数组实现堆:树的根位于位置0,对于每一结点n,n的左孩子将位于数组的2n+1位置处,n的右孩子将位于数组的2(n+1)位置处(反过来同样也是对的)
对于任何除了根之外的结点n,n的双亲位于(n-1)/2位置处,因为我们能够计算双亲和孩子的位置,所以与链表实现不同的是,数组实现不需要创建一个 Heap Node类
堆的使用:堆排序
1.使用堆来对某个数字列表进行排序:将列表的每一元素添加到堆中,然后次一个地将它们从根中删除,在最小堆的情形下,排序结果将是该列表以升序排列;在最大堆的情形下,排序结果将是该列表以降序排列。
2.由于添加和删除操作的复杂度都为O(log n),因此可以得出堆排序的复杂度也是O(log n),但是,这些操作的复杂度为O(log n)指的是在含有n个元素的列表中添加和删除一个元素。
教材学习中的问题和解决过程
- 问题1:教材中有这样一句话:“通常在堆的实现中,我们会对二叉树的最后一片叶子进行跟踪记录。”那么为何要对二叉树的最后一片叶子进行追踪记录?
- 问题1解决方案:在对堆进行插入和删除操作的时候需要将根结点与最后一片叶子结点进行交换位置。
代码调试中的问题和解决过程
-
问题1:无
码云链接
结对及互评
博客中值得学习的或问题:
- 博客排版工整,界面很美观,并且本周还对博客排版、字体做了调整,很用心
- 问题总结做得很全面:对课本上不懂的代码会做透彻的分析,即便可以直接拿过来用而不用管他的含义
本周结对学习情况
- 20172315
- 20172318
结对学习内容
- p12.3
- 堆排序