Algorithm 二进制堆和斐波那契堆的实际应用

Algorithm 二进制堆和斐波那契堆的实际应用,algorithm,data-structures,binary-heap,fibonacci-heap,Algorithm,Data Structures,Binary Heap,Fibonacci Heap,斐波那契堆和二进制堆的实际应用是什么?如果你能分享一些你用来解决问题的例子,那就太好了 编辑:还添加了二进制堆。好奇地想知道。在现实生活中,你很少使用它。我相信Fibonacci堆的目的是改进Dijkstra算法的渐进运行时间。它可能会为非常非常大的输入提供改进,但大多数情况下,您只需要一个简单的二进制堆 从维基: 虽然 从开始的操作顺序 空结构以 上面给出的边界,一些(很少) 序列中的操作可能需要 需要很长时间才能完成(特别是 删除和删除最小值具有线性关系 最坏情况下的运行时间)。对于 这就是

斐波那契堆和二进制堆的实际应用是什么?如果你能分享一些你用来解决问题的例子,那就太好了


编辑:还添加了二进制堆。好奇地想知道。

在现实生活中,你很少使用它。我相信Fibonacci堆的目的是改进Dijkstra算法的渐进运行时间。它可能会为非常非常大的输入提供改进,但大多数情况下,您只需要一个简单的二进制堆

从维基:

虽然 从开始的操作顺序 空结构以 上面给出的边界,一些(很少) 序列中的操作可能需要 需要很长时间才能完成(特别是 删除和删除最小值具有线性关系 最坏情况下的运行时间)。对于 这就是斐波那契堆和其他 摊销数据结构可能不可用 适用于实时系统


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

优先级队列通常以堆的形式实现,例如:


使用二进制堆(例如,大型网站中的顶级搜索查询)可以有效地计算庞大数据集中的前N个元素。

不能说明斐波那契堆,但二进制堆用于优先级队列中。优先级队列广泛应用于实际系统中

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


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

在大多数情况下,您必须根据以下各项的复杂性进行选择:

  • 插入
  • 寻找元素
通常的嫌疑犯是:

  • BST:
    日志(n)
    插入并查找
  • 链表:
    O(1)
    insert和
    O(n)
    find
  • 堆:
    • O(1)
      insert
      • 二进制堆的平均值,请参阅:)
      • 按斐波那契摊销。这比平均水平强,比最坏情况弱
    • O(1)
      仅查找第一个元素的
      O(n)
      • 二进制堆的最坏情况
      • 斐波那契摊销
在最坏的情况下,还有达到
O(1)
的堆和其他堆,但需要比斐波那契更值得

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


正如其他人所提到的,Dijkstra就是这样。

“真实世界的使用”似乎提出了错误的问题,类似于“阵列的真实世界的使用是什么?”每个人都知道阵列的真实世界的使用!对比在整个编程过程中使用斐波那契堆的次数和使用数组的次数。相关:。执行摘要:在大多数实际应用程序中,二进制堆的性能优于斐波那契(Fibonacci),除非底层图非常密集。这基本上是因为二进制堆可以使用数组有效地实现,而斐波那契堆是作为指针系统实现的。@devnull:按照今天的站点标准,这是一种非常广泛的方法。我关闭它是为了反映这一点。注:斐波那契改进了摊销时间,而不是最坏的情况。二进制堆也有O(1)个平均值。