当我知道PQ在时间复杂度方面会更好时,我何时会选择Collections.sort()
而不是PriorityQueue
?
答案 0 :(得分:4)
为其所有元素轮询PriorityQueue
非常有效heap sorting
。 Collections.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
数据结构中。