【问题标题】:Boost Fibonacci Heap Decrease Operation提升斐波那契堆减少操作
【发布时间】: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


【解决方案1】:

根据http://www.boost.org/doc/libs/1_51_0/doc/html/heap/concepts.html

boost.heap 将优先级队列实现为最大堆以与 STL 堆函数保持一致。这与使用最小堆的典型教科书设计形成对比。

教科书/维基百科斐波那契堆具有最高优先级和最低值的元素,即最小堆(例如,“1”的优先级高于“2”)。 STL 和 Boost(为了与 STL 保持一致)颠倒了定义,使最高优先级具有最高值,也就是最大堆(即“2”优先级高于“1”)。

本质上,这意味着decreaseincrease 在教材和Boost 之间具有相反的含义。

如果你想获得一个最小堆(就像教科书中的定义一样),你必须首先为你的fibonacci_heap 定义一个合适的boost::heap::compare 函子(见这里的例子:Defining compare function for fibonacci heap in boost),然后调用increase每当您减少与堆元素关联的值(并因此增加优先级)时,反之亦然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2012-12-16
    • 2010-11-24
    • 1970-01-01
    • 2016-11-18
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多