20182306 2019-2020-1 《数据结构与面向对象程序设计》第十周学习总结

教材学习内容总结

  1. 堆:具有两个附加属性的一颗二叉树,它是一颗完全二叉树,对每一结点,它小于或等于其左右孩子(或大于等于其左右孩子)
  2. 最小堆:对每一结点,它小于或等于其左右孩子,将其最小元素存储在二叉树的根处,且其根的两个孩子同样也是最小堆
  3. 最大堆:对每一结点,它大于或等于其左右孩子,将其最大元素存储在二叉树的根处,且其根的两个孩子同样也是最大堆
  • 堆的使用:优先级队列
  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:为何要对二叉树的最后一片叶子进行追踪记录?
  • 问题1解决方案:在对堆进行插入和删除操作的时候需要将根结点与最后一片叶子结点进行交换位置。
  • 问题2:优先级队列的内容
  • 问题2解决方法:
    队列就是先进先出的一种形式,而优先级实际上就是根据某种标准进行排序,高级的就先排,对于相同级别的就根据先进先出的队列的要求进行排序,优先级队列也叫优先权队列。
    对于优先级队列的特点:
  1. 优先级队列是0个或多个元素的集合,每个元素都有一个优先权或值。
  2. 当给每个元素分配一个数字来标记其优先级时,可设较小的数字具有较高的优先级,这样更方便地在一个集合中访问优先级最高的元素,并对其进行查找和删除操作。
  3. 对优先级队列,执行的操作主要有:(1)查找,(2)插入,(3)删除。
  4. 在最小优先级队列中,查找操作用来搜索优先权最小的元素,删除操作用来删除该元素。
  5. 在最大优先级队列中,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。

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

  • 问题1:进行ArrayHeap的测试时,删除之后,后面总是多出来一个数字

  • 问题1解决方案:removeMin少写了一条语句,就是
    tree[count - 1] = null;

代码托管

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分)

  2. 模板中的要素齐全(加1分)

  3. 教材学习中的问题和解决过程, 3个问题加3分

  4. 代码调试中的问题和解决过程, 2个问题加2分

  5. 本周有效代码超过300分行的(加2分)

  6. 感想,体会不假大空的加1分

  7. 排版精美的加一分

  8. 进度条中记录学习时间与改进情况的加1分

  9. 有动手写新代码的加1分

  10. 课后选择题有验证的加1分

  11. 错题学习深入的加1分

  12. 点评认真,能指出博客和代码中的问题的加1分

  13. 结对学习情况真实可信的加1分

点评模板:

  • 博客中值得学习的或问题:
    • 排版很好
  • 代码中值得学习的或问题:
    • 代码增长量多,说明结对的同学这周很努力的在学习Java,我也要努力学习Java了
    • 仓库有点混乱

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积)
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90
第五周 1526/2986 2/9 20/115
第六周 837/3823 2/11 20/135
第六周 837/3823 2/13 20/135
第七周 1639/5462 2/15 20/155
第八周 1233/6695 2/17 20/175
第九周 1654/8349 2/19 20/195
第十周 819/9168 2/21 25/220
  • 计划学习时间:22小时

  • 实际学习时间:25小时

参考资料