堆的进化之旅3-Binomial Heap二项式队列


堆的进化之旅的分支——二项式队列。
为记录算法研讨课精彩报告而生。

Binomial Heap

二项式队列

OperationLinked ListBinary HeapBinomial Heap
PushO(1)O(log n)O(1) amortized
Pop_minO(n)O(log n)O(log n)
Decrease_keyO(1)O(log n)O(log n)

经过了14年的沉寂,Jean Vuillemin在自己的论文中终于进一步取得了突破,他创造性的提出了二项式堆这一数据结构,这启发了接下来10年人类在这一问题领域上的进步,成功的在平摊分析的情况下使得push操作的算法复杂度降到了O(1)

这是一个怎样神奇的数据结构呢?他类似于二叉堆,但它是二项式树集合,大家可以看图,每个根节点度数从0到log n依次排列,对于一颗度数为 k 的树,根节点有 k 个孩子,整棵树有 2^k 个节点,同时树的高度为 k,根节点的孩子也是二进制树,它们的度数分别为 k-1, k-2, … … 1, 0,每一度数只有1棵相应的二项式数对应(也就是说,不存在度数相同的两棵树),这就是二项式堆名称的由来。在二项式堆当中,当插入一个新的节点键值时,首先放在根链表当中,若其度数在根链表当中不唯一,进行merge操作以维持二项式堆的特性,所以我们看到二项式堆的形状是固定的。这一push操作通过平摊分析,最终只有O(1)的时间复杂度,这是整个算法提升的主要原因。

Push

在这里插入图片描述
Push : 把顶点4插入根列表中;
Merge : 合并操作,以3、4为顶点的树的度数均为0,合并它们,比较根节点大小,取小的那个作为新的父亲节点。

Decrease key

在decreasekey操作当中,若更新节点键值之后,不满足父节点键值小于等于子节点键值,则向上冒泡。
在这里插入图片描述
Decrease key : 顶点12关键字减小到2,不符合堆有序(小于父亲节点3),那么向上进行冒泡,和顶点3交换即可。

Pop_min

在pop_min操作当中,弹出最小节点之后,将此节点的孩子节点提升到根节点的链表上,若有度数相同的树,则进行合并操作,以这个图为例:。。。pop_min操作的第一步在根链表当中寻找最小元素,因为不存在度数相同的两棵树,所以根链表中的根节点只有log n个,又因为根节点键值无序排列,是所以要遍历整个根链表,所以复杂度是O(log n);第二步是promote孩子节点,此时最坏情况是度数最大的一棵树的根节点恰好是我们要找的最小元素,它的孩子节点<=log n,所以这一步的复杂度是O(log n);最后一步是合并度数相同的树,当有log n棵树时,最多合并log n-1次,每合并一次,时间复杂度是O(1),所以这一步的复杂度也是O(log n),故整体复杂度为O(log n)
在这里插入图片描述
Pop_min : 先遍历根列表找到最小根节点1,把1原来的孩子1, 6, 5(子树)提升到根列表上来,从头开始遍历跟列表,合并度数相等的树,以顶点6,3为根节点的树需要合并,接下来合并以顶点3,1为根节点的树。

在这里插入图片描述
这就是二项式堆当中的节点结构,包含指向父亲、孩子的指针,里面的是一些在Dijkstra算法中,为解决实际问题而创造的一些标记。。右边这张图是节点连接在一起形成的二项式堆。

Fibonacci Heap

在我的博客里找

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值