“Fibonacci 堆给出 $O(m+n\log n)$ 摊还时间;”
形式陈述 ​
结构与接口 ​
作为一种可合并优先队列,Fibonacci 堆用一组满足父键不大于子键的有根树表示状态。所有根放在双向循环链表中,并维护最小根指针;节点记录 degree、parent、child 和 mark。insert 添加单节点根,meld 拼接根链表,二者实际
decrease-key
势能分析 ​
取
其中
degree 上界 ​
节点每增加一个孩子,已有孩子按被链接时的 degree 递增;每个非根最多失去一个孩子而不被切断。由此 degree 为
直觉
Fibonacci 堆把原本每次更新都做的整理延迟到 delete-min:新增根暂不合并,减键只切断已经第二次失去孩子的松弛节点。根数和 mark 数记录了尚未偿还的结构债务;consolidation 与级联切断真正发生时,势能下降支付这批延迟工作。
例子与边界
级联切断例子与边界 ​
设非根节点
所有界都是摊还界;单次 delete-min 可处理许多根。复杂指针和缓存局部性使二叉堆在只需 push/pop 的程序中常更快。Dijkstra 的理论改善依赖大量有效 decrease-key,不能只看渐近表就断言工程优势。
完整成本表与删除 ​
make-heap、find-min、insert、meld 的最坏实际成本为
Consolidation 使用按 degree 索引的临时数组,数组长度来自 degree bound。链接同度根时较小键成为父,另一根失去根身份并清 mark;遗漏清 mark 会让势能和级联语义同时出错。最小指针在根表重建过程中也必须重新扫描更新。
推论与应用
Fibonacci 堆的常数摊还 decrease-key 依赖势能法:根数与标记节点数储存延迟合并和级联切割的信用,delete-min 再释放势能支付 consolidation。
从接口到 Dijkstra 的成本 ​
若一轮 delete-min 前有 decrease-key 延迟的整理工作,所以单次 delete-min 虽可能扫描许多根,摊还仍为
代入邻接表 Dijkstra:
参考资料
- Michael Fredman, Robert Tarjan, Fibonacci Heaps and Their Uses in Improved Network Optimization Algorithms, JACM, 1987.
- Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, Ch. 19.