斐波那契堆和二叉堆有哪些实际的应用?如果你能分享一些你使用它们解决问题的实例就太好了。
编辑:新增了二叉堆。很好奇。
斐波那契堆和二叉堆有哪些实际的应用?如果你能分享一些你使用它们解决问题的实例就太好了。
编辑:新增了二叉堆。很好奇。
在实际生活中,你很少使用它。我认为 Fibonacci 堆的目的是改善 Dijkstra 算法的渐近运行时间。对于非常大的输入可能会给你提高,但大多数情况下,一个简单的二叉堆就足够了。
来自维基百科:
尽管以空结构开始的一系列操作的总运行时间受到上述界限的限制,但该序列中的某些(非常少数)操作可能需要很长时间才能完成(特别是删除和删除最小值在最坏情况下具有线性运行时间)。因此,Fibonacci 堆和其他分摊数据结构可能不适用于实时系统。
二叉堆是一种数据结构,可用于快速查找一组值中的最大(或最小)值。它在 Dijkstra 算法(最短路径)、Prim 算法(最小生成树)和 Huffman 编码(数据压缩)中使用。
不能确定斐波那契堆的情况,但二叉堆被用于优先队列中。优先队列在实际系统中得到广泛应用。
一个已知的例子是内核中的进程调度。最高优先级的进程首先被执行。
我曾在集合分区中使用过优先队列。将具有最大成员的集合首先用于分区。
log(n)
O(1)
,查找为O(n)
O(1)
(请参见:https://dev59.com/MG025IYBdhLWcg3wNTEV#29548834)O(1)
,一般情况下为O(n)
。
O(1)
,但需要比Fibonacci更大的队列才能值得使用。优先队列通常被实现为堆,例如:http://download.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html
使用二叉堆可以高效地计算出巨大数据集中的前N个元素(例如,在大型网站中搜索查询排名前N的结果)。