二进制堆和Fibonacci堆的实际应用

时间:2010-09-22 09:21:19

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

Fibonacci堆和二进制堆的真实应用是什么?如果你可以在用它来解决问题时分享一些实例,那就太好了。

修改:还添加了二进制堆。很想知道。

4 个答案:

答案 0 :(得分:17)

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

来自维基:

  

虽然总的运行时间   以...开头的操作顺序   一个空的结构受到了   上面给出的界限,一些(很少)   序列中的操作可以采取   很长时间才能完成(特别是   删除和删除最小有线性   在最糟糕的情况下运行时间)。对于   这个原因斐波纳契和其他   摊销的数据结构可能不是   适用于实时系统。

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

在大多数情况下,您必须根据以下因素进行选择:

  • 插入
  • 寻找元素

通常的嫌疑人是:

  • BST:O(1)插入并找到
  • 链接列表:O(n) insert和O(1) find
  • 堆:
    • O(1)插入
    • O(n)一般只查找第一个元素的 O(1)
      • 二进制堆的最坏情况
      • 以斐波那契摊销

还有Brodal queue和其他堆达到select *, (s.qty-d.qty) as available from stock s LEFT JOIN damage d on d.item_name=s.item_name where d.qty IS NOT NULL 最坏情况,但需要even larger queues而不是斐波那契值得。

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

正如其他人所说,Dijkstra就是这种情况。