我从link得到了这个,它讨论了外部合并排序。
从幻灯片6示例:有5个缓冲页面,以排序108页面文件
Pass0:[108/5] = 22个分类运行,每个5页(最后一次只运行3页)
Pass1 [22/4] = 6个分类运行,每个20页(最后一次只运行8页)
Pass2:[6/3] = 2个分类运行,80页和28页
传递3:[2/2] = 1 108页的分类文件
问题:我的理解是在外部合并排序中,在传递0中,您创建块然后对每个块进行排序。在剩余的传球中,你不断合并它们。 所以,将它应用于上面的例子,因为我们只有5个缓冲页面,在Pass 0中它清楚我们需要22个排序的运行,每个5页。
现在,为什么我们要为剩余的通行证进行分类运行呢?
当我们只有5个缓冲页面的时候,为什么它会传递1,6个分别运行的20页?
这里合并的确切位置在哪里?如何在每次通过中减少N,即从108到22减少到6到2?
答案 0 :(得分:16)
当您无法将所有数据存储到内存中时,必须进行外部合并排序。您可以做的最好的事情是将数据分解为已排序的运行并在后续过程中合并运行。运行的长度与可用的缓冲区大小相关联。
Pass0 :您正在进行IN PLACE操作。因此,您将5页数据加载到缓冲区中,然后使用就地排序算法对其进行排序。 这5页将作为运行存储在一起。
传递后:由于您要合并多个页面的运行,因此无法再进行操作。 4页被加载到缓冲区,第5页是写缓冲区。合并与合并排序算法相同,但是您将分割并征服B-1而不是2。当写入缓冲区被填充时,它将被写入磁盘并启动下一页。
<强>复杂性强>: 在分析外部合并排序的复杂性时,正在考虑的是I / O的数量。在每次传递中,您必须阅读页面并编写页面。设N为页数。每次运行将花费2N。阅读页面,写下页面 设B是可以容纳缓冲空间的页数,N是页数 将有ceil(log_B-1(ceil(N / B)))通过。每个传递将有2N I / O.所以O(nlogn)。
在每次传递中,运行的页面长度增加了B-1倍,排序的运行次数减少了B-1倍。
Pass0:ceil(108/5)= 22,每次运行5页
Pass1:ceil(22/4)= 6,每次运行20页
Pass2:ceil(6/4)= 2,每次运行80页
Pass3:ceil(2/4)= 1 - 完成,1次运行108页
答案 1 :(得分:0)
一个。由于它从未提及合并,我假设(希望)后来的“排序”过程正在进行合并。
B中。同样,假设这是合并,你需要一个缓冲区来保存合并的记录,并为每个被合并的文件使用剩余的缓冲区之一:因此,4个输入文件,每个w / 5页:20页。
℃。想想我现在已经回答了两次合并的地方:)