关于数据结构:Fibonacci堆或Brodal队列在实践中用于任何地方吗?

Are Fibonacci heaps or Brodal queues used in practice anywhere?

斐波那契堆在实践中是否在任何地方使用?我环顾四周,找到了相关问题的答案(见下文),但没有什么能真正回答这个问题。

  • Fibonacci堆有很好的实现,包括标准库,如Boost C++。这些库包含fibonacci堆的事实表明它们在某个地方一定有用。
  • 我们知道,要使斐波那契堆在实践中更快地运行,需要满足某些条件:"要从实践中的斐波那契堆中获益,您必须在减少键的频率非常频繁的应用程序中使用它们";"要使斐波那契堆真正发光,您需要以下任一情况:a)昂贵的比较:斐波那契堆最小化e组织数据所需的比较数。b)大多数操作是updatekey/insert/delete。当斐波那契将更新"分组"到下一个extractmin时,"批"越大,它得到的效率就越高。"
  • 有一种称为"brodal队列"的数据结构,我不确定以前我听说过这种结构,它的时间复杂性行为至少和fibonacci堆一样好。这是一个很好的表,其中比较了不同堆类型的各种操作的时间复杂性。
  • 关于斐波那契堆或二项式堆是否有任何应用的问题,回答者只给出了二项式堆的例子。

  • 据我所知,没有真正使用fibonacci堆或brodal队列的主要应用程序。

    斐波那契堆最初的设计是为了满足理论而不是实际的需要:渐进地加速Dijkstra的最短路径算法。Brodal队列(以及相关的功能数据结构)的设计类似于满足理论保证,特别是回答一个长期存在的开放性问题,即是否可以将Fibonacci堆的时间界限与最坏情况的保证相匹配,而不是采用摊余保证。从这个意义上说,数据结构的开发并不是为了满足实际需要,而是为了推动我们对算法效率极限的理论理解。据我所知,目前还没有一种算法可以更好地在斐波那契堆上使用brodal队列。

    正如其他答案所指出的,隐藏在斐波那契堆或布罗达尔队列中的常量因子非常高。它们需要在许多复杂的链表中连接许多指针,因此具有绝对糟糕的引用位置,特别是与标准二进制堆相比。这意味着,考虑到缓存效果,它们在实践中的性能可能更差,除非您有需要大量减少密钥操作的算法。有些情况下会出现这种情况(例如,链接的答案会讨论其中的一些),但将它们视为高度专门化的环境,而不是普通的用例。如果您正在处理大型图,则更常见的是使用其他技术来提高效率,例如对手头的问题使用近似算法、更好的启发式方法或使用基础数据的特定属性的算法。

    希望这有帮助!