PriorityQueue与Collections.sort

时间:2014-03-23 15:47:51

标签: java collections priority-queue

当我知道PQ在时间复杂度方面会更好时,我何时会选择Collections.sort()而不是PriorityQueue

2 个答案:

答案 0 :(得分:4)

为其所有元素轮询PriorityQueue非常有效heap sortingCollections.sort()是使用merge sorting实施的。堆排序和合并排序在时间复杂度方面具有可比性。两者都具有最佳情况,最坏情况和平均情况O(n log n)时间复杂度。

就绩效而言,wikipedia对此有何评价:

  

Heapsort还与合并排序竞争,合并排序具有相同的时间范围。合并排序需要Ω(n)辅助空间,但是heapsort只需要一个恒定的数量。对于具有小数据缓存或慢数据缓存的计算机,Heaport通常在实践中运行得更快。另一方面,合并排序比heapsort有几个优点:

     
      
  • 对数组进行合并排序具有相当好的数据缓存性能,通常在现代桌面计算机上优于heapsort,因为合并排序经常访问连续的内存位置(良好的引用位置);堆栈引用遍布整个堆。
  •   
  • Heapsort不是一个稳定的类型;合并排序是稳定的。
  •   
  • 合并排序可以很好地并行化,并且可以通过简单的实现实现接近线性的加速; heapsort不是并行算法的明显候选者。
  •   
  • 合并排序可以适用于具有O(1)额外空间的单链表。 Heapsort可以调整为在双向链表上运行,只有O(1)额外的空间开销。[需要引证]
  •   
  • 合并排序用于外部排序; heapsort不是。参考地点是问题。
  •   

PriorityQueue不是用于排序,而是用于获取更改队列中的最高优先级元素。它也不会提高性能,也不会使您使用PriorityQueue对代码进行排序。因此,我建议你在排序时坚持使用Collections.sort()

答案 1 :(得分:1)

您使用Collections.sort()的一个明显原因是,您已经有List个要排序的事情。它可以直接在该表示上运行(同样Arrays.sort和数组)。使用PriorityQueue需要复制所有引用并计算堆,然后才能开始轮询。这意味着将引用复制到另一个List数据结构中。