Skip to content

模型Model

二叉堆

Binary heap

用完全二叉树形状与父子堆序维护极值、常以数组隐式表示的数据结构。

形式陈述 ​

二叉最小堆是一棵满足形状与堆序不变量的二叉树,也允许用空树表示空堆。非空时,除最末层外各层填满,最末层从左连续填入,形成完全二叉树。键取自一个全序空间,每个父键不大于其孩子的键;沿根到任一节点的路径传递,便知根键最小。兄弟节点或不同子树之间无须有序。

完全形状使堆可用数组隐式存储。下标从 1 起时,节点 i 的父节点为 ⌊i/2⌋,孩子位置为 2i 与 2i+1;仅在下标不超过堆大小时,孩子才存在。插入先追加新项,再与父节点比较并上浮;删除最小项先保存根,把末项移到根并缩小堆区,再反复与较小孩子交换下沉。大小为零时,读取或删除最小项必须按接口报告失败。

这些修复各走一条高度为 O(log⁡(n+1)) 的路径。在比较、交换和数组访问均为常数成本,且本次调用不触发存储区搬迁时,读取最小项为最坏 O(1),插入、删除最小项为最坏 O(log⁡(n+1))。几何扩容的数组可能使某次插入花费 Θ(n);若删除还会缩容,也须计入复制成本。

自底向上建堆 ​

Floyd 法按下标从 ⌊n/2⌋ 到 1 对每个内部节点下沉。处理一个节点前,它的两个孩子子树已经是堆,下沉只修复当前根,因而反向扫描结束后整棵树满足堆序。

下沉的工作与节点高度成正比,再加每个处理节点的常数开销。完全二叉树中,高度至少为 h 的节点至多有 ⌊n/2h⌋ 个;把每个节点的高度拆成逐层贡献,得到

∑vheight(v)=∑h≥1#{v:height(v)≥h}≤∑h≥1⌊n2h⌋<n.

因此建堆总时间为 O(n)。这个求和利用大多数节点靠近叶层的事实,不能把所有节点都按根的高度收费。

直觉

若目标只是反复取出最小元,维护完整排序纯属浪费:排序确定所有元素对的相对次序,而我们每次只需要知道“谁最小”。堆的设计哲学是维护恰好够用的最少秩序——只约束父子、不约束兄弟,全局最小自动浮到顶端,其余次序悬而不决、按需再定。完全二叉树的形状则同时买到两件事:高度恰为 ⌊log2⁡n⌋,保证上浮与下沉的路径短;结点位置可由下标算术算出,省掉指针并获得连续内存的紧凑与局部性。

下图采用从 0 开始的数组下标,因此上浮路径为 6→2→0;换成形式陈述中的一基下标就是 7→3→1。两种编号描述同一条父链,使用时应连同父子下标公式一起转换。

二叉堆上浮示意图
例子与边界

数组 [1,3,2,7,5,8] 是合法最小堆:逐对检查 1≤3、1≤2、3≤7、3≤5、2≤8 即可,而数组本身并未排序(3 排在 2 之前)。执行一次删除最小值:末元素 8 移到根得 [8,3,2,7,5];8 与较小的孩子 2 交换得 [2,3,8,7,5];此时 8 位于下标 3,孩子下标 6,7 超界,下沉结束,堆序恢复。

堆只保存父子之间的次序。查找任意给定键时,最坏需要检查 O(n) 个节点;若要快速定位并修改优先级,应额外维护元素身份或句柄到下标的映射,并在交换后同步更新。重复键不能单独充当元素身份。

反复插入与自底向上建堆有不同成本。按递减序把互异键插入最小堆,每个新键都会上浮到根,总成本为 Θ(nlog⁡n);Floyd 法则使用上面的节点高度求和,在线性时间内完成。

把全部比较方向反转,就得到对称的最大堆。二叉搜索树使用另一种不变量,约束整棵左、右子树的键范围;它的导航规则不适用于只维护父子堆序的结构。

推论与应用

二叉堆是优先队列 ADT的一种实现,而非该接口本身:在上述无搬迁的数组 RAM 模型中,它给出最坏 O(1) find-min、最坏 O(log⁡(n+1)) insert、delete-min 与已定位元素的 decrease-key。若底层使用几何扩容并以适当滞回阈值缩容,则更新仍为摊还 O(log⁡(n+1)),但某次搬迁不是最坏对数时间。两个二叉堆若直接拼接后重建,meld 需要 O(n1+n2),因此它可以兑现可合并优先队列的功能接口,却不提供亚线性的合并成本;是否要求这种成本须由契约另行规定。

它直接服务于 Dijkstra 算法与 Prim 算法的“取当前最小候选”主循环、Huffman 编码的反复合并最小权对,以及事件驱动模拟与任务调度。Fibonacci 堆用更复杂的延迟整理换取摊还 O(1) 的 insert、meld 与 decrease-key,但 delete-min 仍为摊还 O(log⁡n);这张成本表不能覆盖回二叉堆。取最大二叉堆反复把根与堆尾交换、缩小堆区并下沉修复,即得原地堆排序:采用迭代下沉时,最坏 O(nlog⁡n) 时间、O(1) 辅助空间。

参考资料
  • 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。

  • Robert Sedgewick、Kevin Wayne,Algorithms, 4th ed., Addison-Wesley, 2011,MinPQ 实现契约:明确将动态数组搬迁计入更新的摊还界。

关系图谱14 个相邻概念 · 5 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置

上位 / 更一般

下位 / 直接特例

暂未标注直接特例。

类型化关系