“最小生成树与贪心给出正确性,优先队列只负责实现“当前最轻接入边”。在静态邻接表的比较/RAM 模型中,二叉堆给确定性最坏 $O(E\log V)$;Fibonacci 堆利用摊还 $O(1)…”
结构与接口 ​
作为一种可合并优先队列,Fibonacci 堆用一组满足父键不大于子键的有根树表示状态。所有根放在双向循环链表中,并维护最小根指针;节点记录 degree、parent、child 和 mark。insert 添加单节点根,meld 拼接根链表,二者实际
decrease-key
势能分析 ​
取
其中
degree 上界 ​
节点每增加一个孩子,已有孩子按被链接时的 degree 递增;每个非根最多失去一个孩子而不被切断。由此 degree 为
级联切断例子与边界 ​
设非根节点
所有界都是摊还界;单次 delete-min 可处理许多根。复杂指针和缓存局部性使二叉堆在只需 push/pop 的程序中常更快。Dijkstra 的理论改善依赖大量有效 decrease-key,不能只看渐近表就断言工程优势。
完整成本表与删除 ​
make-heap、find-min、insert、meld 的最坏实际成本为
Consolidation 使用按 degree 索引的临时数组,数组长度来自 degree bound。链接同度根时较小键成为父,另一根失去根身份并清 mark;遗漏清 mark 会让势能和级联语义同时出错。最小指针在根表重建过程中也必须重新扫描更新。
从接口到 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., Ch. 19.