多相合并排序 - 阶段数量是多少

时间:2017-12-22 20:49:45

标签: algorithm sorting

假设我们必须在外部对一些大数字进行排序。我们想检查两个案例:

  1. 4个磁带:2个输入磁带,2个输出
  2. 3个磁带:2英寸,1个
  3. 案例1:

    4 tapes

    我们从k运行开始,然后我们将这些运行复制到2个输入磁带(在下面的图片左侧),每次迭代我们从输入磁带进行两次不同的运行,合并(和排序)它们,并在一次迭代中将它们保存到第一个输出磁带,然后在下一次迭代中保存到第二个输出磁带,如下所示。然后我们用输入磁带切换输出磁带并重复该过程。因此,如果我们有n=10^6元素和k=1000运行,那么在第一阶段运行之后,2000之后将会是4000,依此类推。因此,阶段总数为ceil(log_2(n))

    案例2:

    3 tapes

    在最佳情况复杂度中,阶段的数量为position of Fibonacci’s number in the Fibonacci’s sequence minus two,即如果我们的初始运行次数为k=34且34是Fibonacci序列中的第9个数,那么我们将有7个相。

    enter image description here

    但是......如果我们的次数不是斐波纳契数,那么就必须用虚拟运行来填充磁带以获得否。跑到斐波纳契数。

    最后,我的问题是:

    当运行次数不是斐波纳契数时,为了对序列进行排序所需的平均情况数是多少?

1 个答案:

答案 0 :(得分:1)

  

当运行次数不是斐波那契数时,阶段数是多少?

如果运行计数不是理想数,则排序将需要一个额外阶段,类似于将运行计数舍入到下一个理想数。虚拟运行不需要占用磁带上的任何空间,但代码必须在非理想分发阶段处理多个磁带上的数据末尾。

关于原始问题中的信息的一些注释:

4磁带示例显示了平衡的双向合并排序。对于多相合并排序,每个阶段只有一个输出磁带。使用4个磁带驱动器,初始设置在其他3个驱动器之间分配运行,因此在初始分配之后,它总是3个输入磁带,1个输出磁带。

Fibonacci数字仅适用于3磁带场景。对于4个或更多磁带场景,通过从最后阶段开始并向后工作,最容易生成序列。对于4个磁带上的31次运行,最终运行次数为{1,0,0,0}, 向后工作:{0,1,1,1},{1,0,2,2},{3,2,0,4},{7,6,4,0},{0,13,11, 7}。

由于合并了各种尺寸的先前运行,运行尺寸增加。假设运行大小为1个元素,31个运行,4个磁带。初始分配后,运行计数:运行大小为{0:0,13:1,11:1,7:1}。第一阶段:{7:3,6:1,4:1,0:0}。第二阶段:{3:3,2:1,0:0,4:5}。第三阶段{1:3,0:0,2:9,2:5}。第四阶段:{0:0,1:17,1:9,1:5}。第五和最后阶段{1:31,0:0,0:0,0:0}。

跟踪运行规模可能会变得复杂,因此磁带的简单解决方案是使用单个文件标记来指示运行结束,使用双重文件标记来指示数据的结束。

Wiki有一篇关于多相合并排序的文章。

https://en.wikipedia.org/wiki/Polyphase_merge_sort

如果事先知道总运行次数,则初始分配可以包括初始合并操作以使运行计数达到理想数量,但现在运行大小因初始合并操作而异,因此每个磁带最终都会混合运行规模。同样,使用文件标记指示运行结束消除了必须跟踪内存中的运行大小。

多相合并排序是使用3个堆栈进行排序的最快方法。