在Cormen等人的“算法导论”一书中解释Dijkstra算法的部分。 al。,在分析算法的复杂性时,他们说
如果图表足够稀疏......我们可以通过使用二进制最小堆实现最小优先级队列来改进算法
所以我想知道,这样的陈述需要什么?是不是总是使用堆优先级队列更明智?
答案 0 :(得分:3)
实现优先级队列的方法有很多种。二进制最小堆很有用,因为它运行得相当好并且易于实现。但是pairing heap也非常容易实现,并且它对某些操作具有更好的性能。特别是,它比二进制堆更快地执行减少键操作。
或者您可以使用skip list优先级队列。跳过列表具有一些很好的属性,使其在某些优先级队列应用程序中具有吸引力特别是,创建并发跳过列表比并发堆更容易。
所以,不,使用堆优先级队列并不总是更明智。使用堆而不是排序列表几乎肯定更明智,但有时候其他东西比堆更合适。
答案 1 :(得分:1)
请参阅https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
它说:
- Dijkstra的原始算法不使用最小优先级队列并在O(| V | ^ 2)中运行。
因此,本书中的陈述只是说可以优化原始算法。
- 基于由 Fibonacci堆实现并在O(| E | + | V | log | V |)中运行的最小优先级队列的实现(其中| E |是()(Fredman& Tarjan 1984)。
二进制堆只是一种堆。还有其他类型更适合特定场景。