一、为什么学斐波那契堆?
Mermaid · 渲染中(下方为源码)
graph LR A[堆有序树集合] --> B[insert/merge O(1)] A --> C[decrease-key O(1) 摊还] A --> D[extract-min O(log n)]
斐波那契堆是"惰性"堆,把多次 decrease-key 的代价摊还到 extract-min。理论复杂度极佳:
| 操作 | 二叉堆 | 斐波那契堆 |
|---|---|---|
| insert | O(log n) | O(1) |
| extract-min | O(log n) | O(log n) 摊还 |
| decrease-key | O(log n) | O(1) 摊还 |
| merge | O(n) | O(1) |
这让 Dijkstra / Prim 的 O(E log V) 优化到 O(E + V log V)(用 decrease-key 版)。
二、结构
- 一组堆有序树的根用双向循环链表连接
- 每个节点记 degree(孩子数)、mark(是否被切过)
- 维护指向最小根的指针
三、核心思想
- insert / merge:直接挂到根链表,O(1)
- :减小后若违反堆序,把该节点"切下"到根链表(级联切断被 mark 的父)