Skip to content

模型Model

可并优先队列

施工中 · 内容逐步修订

Meldable priority queue · Mergeable heap

把 meld 与句柄更新纳入优先队列接口,并区分具体堆结构的保证类型。

形式陈述 ​

接口层 ​

优先队列接口扩展为 make-heap、find-min、insert、meld、decrease-key 和 delete-min。Meld 把两个队列中的全部元素合为一个队列,并按契约消费旧队列或产生新对象;避免逐个搬运是常见的性能目标,不是这项功能语义自动附带的成本承诺。decrease-key 通常接收稳定句柄,否则重复键无法定位对象。

接口不承诺成本。在不触发底层数组搬迁时,二叉堆最小查询为最坏 O(1)、插入删除为最坏 O(log⁡(n+1)),拼接后重建的 meld 为 Θ(n1+n2);动态扩缩容的更新界须改为相应摊还界。二项堆、Fibonacci 堆与 pairing heap 有不同最坏或摊还表。“decrease-key 为 O(1)”必须注明结构和摊还含义。

直觉

可并优先队列把两批有序竞争者的合并当作一级操作,而不是逐元素重新插入。不同堆结构只是在“何时整理同阶树或恢复秩不变量”上分配成本:立即整理给出直接最坏界,延迟整理则用势能换取便宜 meld 与 decrease-key。

Meld 与稳定句柄
例子与边界

事件队列合并 ​

两个模拟器各维护事件堆,组件连接后需合并队列。数组堆拼接后线性 heapify 适合偶发合并,却不支持频繁亚线性 meld;树形堆可连接根表,把整理延后到 delete-min。

Meld 后外部句柄仍须有效。复制节点或重新编号会使句柄悬空。重复优先级要把键与对象身份分开,稳定性也不是 ADT 自动提供。

工程边界 ​

只需 push/pop 且缓存局部性重要时,二叉堆常更快。持久化、并发与最坏延迟是额外轴,不能从“可并”推出。

Dijkstra 若用“插入新距离、弹出时忽略旧条目”代替稳定句柄上的 decrease-key,正确性可以保留,但堆大小与操作序列已改变。比较理论界或内存占用时,必须注明采用哪一种接口实现。

操作语义与句柄生命周期 ​

Insert 返回指向逻辑节点的句柄;meld 后句柄仍必须定位同一对象;decrease-key 修改键并恢复堆序;delete 可通过 decrease 到负无穷再 delete-min,前提是键域允许哨兵,否则需要原生删除。重复键时句柄而非键值区分对象。

两个二项堆根阶分别为 (0,2) 与 (0,1)。归并后阶 0 两棵连接成阶 1,随后两个阶 1 连接成阶 2,再与原有阶 2 连接成阶 3;最终大小 5+3=8 的堆只含一棵阶 3 树。每次连接都由根键较小者成为父。这个过程像二进制加法,根表最终每阶至多一棵,节点数的二进制表示决定树阶集合。

推论与应用

可并堆常把结构整理延迟到 delete-min 或关键切割,因而需要摊还分析区分单次尖峰与长期操作序列成本。接口支持 meld 不等于 meld、decrease-key 与 delete-min 都有相同保证。

Pairing Heap以多叉堆和配对合并实现 meld、insert 与 delete-min,代码短且常有良好局部性能。它与 Fibonacci 堆共享可并接口,却不共享所有已知摊还界,尤其不能只凭相似的切割操作宣称同样的 decrease-key 理论保证。

成本来源 ​

二项堆 meld 扫 O(log⁡n) 个阶;Fibonacci heap 只拼接根链表,实际最坏为 O(1),把同阶合并延迟到 delete-min。势可取“根数加两倍标记节点数”:decrease-key 的级联切割增加根却清除标记,摊还常数;delete-min 的 consolidation 减少大量根,支付扫描。

上述 decrease-key 与 delete-min 的费用由摊还分析控制;根表拼接的 meld 则已经是实际常数时间。要求每次 delete-min 最坏对数时需选择提供该保证的结构,例如经典二项堆;只写“Fibonacci heap 操作更快”会掩盖延迟清理和缓存局部性。

选择边界 ​

Dijkstra 中 decrease-key 多,理论改进可能重要;事件模拟只有 insert/delete-min 时,数组堆连续存储常更快。Pairing heap 代码简单、实测好,但部分 decrease-key 理论界与 Fibonacci heap 不同。接口相同不表示保证表相同。

参考资料
  • Michael L. Fredman and Robert Endre Tarjan, “Fibonacci Heaps and Their Uses in Improved Network Optimization Algorithms,” Journal of the ACM 34(3), 1987, pp. 596–615.
  • Robert Endre Tarjan, Data Structures and Network Algorithms, Society for Industrial and Applied Mathematics, 1983.
  • Michel X. Goemans, Fibonacci Heaps, MIT 6.854J/18.415J Advanced Algorithms, Fall 2008, lecture notes.
关系图谱7 个相邻概念 · 4 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

上位 / 更一般

下位 / 直接特例

暂未标注直接特例。

类型化关系