“小规模可以完全算清:$n=3$ 时 $\lceil\log 2 6\rceil=3$,故任何比较排序最坏至少 $3$ 次比较;插入排序恰以最坏 $3$ 次完成三元素排序,说明该下界在小规模处…”
形式陈述 ​
二叉最小堆是同时满足两条不变量的树结构。形状不变量:它是完全二叉树,除最末层外各层填满,最末层从左连续填充。堆序不变量:每个结点的键不大于其孩子的键——这只约束每条父子边,给出的是位置间的偏序而非全序,但沿根到结点的路径传递即知最小键必在根。完全形状使堆可用数组隐式存储:下标从
其中高度恰为
直觉
若目标只是反复取出最小元,维护完整排序纯属浪费:排序确定所有元素对的相对次序,而我们每次只需要知道“谁最小”。堆的设计哲学是维护恰好够用的最少秩序——只约束父子、不约束兄弟,全局最小自动浮到顶端,其余次序悬而不决、按需再定。完全二叉树的形状则同时买到两件事:高度恰为
例子与边界
数组
边界之一:堆不是搜索结构。兄弟子树之间没有任何次序关系,查找给定键最坏要看
推论与应用
二叉堆是优先队列 ADT的一种实现,而非该接口本身:在数组 RAM 模型中,它给出最坏 find-min、最坏 insert、delete-min 与已定位元素的 decrease-key。两个二叉堆若直接拼接后重建,meld 需要
它直接服务于 Dijkstra 算法与 Prim 算法的“取当前最小候选”主循环、Huffman 编码的反复合并最小权对,以及事件驱动模拟与任务调度。Fibonacci 堆用更复杂的延迟整理换取摊还 insert、meld 与 decrease-key,但 delete-min 仍为摊还
参考资料
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 6, heaps, priority queues, and linear-time build。
- Robert Sedgewick and Kevin Wayne, Algorithms, 4th ed., Addison-Wesley, 2011,§2.4, priority queues and heaps。