【发布时间】:2012-10-02 21:14:31
【问题描述】:
新的“堆”boost 库包括一个斐波那契堆。每个实现的复杂性可以在这里看到:http://www.boost.org/doc/libs/1_51_0/doc/html/heap/data_structures.html。
我的问题是:为什么斐波那契堆减少操作是O(log(N)),而增加操作是O(1)?
我想尝试在 Dijkstra 算法中使用斐波那契堆,该算法严重依赖于快速减少操作。
【问题讨论】:
-
阅读维基百科文章:en.wikipedia.org/wiki/Fibonacci_heap
-
维基百科的文章只讨论了减少键被摊销 O(1)。
-
嗯,最小值和最大值在维基百科文章(这是一个最小堆)和 Boost 库(这是一个最大堆)之间交换。要使用 Dijkstra 的 Boost 库,您必须反转分数比较。
-
好的,我将“增加”解释为将元素推向更靠近堆顶部的位置,而减少并将元素推向远离顶部的位置。无论顶部是最小元素还是最大元素,都无关紧要吗?这是正确的吗?
-
因此,根据您的解释,增加是摊销 O(1) - 这是斐波那契堆的基本优势。减少是 O(log n),因为所有其他标准堆操作都具有这种复杂性(您可以通过删除 + 插入来实现减少)。
标签: c++ boost heap fibonacci-heap