文章目录
day61
第十章 优先级队列
10.a
10.a1 需求与动机
10.a2 基本实现
实现:考虑 efficiency + cost(效率+成本)
杀鸡焉用牛刀
10.b
10.b1 完全二叉堆结构
Complete Binary Heap
10.b2 完全二叉堆插入与上滤
这一过程,即所谓的上滤(percolate up)
在上滤时先将e暂存起来,直到找到e的最终位置,再赋值e,可以降低常数复杂度。
比较操作的复杂度也可以进一步改进。
可以证明,在常规分布下,每个节点上升的平均高度,是常数O(1)。
10.b3 完全二叉堆删除与下滤
comparsion的比较复杂度在多叉堆(d-heap)中将会变得至关重要。
10.b4 完全二叉堆: 批量建堆
|n/2| - 1 为最末尾的内部节点的秩
调整顺序,内部节点由下向上,由右向左
Floyd算法(方法2):高收入者多纳税(金字塔高层节点少,高度height高);低收入者多纳税(金字塔底层节点多,高度height低)
10.c
10.c 堆排序算法
反复的交换,下滤
10.xa
10.xa1 左式堆:结构
方法二令人不满意之处:Floyd算法是基于完全无序的向量构建堆,但是我们现在的向量是前面一部分有序,后面一部分有序,Floyd算法不能很好的利用这个有序性。左式堆正是解决这个问题很好的答案。
堆序性才是堆结构的本质要求
10.xa1 左式堆合并
合并是围绕右侧链进行的,前面有提到rChain = O(logn),所以合并的时间复杂度为O(logn)
C.A.Crane是上面merge算法的发明者,同时他对对AVL树也给出了高效的合并算法