【问题标题】:How is quick sort better at cache locality than mergesort?缓存局部性的快速排序如何比合并排序更好?
【发布时间】:2018-07-08 20:52:36
【问题描述】:

In answers related to quicksort vs mergesort,通常说quicksortmergesort 更好地利用缓存位置(引用位置)。

由于这两种方法都遵循分而治之的方法,我不明白quicksort 是如何对缓存更友好的。谁能提供与此相关的更多见解?

另外,in-place merge sort 上有注释。如果这可行(我不知道是否可行),合并排序也可以缓存友好吗?

【问题讨论】:

  • 这是个好问题。我至少在维基百科页面上找不到答案。

标签: algorithm language-agnostic quicksort mergesort


【解决方案1】:

如果您正在对适合缓存的数组进行排序,那么快速排序将需要更少的内存访问,因为合并排序需要分配第二个数组。快速排序会将数组加载到缓存中,然后继续进行而不等待内存。 Mergesort 将支付访问第二个数组的额外费用。

如果您正在对一个不适合缓存的数组进行排序,那么从局部性的角度来看,快速排序仍然会胜出,因为当它们递归对较小的部分进行排序时,两种算法都将很快到达 可以执行的部分 适合缓存,对于那些快速排序,上述参数更快。在不适合缓存的排序的上层,从缓存位置的角度来看,快速排序和归并排序的性能几乎相同。

【讨论】:

  • 尽管就地更复杂,不是merge sort also possible without a scratch array吗?您的答案是否考虑就地版本?
  • 实际上并没有与常规合并排序具有相同 O( N log N ) 复杂度的实用就地合并排序。
  • 您能否在回答中对此进行扩展?那么,我想所有的疑问都会得到澄清。
  • 不确定你的意思……就是没有。您发布的链接表明他们的就地合并排序需要 O(N^2) 时间。有更好、更简单的变体需要 O( N log^2 N ),但这仍然比常规合并排序慢。有一些复杂的类似合并排序的算法能够以最少的额外空间获得 O( N log N ) 时间,但它们足够复杂,以至于在现实生活中没有使用。
  • @MattTimmermans:有仍然是 O(N log N) 的就地合并排序。见citeseerx.ist.psu.edu/viewdoc/…。在实践中,它们虽然比不合时宜的合并排序要慢。 OTOH,合并排序的时间是 1.5 倍,大约是快速排序的 3 倍,这肯定比典型的合并排序慢,但不是真正可怕的数量。
猜你喜欢
  • 2021-06-06
  • 2010-10-04
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 2021-06-19
相关资源
最近更新 更多