K-way合并的最大K.

时间:2017-01-16 22:53:20

标签: mergesort

我试图找出,K-way合并排序的最大K是多少,或者是否有任何最大值。 该算法的时间复杂度为O(nlogK)。我一直在寻找它几个小时没有运气。有人可以把我链接到一些解释它的文章,或告诉我是否有一些限制,为什么会这样? 另外,我想知道是否建议使用K值,这是最有效的。

1 个答案:

答案 0 :(得分:2)

在内部(仅存储器)排序的情况下,无论K如何,数据上的操作总数保持大致相同。设x = n log2(n)。 2路合并排序需要x次移动,最差情况x需要比较总共x + x =(2)x次操作。 (从技术上讲,即使在最坏的情况下,也会比x更低一些,但x足够接近这里的想法)。 4路合并排序需要(1/2)x移动和最差情况(3/2)x比较,因此仍然总共(1/2)x +(3/2)x =(2)x操作。如果比较比移动快,则4路合并排序更快,如果移动比比较快,则2路合并排序更快。还有一些变量如指针或索引保存在寄存器或堆栈中,对于4路合并,您需要16个寄存器(如64位模式下的X86)。作为移动速度更快的示例,请考虑对对象指针数组进行排序,仅移动指针,但比较对象(包含每个对象的指针取消引用)的情况。

对于外部排序,在外部设备(磁盘驱动器或过去的一堆磁带驱动器)上创建排序块的内部排序可以是任何算法,K方式部分只是合并块。在外部排序次数与K之间存在折衷,足以使K方式合并成为cpu绑定而不是I / O绑定。总时间是I / O时间+任何超出I / O时间的CPU时间。大数据文件的Gnu排序使用K = 16.K方式合并是使用K元素最小堆完成的,其中每个堆条目对应一个结构(或等价物),它包含一个块id,记录索引或指针,数字内存中剩余块的记录数,块中剩余的记录数)。在使用K个条目初始创建最小堆之后,堆的前面元素对应于具有K个条目的当前最小元素(假设升序排序)的结构。移动该元素以输出,从该块读取下一个元素,并更新堆以反映下一个元素放置堆中前端条目的位置。一旦到达块的末尾,合并变为K-1合并,然后是K-2合并,直到只剩下1个块被复制。