何时将堆用于优先级队列是个坏主意?

时间:2013-09-26 10:08:57

标签: algorithm heap priority-queue

在Cormen等人的“算法导论”一书中解释Dijkstra算法的部分。 al。,在分析算法的复杂性时,他们说

如果图表足够稀疏......我们可以通过使用二进制最小堆实现最小优先级队列来改进算法

所以我想知道,这样的陈述需要什么?是不是总是使用堆优先级队列更明智?

2 个答案:

答案 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)。
  •   

二进制堆只是一种堆。还有其他类型更适合特定场景。