使用红/黑树实现Dijkstra的最短路径算法?

时间:2013-01-24 15:41:43

标签: algorithm data-structures dijkstra shortest-path red-black-tree

我知道Dijkstra的算法实际上是使用Fibonacci堆实现的。但它是否也可以使用红黑树实现,并且最坏情况下的运行时间仍为O(m log n)?

3 个答案:

答案 0 :(得分:8)

对于初学者来说,实际上很难看到Dijkstra的算法是用Fibonacci堆实现的。尽管Fibonacci堆具有很好的渐近性能(O(m + n log n)),但实际上它具有如此高的常数因子,其他类型的堆更有效。

关于你的问题 - 是的,你可以使用红黑树作为优先级队列来获得O(m log n)性能。这是有效的,因为您可以在O(log n)时间内找到红黑树中的最小元素,并通过执行删除然后插入来在时间O(log n)上模拟树上的减少键操作。但是,这可能不如使用标准二进制堆那么有效,因为红黑树具有更差的引用局部性和更多的内存开销。更一般地说,无论何时需要优先级队列,您总是可以使用平衡的二叉搜索树,但通常这样做是过度的。

希望这有帮助!

答案 1 :(得分:2)

我不会说Dijkstra的算法是使用Fibonacci堆实现的。实际上任何堆都可以做,尽管Fiboncci对于不同的操作具有最佳的摊销复杂性(请记住,尽管这只显示在真正巨大的图形中)。再次使用红黑树将实现相同的计算复杂度,但是具有更高的常数,因为使用红黑树更复杂。

此算法所需的只是能够从给定集合中获取最小元素。这就是堆的意思,因此它最适合这个问题。一棵红黑树可以做很多其他事情,因此在这种特殊情况下更复杂,预制更糟。

答案 2 :(得分:1)

这是一个有趣的问题。是的,您可以使用Red-Black树来实现,下面是一个示例:

https://rosettacode.org/wiki/Dijkstra%27s_algorithm#Java

相关问题