Fibonacci Heaps

Fibonacci Heaps是一种优化的堆数据结构,通过结合懒惰操作、散列和Fibonacci数的特性,提供O(1)的insert、union和decrease-key操作。其结构由多个堆组成的森林,通过min指针指向优先级最低的元素。Fibonacci Heap的extract_min操作具有O(rank)复杂度,而decrease-key操作在平均情况下保持O(1)。由于其高效的操作,特别适用于需要频繁修改key值的算法,如Prim算法。
摘要由CSDN通过智能技术生成

绪论

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值