Algorithm 快速排序的缓存性能

Algorithm 快速排序的缓存性能,algorithm,sorting,caching,quicksort,Algorithm,Sorting,Caching,Quicksort,我最近遇到了这个疑问 我们选择快速排序而不是合并排序,因为快速排序的缓存性能优于合并排序。 有人能解释一下吗?一般情况是不存在的 由于最佳和最坏情况通常是实践中很少出现的极端情况,因此进行了平均情况分析。但是,任何平均案例分析都假设输入的某些分布!对于排序,典型的选择是随机排列模型(维基百科默认) 为什么用O表示法 在算法分析中丢弃常量有一个主要原因:如果我对精确的运行时间感兴趣,我需要所有涉及的基本操作的(相对)成本(即使仍然忽略缓存问题、现代处理器中的流水线……)。数学分析可以计算每个指令执

我最近遇到了这个疑问

我们选择快速排序而不是合并排序,因为快速排序的缓存性能优于合并排序。
有人能解释一下吗?

一般情况是不存在的

由于最佳和最坏情况通常是实践中很少出现的极端情况,因此进行了平均情况分析。但是,任何平均案例分析都假设输入的某些分布!对于排序,典型的选择是随机排列模型(维基百科默认)

为什么用O表示法

在算法分析中丢弃常量有一个主要原因:如果我对精确的运行时间感兴趣,我需要所有涉及的基本操作的(相对)成本(即使仍然忽略缓存问题、现代处理器中的流水线……)。数学分析可以计算每个指令执行的频率,但单个指令的运行时间取决于处理器的详细信息,例如,32位整数乘法是否需要与加法相同的时间

有两条出路:

修理一些机器型号

这是在Don Knuth的丛书《计算机编程的艺术》中为作者发明的人工“典型”计算机所做的。在第3卷中,您可以找到许多排序算法的精确平均案例结果,例如

快速排序:11.667(n+1)项次(n)−1.74n−18.74 合并排序:12.5nln(n) 堆口:16nln(n)+0.01n 插入端口:2.25n2+7.75n−几种排序算法的3ln(n)运行时

这些结果表明快速排序是最快的。但是,这只在Knuth的人造机器上得到了证明,它不一定意味着任何东西,比如说您的x86 PC。还要注意,对于小输入,算法的关联不同: 几种小输入排序算法的运行时

分析抽象的基本操作

对于基于比较的排序,这通常是交换和键比较。在Robert Sedgewick的书中,例如“算法”,这种方法被采用。你在那里找到了吗

快速排序:平均为2nln(n)次比较和13nln(n)次交换 Mergesort:1.44nln(n)比较,但最多可访问8.66nln(n)数组(Mergesort不基于交换,因此我们无法计算)。 插入排序:平均14n2比较和14n2交换。
如您所见,这不允许将算法作为精确的运行时分析进行比较,但结果与机器细节无关。

一个因素是典型的mergesort实现不到位,因此它们需要大约两倍于典型快速排序实现的内存。(“典型的合并排序”=不是高度复杂和缓慢的就地版本;“典型的快速排序”=在“nice”输入上进行启发式枢轴选择的快速排序,该输入提供O(nlog n)时间和空间行为。从技术上讲,快速排序也不到位,因为它至少需要O(logn)额外空间用于递归堆栈,以及O(n)除非使用昂贵的中间值选择进行旋转。)