c++ - boost 斐波那契堆减操作

标签 c++ boost heap fibonacci-heap

新的“堆” boost 库包括一个斐波那契堆。每个实现的复杂性可以在这里看到:http://www.boost.org/doc/libs/1_51_0/doc/html/heap/data_structures.html .

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

我想尝试在 Dijkstra 算法中使用斐波那契堆,该算法在很大程度上依赖于快速递减操作。

最佳答案

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

boost.heap implements priority queues as max-heaps to be consistent with the STL heap functions. This is in contrast to the typical textbook design, which uses min-heaps.

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

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

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

关于c++ - boost 斐波那契堆减操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12698431/

相关文章:

c++ - 如何在vscode中设置 "include path"来编译c++

c++ - 如何调用传递定义为 protected 类的对象的方法

boost - 新版本的 BJam 是否支持向后兼容旧版本的 Boost?

c++ - 在堆数据结构中环绕问题

c++ - 从二进制文件中读取6字节8位整数

c++ - 为什么我的继承方法输出基类的成员而不是派生类的成员

c++ - 使用boost序列化读取批量大小的二进制文件

时间:2019-03-17 标签:c++boosticlcontainersinsharedmemory

java - 具有 O(log n) 删除任意节点的优先级队列(或最小堆)

java - 最大堆实现