绪论
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

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

被折叠的 条评论
为什么被折叠?



