Fibonacci堆在实践中用于任何地方吗?我一直在寻找SO并找到相关问题的答案(见下文),但实际上并没有回答这个问题。
答案 0 :(得分:17)
据我所知,没有主要的应用程序实际使用Fibonacci堆或Brodal队列。
Fibonacci堆最初设计用于满足理论而非实际需要:渐进地加速Dijkstra的最短路径算法。 Brodal队列(和相关的功能数据结构)的设计类似,以满足理论上的保证,特别是回答一个长期存在的问题,即是否有可能将斐波那契堆的时限与最坏情况保证相匹配,而不是摊销保证。从这个意义上讲,数据结构并不是为满足实际需求而开发的,而是为了推动我们对算法效率极限的理论理解。据我所知,目前还没有算法在Fibonacci堆上使用Brodal队列实际上更好。
正如其他答案所指出的,隐藏在Fibonacci堆或Brodal队列中的常数因子非常高。它们需要大量指针连接在许多复杂的链表中,因此,具有绝对可怕的引用局部性,特别是与标准二进制堆相比。这意味着除非您的算法需要大量的减少键操作,否则它们在实践中可能会在缓存效果方面表现更差。在某些情况下会出现这种情况(例如,链接的答案会讨论其中的一些),但将它们视为高度专业化的情况,而不是常见的用例。如果您正在处理大型图形,则更常见的是使用其他技术来提高效率,例如使用近似算法来解决当前问题,更好的启发式算法或使用基础数据特定属性的算法。
希望这有帮助!