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

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

教材学习内容总结

学习目标

  • 理解堆和优先队列
  • 理解堆和优先队列的关系
  • 掌握堆的实现
  • 掌握堆排序的实现
  • 分析Java Collections API中堆和相关的类

学习内容

** 堆 ** 是具有以下性质的二叉树:

(1)它是一棵完全二叉树(即树上所有节点都是满的,除了最后一层的节点外,且最后一层的叶子节点都是尽可能靠左的);

(2)父节点的键值总是和任何一个子节点的键值保持固定的大小关系,且每个节点的左子树和右子树都是一个二叉堆。

当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆;当父节点的键值总是小于等于任何一个子节点的键值时为最小堆。二叉堆可应用于堆排序、优先级队列、图算法等。

二叉堆通常用数组来表示,如果树根节点为 arr[0],那么有以下性质:
(1)arr[i/2] 为第 i 个节点的父节点;
(2)arr[2i + 1] 为第 i 个节点的左孩子节点;
(3)arr[2
i + 2] 为第 i 个节点的右孩子节点。

优先队列

在多任务环境中,操作系统必须决定在若干进程中运行哪个进程。我们知道,有一些任务应当具有优先权,对这些特殊的应用似乎需要一类特殊的队列,称之为优先队列(priority queue)。

优先队列的实现如下:

  • 链表,插入队头O(1), 删除最小的元素则需要遍历链表O(n) 另一个方法是让链表保持在排序的状态,这使得插入代价O(n),而deleteMin只需要O(1)

  • BST:二叉查找树 对于两种操作平均时间都是O(logN),但可能导致树的不平衡,用平衡树又显得过于麻烦

故优先队列使用二叉堆(binary heap)来实现。

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

代码托管

  • 代码提交过程 & 代码量截图:
  • 2017-04-30.png

结对及互评

点评模板:

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

其他

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 - 1 10
第二周 - 2 20
第三周 - 3 30
第四周 - 4 40
第五周 - 5 50
  • 计划学习时间:20小时

  • 实际学习时间:10小时

  • 改进情况:

参考资料

posted @ 2017-11-05 23:14  20162308马平川  阅读(180)  评论(3编辑  收藏  举报