Fibonacci Heaps

绪论

Fibonacci Heaps和Complete Heaps一样都是优化版本的堆。Complete Heaps是通过完全二叉树的简单性质来避免堆出现糟糕的退化情况,实际上在一般(最优)情况下各操作的复杂度和一般堆是一样的。

Fibonacci Heaps的优化结合了lazy操作(懒惰标记),散列的一些思想和Fibonacci数的数学性质,在树的结构上不要求一昧的维持平衡(可能也维持了,只是我没有理解),在操作上可以将union(合并),insert(插入),decrease-key(修改某个元素的key值)这三个操作的均摊时间复杂度降低到O(1)。

(decrease-key在国内的教材中往往不做介绍,C++编译器的priority_queue也没有提供这个函数)

在这里插入图片描述

所以Fibonacci Heaps在使用优先队列需要进行多次队列中key值修改的算法方面可以做到很好的优化,例如Prim算法,不过我们能够找到的用优先队列实现的普利姆算法,往往用另外的操作(详情见其他文章)替代了修改队列中key值的那一步,对于decrease-key操作这方面介绍的就比较少甚至没有。


Fibonacci Heaps

Fibonacci Heaps从结构上看若干个堆组成的森林,各个堆的堆顶也就是所在堆优先级最高(低)的元素构成的链表。

在这里插入图片描述

用一个min指针始终指向堆顶结点构成的链表中优先级最高(低)的元素,即整个Fibonacci Heaps优先级最高(低)的元素。

在这里插入图片描述

树中有如下属性:

n表示堆中结点的总个数;rank(x)表示结点x的孩子个数,在还没有进行过lazy标记的情况下,我们尽可能地希望链表中结点的rank值各不相同,在每次extract_min操作中进行调整,可以容忍多个结点rank值为0的情况;trees(H)为森林中树的个数,即链表中结点的个数;marks表示堆中

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值