Fibonacci堆和二进制堆的真实应用是什么?如果你可以在用它来解决问题时分享一些实例,那就太好了。
修改:还添加了二进制堆。很想知道。
答案 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)
在大多数情况下,您必须根据以下因素进行选择:
通常的嫌疑人是:
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就是这种情况。