20172312 2018-2019-1 《程序设计与数据结构》第八周学习总结

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.使用堆来对某个数字列表进行排序:将列表的每一元素添加到堆中,而后次一个地将它们从根中删除,在最小堆的情形下,排序结果将是该列表以升序排列;在最大堆的情形下,排序结果将是该列表以降序排列。code

2.因为添加和删除操做的复杂度都为O(log n),所以能够得出堆排序的复杂度也是O(log n),可是,这些操做的复杂度为O(log n)指的是在含有n个元素的列表中添加和删除一个元素。

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

  • 问题1:教材中有这样一句话:“一般在堆的实现中,咱们会对二叉树的最后一片叶子进行跟踪记录。”那么为什么要对二叉树的最后一片叶子进行追踪记录?
  • 问题1解决方案:在对堆进行插入和删除操做的时候须要将根结点与最后一片叶子结点进行交换位置。

代码调试中的问题和解决过程

  • 问题1:无

码云连接

结对及互评

博客中值得学习的或问题:

  • 博客排版工整,界面很美观,而且本周还对博客排版、字体作了调整,很用心
  • 问题总结作得很全面:对课本上不懂的代码会作透彻的分析,即使能够直接拿过来用而不用管他的含义

本周结对学习状况

  • 20172315
  • 20172318

结对学习内容

  • p12.3 
  • 堆排序
相关文章
相关标签/搜索