【问题标题】:Real world applications of Binary heaps and Fibonacci Heaps [closed]二进制堆和斐波那契堆的实际应用 [关闭]
【发布时间】:2011-04-15 15:15:09
【问题描述】:

斐波那契堆和二叉堆的实际应用是什么?如果您可以在使用它解决问题时分享一些实例,那就太好了。

编辑:还添加了二进制堆。很想知道。

【问题讨论】:

  • “真实世界使用”似乎在问错误的问题,类似于“数组的真实世界用途是什么?”
  • 每个人都知道数组在现实世界中的用途!
  • 对比使用斐波那契堆的次数与您在整个编程生涯中使用数组的次数。
  • 相关:Has anyone actually implemented a Fibonacci heap efficiently?。执行摘要:二进制堆在大多数实际应用中的表现都优于斐波那契,除非底层图非常密集。这基本上是因为二进制堆可以使用数组有效地实现,但斐波那契堆是作为指针系统实现的。
  • @devnull:按照今天的网站标准,这是一种广泛的方式。我已经重新关闭它以反映这一点。

标签: algorithm data-structures binary-heap fibonacci-heap


【解决方案1】:

在现实生活中你很少会用到它。我相信斐波那契堆的目的是改善 Dijkstra 算法的渐近运行时间。对于非常非常大的输入,它可能会给您带来改进,但大多数时候,您只需要一个简单的二进制堆。

来自维基:

虽然一个总运行时间 操作顺序从 一个空结构由 上面给出的界限,一些(很少) 序列中的操作可以采取 完成时间很长(特别是 删除和删除最小值具有线性 最坏情况下的运行时间)。为了 这个原因斐波那契堆和其他 摊销数据结构可能不是 适用于实时系统。

二叉堆是一种数据结构,可用于快速找到一组值中的最大值(或最小值)。用于 Dijkstra 算法(最短路径)、Prim 算法(最小生成树)和 Huffman 编码(数据压缩)。

【讨论】:

  • 注意:斐波那契改进了摊销时间,而不是最坏的情况。而且二叉堆也有 O(1) 的平均值。
【解决方案2】:

优先级队列通常以堆的形式实现,例如:http://download.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html

使用二叉堆可以有效地从庞大的数据集中计算前 N 个元素(例如大型网站中的热门搜索查询)。

【讨论】:

    【解决方案3】:

    不能说斐波那契堆,但优先级队列中使用了二进制堆。优先级队列在实际系统中被广泛使用。

    一个已知的例子是内核中的进程调度。首先采用最高优先级的进程。

    我在集合的分区中使用了优先级队列。具有最大成员的集合将首先被用于分区。

    【讨论】:

      【解决方案4】:

      在大多数情况下,您必须根据以下复杂程度进行选择:

      • 插入
      • 寻找元素

      通常的嫌疑人是:

      • BST:log(n) 插入并查找
      • 链表:O(1)插入和O(n)查找
      • 堆:
        • O(1) 插入
        • O(1) 查找仅用于第一个元素,一般为O(n)
          • 二叉堆的最坏情况
          • 为斐波那契摊销

      还有Brodal queue 和其他堆达到O(1) 最坏的情况,但需要even larger queues 而不是斐波那契是值得的。

      因此,如果您的算法只需要“找到”第一个元素并进行大量插入,那么堆是一个不错的选择。

      正如其他人提到的,Dijkstra 就是这种情况。

      【讨论】:

        猜你喜欢
        • 2012-12-29
        • 2012-12-16
        • 2010-11-24
        • 2016-11-18
        • 2010-12-19
        • 2016-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多