- heaps
堆:并非一对杂乱无章的结构, 堆是一种存在特殊关系的树。
是一种半排序的树, 所有的父节点大于子节点(max heaps) 或 所有的父节点小于子节点(min heaps)。上图为max heaps. 满足二叉树结构的推叫做, binary heaps. - 特点
这种结构有别于BST, 它是一种层与层有特殊关系的数, 如果是max heaps更贴近于家谱图。如上图, 9必须大于所有子孙节点, 因为所有子孙节点是9的后代, 但其子孙却没有固定的关系, 比如, 6 必须满足小于7, 因为是7的孩子, 但不一定必须小于2或者5, 因为不是直系关系。
有了这种特殊的结构, 使得堆有许多好的算法, 比如堆排序, 优先队列这样最常用的高级算法。 - binary heaps 区别于 BST
上图均为堆, 但都不是BST - 插入操作
4.1 按照中序二叉树的顺序插入
4.2 交换元素直到插入元素满足二叉堆结构。
最终为
可见最多用log(n)的操作便完成了堆的插入。 - 删除操作
5.1 删除堆的最大元素, 即为堆顶元素
5.2 用堆的最下层,最右边元素交换。
5.3 堆顶元素和其大的孩子交换, 这样才能满足堆结构
这样同样最多用log(n)的操作便完成了堆顶元素的删除。 - 数据结构表示
6.1 堆的这种结构可以很好的用数组表示, 如果已知第一个和最后一个元素以及堆的大小, 完全可以通过数学, 计算出所有元素的位置下表。为了方便计算第一个元素小标为1.
6.2 这样可以完成堆的插入和删除操作。 - 优先队列
把堆放在数组中, 便是优先队列的应用, 这样可以完成元素的插入, 但在删除元素时, 总是删除最小或最大的元。同时这样可以完成堆排序。
相关文章: