1
0
“合并排序”将数组依次拆分为较小的片段,直到它变成一组2元素子数组。然后,它开始在连续较大的子阵列上应用合并算法。 假设您有一个由16个元素组成的数组。合并排序的合并方式如下:
有四个(对数 2. (16) )通过,并在每次通过时检查每个项目。每次通过为O(n)。因此,此合并排序的运行时间是O(n*log 2. (n) )。 现在,假设您有一个包含81个项目的数组,并且您希望使用3路合并排序来合并它。现在您有了以下合并序列:
有四个(对数 3. (81))通过。每次合并都是O(m*log 2. (k) ),其中m是要合并的项目总数,k是列表数。因此,第一个过程有27个合并,可以进行3*log 2. (3) 比较。下一个过程有9个合并,执行9*log 2. (3) 比较等。最终的结果是总合并为O(n*log 3. (n) *日志 2. (3) () 您可以看到,三向合并排序允许您进行较少的传递(16个项目的三向合并排序只需要三次传递),但每次传递都会稍微贵一些。您需要确定的是: n*日志 K (n) *日志 2. (k) <n*日志 2. (n)
哪里
不过,你必须小心,因为渐近分析没有考虑现实世界的影响。例如,双向合并非常简单。当您转到k路合并时,其中k>2,您最终不得不使用堆或其他优先级队列数据结构,这会带来相当大的开销。因此,即使上面的数学告诉您,3路合并排序应该更快,您也需要将其与标准的2路合并进行比较。 使现代化你说得对。如果你简化方程,你最终得到的方程是相同的。因此,无论k的值是多少,计算复杂度都是相同的。 这很有意义,因为如果k=x,那么最终会得到堆排序。 因此,您必须确定是否存在这样一个点,即合并开销(随着k的增加而增加)被减少的过程数所抵消。你可能需要根据经验来确定这一点。 |
2
0
传统上,我们使用mergesort进行外部排序算法,这个问题的答案主要取决于一个事实。mergesort需要从多个文件流式传输数据并写入单个文件。瓶颈在于流媒体,而不是CPU。如果您试图一次从一个磁盘上的太多位置进行流式处理,则该磁盘会发生故障并开始进行随机搜索。随机搜索的吞吐量很糟糕。 硬件上的正确答案会有所不同(尤其是在使用SSD驱动器的情况下),但是 traditional Unix sort 以16路合并作为合理违约解决。 |
Nhmanas · c中的合并排序堆栈溢出++ 6 年前 |
MitterHai · 合并排序堆栈溢出错误 6 年前 |
Alpaca · 我的合并排序java代码有什么问题? 6 年前 |
paper man · 合并排序大小不为2^n的数组 7 年前 |