Skip to content

Lec5 Binomial Heap

Lec5: Binomial Heap

二项树

k阶二项树 \(B_k\)

  1. 由两个k-1阶合并 根有k个儿子
  2. 满足堆的性质

  3. \(B_k\)的第\(d\)层有\(\binom{k}{d}\)个节点,一共\(2^k\)个节点 如B3:1 3 3 1

  4. 证明: \(\binom{k-1}{d}(绿色)+\binom{k-1}{d-1}(蓝色)=\binom{k}{d}\)

img

合并

代码实现上,用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

实现:

  1. \(O(\log n)\) 个二项树的根中找最小的一个
  2. 删除根,产生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)\)

Comments