我想知道二进制,二项式和斐波纳契堆之间的基本区别,以及它们最适合使用的场景。 我主要关注它们在Dijkstra算法中的应用,它的时间复杂度将根据所用堆的类型而有所不同?
答案 0 :(得分:2)
根据Wikipedia,二进制堆是使用二叉树创建的堆数据结构。它可以看作是一个二叉树,有两个额外的约束,完整的二叉树和堆属性。请注意,堆属性是所有节点都大于或小于每个子节点。
二项堆比大多数二进制堆更复杂。但是,它具有出色的合并性能,这与O(lg N)时间有关。二项式堆由二叉树列表组成。
在进入 Fibonacci堆之前,探索为什么我们甚至首先需要它们可能会很好。还有很多其他类型的堆(例如二进制堆和二进制堆),为什么我们还需要另一堆?
Dijkstra的算法和Prim的算法出现了主要原因。这两种图算法都通过维护具有相关优先级的节点的优先级队列来工作。有趣的是,这些算法依赖于称为减少密钥的堆操作,该操作接受已经在优先级队列中的条目,然后减少其密钥(即增加其优先级)。实际上,这些算法的很多运行时都是通过调用reduce-key的次数来解释的。如果我们可以构建优化reduce-key的数据结构,我们可以优化这些算法的性能。对于二进制堆和二项式堆,reduce-key需要时间O(log n),其中n是优先级队列中的节点数。如果我们可以将其降低到O(1),那么Dijkstra算法和Prim算法的时间复杂度将从O(m log n)下降到(m + n log n),这比以前渐近地更快。因此,尝试构建一个有效支持reduce-key的数据结构是有意义的。
如果您有兴趣了解有关斐波那契堆的更多信息,您可以查看这个由两部分组成的系列讲座幻灯片。 Part one引入了二项式堆,并显示了懒惰的二项式堆的工作原理。Part two探讨了斐波纳契堆。这些幻灯片比我在这里介绍的更深入。