Data structures 斐波那契堆数据结构背后的直觉是什么?
我已经阅读了和CLRS对数据结构的描述,但它们对这种数据结构的工作原理没有什么直观的解释。为什么斐波那契堆是这样设计的?它们是如何工作的Data structures 斐波那契堆数据结构背后的直觉是什么?,data-structures,fibonacci-heap,Data Structures,Fibonacci Heap,我已经阅读了和CLRS对数据结构的描述,但它们对这种数据结构的工作原理没有什么直观的解释。为什么斐波那契堆是这样设计的?它们是如何工作的 谢谢 这个答案会很长,但我希望它能帮助我们了解斐波那契堆的来源。我假设你已经熟悉和 动机:为什么斐波那契堆? 在跳入斐波那契堆之前,最好先探究一下我们为什么需要它们。还有很多其他类型的堆(例如,还有),那么为什么我们需要另一个呢 主要原因出现在和。这两种图算法都通过维护一个优先级队列来工作,该队列包含具有相关优先级的节点。有趣的是,这些算法依赖于一个名为red
谢谢 这个答案会很长,但我希望它能帮助我们了解斐波那契堆的来源。我假设你已经熟悉和 动机:为什么斐波那契堆? 在跳入斐波那契堆之前,最好先探究一下我们为什么需要它们。还有很多其他类型的堆(例如,还有),那么为什么我们需要另一个呢 主要原因出现在和。这两种图算法都通过维护一个优先级队列来工作,该队列包含具有相关优先级的节点。有趣的是,这些算法依赖于一个名为reduce key的堆操作,该操作获取优先级队列中已有的条目,然后降低其密钥(即增加其优先级)。事实上,这些算法的很多运行时都是通过调用reduce key的次数来解释的。如果我们能够构建一个优化reducekey的数据结构,我们就可以优化这些算法的性能。对于二进制堆和二项式堆,reduce key需要时间O(logn),其中n是优先级队列中的节点数。如果我们可以把它降到O(1),那么Dijkstra算法和Prim算法的时间复杂度将从O(m logn)降到(m+n logn),这比以前快得多。因此,尝试构建一个支持有效减少密钥的数据结构是有意义的 还有另一个理由考虑设计一个更好的堆结构。将元素添加到空二进制堆时,每次插入都需要时间O(logn)。如果我们事先知道所有的n个元素,这是可能的,但是如果元素到达一个流中,这是不可能的。在二项式堆的情况下,插入n个连续元素每个都需要摊销时间O(1),但如果插入与删除交错,则插入可能最终每个都需要Ω(logn)时间。因此,我们可能希望搜索一个优先级队列实现,该实现优化插入,使每个插入花费时间为O(1) 第一步:懒惰的二项式堆 为了开始构建斐波那契堆,我们将从一个二项式堆开始,并对其进行修改,使插入花费时间为O(1)。尝试这一点并不是不合理的——毕竟,如果我们要做大量的插入而不是排那么多的队列,那么优化插入是有意义的 如果您还记得的话,二项式堆的工作原理是将堆中的所有元素存储在一个集合中。n阶二叉树中有2n个节点,堆结构是所有服从堆属性的二叉树的集合。通常,二项式堆中的插入算法工作如下:
- 创建一个新的单例节点(这是一个顺序为0的树)
- 如果存在顺序为0的树:
- 将两棵0阶树合并为一棵1阶树
- 如果有一个顺序为1的树:
- 将顺序为1的两棵树合并为顺序为2的树
- 如果有一棵2级树: