提高斐波纳契堆减少操作

时间:2012-10-02 21:14:31

标签: c++ boost heap fibonacci-heap

新的'heap'boost库包含一个fibonacci堆。每个实现的复杂性可以在这里看到:http://www.boost.org/doc/libs/1_51_0/doc/html/heap/data_structures.html

我的问题是:为什么斐波纳契堆减少操作O(log(N)),而增加操作是O(1)?

我想尝试在Dijkstra算法中使用斐波纳契堆,这在很大程度上依赖于快速降低操作。

1 个答案:

答案 0 :(得分:3)

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

  

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

教科书/维基百科斐波纳契堆具有最高优先级元素,具有最低值,即最小堆(例如“1”优先于“2”)。 STL和Boost(与STL保持一致)反转定义,使最高优先级具有最高值,即最大堆(即“2”优先级高于“1”)。

基本上,这意味着decreaseincrease在教科书和Boost之间具有反向含义。

如果您想获得最小堆(如教科书定义),您必须首先为boost::heap::compare定义适当的fibonacci_heap仿函数(请参阅此处的示例:Defining compare function for fibonacci heap in boost) ,每当你减少与堆元素相关的值(并因此增加优先级)时调用increase,反之亦然。