新的'heap'boost库包含一个fibonacci堆。每个实现的复杂性可以在这里看到:http://www.boost.org/doc/libs/1_51_0/doc/html/heap/data_structures.html。
我的问题是:为什么斐波纳契堆减少操作O(log(N)),而增加操作是O(1)?
我想尝试在Dijkstra算法中使用斐波纳契堆,这在很大程度上依赖于快速降低操作。
答案 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”)。
基本上,这意味着decrease
和increase
在教科书和Boost之间具有反向含义。
如果您想获得最小堆(如教科书定义),您必须首先为boost::heap::compare
定义适当的fibonacci_heap
仿函数(请参阅此处的示例:Defining compare function for fibonacci heap in boost) ,每当你减少与堆元素相关的值(并因此增加优先级)时调用increase
,反之亦然。