# 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[2i + 2] 为第 i 个节点的右孩子节点。
优先队列
在多任务环境中,操作系统必须决定在若干进程中运行哪个进程。我们知道,有一些任务应当具有优先权,对这些特殊的应用似乎需要一类特殊的队列,称之为优先队列(priority queue)。
优先队列的实现如下:
-
链表,插入队头O(1), 删除最小的元素则需要遍历链表O(n) 另一个方法是让链表保持在排序的状态,这使得插入代价O(n),而deleteMin只需要O(1)
-
BST:二叉查找树 对于两种操作平均时间都是O(logN),但可能导致树的不平衡,用平衡树又显得过于麻烦
故优先队列使用二叉堆(binary heap)来实现。
代码调试中的问题和解决过程
代码托管
- 代码提交过程 & 代码量截图:
结对及互评
点评模板:
- 博客中值得学习的或问题:
其他
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | - | 1 | 10 | |
第二周 | - | 2 | 20 | |
第三周 | - | 3 | 30 | |
第四周 | - | 4 | 40 | |
第五周 | - | 5 | 50 |
-
计划学习时间:20小时
-
实际学习时间:10小时
-
改进情况: