Lec5 Binomial Heap
Lec5: Binomial Heap
二项树
k阶二项树 \(B_k\)
- 由两个k-1阶合并 根有k个儿子
满足堆的性质
\(B_k\)的第\(d\)层有\(\binom{k}{d}\)个节点,一共\(2^k\)个节点 如B3:1 3 3 1
- 证明: \(\binom{k-1}{d}(绿色)+\binom{k-1}{d-1}(蓝色)=\binom{k}{d}\)
合并
代码实现上,用left child right sibling的方式存储
二项队列
二项队列(Binomial Queue)是一系列二项树(Binomial Tree)的集合,其中每个二项树的阶数k不同。
因为每个二项树有且仅有\(2^k\)个节点,所以构造n个节点的二项队列可以把n用二进制表示,拆成\(O(\log n)\)个二项树
meld(合并)
类比二进制加法,找到n1,n2的二进制表示。从小到大,两个\(B_k\)合并得到\(B_{k+1}\),继续合并
delete min
实现:
- 在\(O(\log n)\) 个二项树的根中找最小的一个
- 删除根,产生k个新的子树。每个子树都是二项树(\(B_0,B_1\dots B_{k-1}\)) , 再跟剩下的部分合并
decrease key
定义: 把\(x\)的值减少为\(k\) (应用: dijkstra更新dist值)
实现: 不断跟父亲交换,直到满足堆性质
复杂度\(O(\log n)\)
复杂度分析
插入是\(O(1)\), extract-min和delete-min是\(O(\log n)\)
插入的势能分析
斐波那契堆
insert和extract-min和二项队列一样
decrease key \(O(1)\)