我知道外部排序的作用,它是用什么;但是我想到了合并极端案例的问题。
外部排序第一个答案说明了外部排序合并的工作方式。但是如果:
假设我们有10个单元的内存大小,我们想对50个单位文件进行排序
首先,我们将文件切成5个运行(每个单元中的每个单元),然后单独对其进行排序
第二,我们必须将它们与4向合并合并
和10/4 = 2.5〜2;我们从每次运行中取2个单元(块),将它们放入内存,然后开始合并;
那么实际的问题是:如果(假设)第三次运行的第二部分和第三部分有
元素要比其他运行的第一批元素小?合并过程会成功吗?
如果我对自己理解的内容有错误,任何解释都会有所帮助。
好吧,在任何文件中都有较小/更大的元素没有问题。这是外部排序过程的示例:
您的初始数据:
data = [2, 5, 3, 7, 1, 6, 4, 8, 9]
考虑到您只有3个内存单位,您将有以下碎片,以及排序的结果:
d1 = [2, 5, 3] -> sorting -> d1 = [2, 3, 5]
d2 = [7, 1, 6] -> sorting -> d2 = [1, 6, 7]
d3 = [4, 8, 9] -> sorting -> d3 = [4, 8, 9]
由于您有三个可用单元,因此您可以同时从三个碎片中阅读,因此,您将拥有:
d = [], d1 = [2, 3, 5], d2 = [1, 6, 7], d3 = [4, 8, 9] -> min(d1, d2, d3) = 1
d = [1], d1 = [2, 3, 5], d2 = [6, 7], d3 = [4, 8, 9] -> min(d1, d2, d3) = 2
d = [1, 2], d1 = [3, 5], d2 = [6, 7], d3 = [4, 8, 9] -> min(d1, d2, d3) = 3
d = [1, 2, 3], d1 = [5], d2 = [6, 7], d3 = [4, 8, 9] -> min(d1, d2, d3) = 4
d = [1, 2, 3, 4], d1 = [5], d2 = [6, 7], d3 = [8, 9] -> min(d1, d2, d3) = 5
d = [1, 2, 3, 4, 5], d1 = [], d2 = [6, 7], d3 = [8, 9] -> min(d1, d2, d3) = 6
d = [1, 2, 3, 4, 5, 6], d1 = [], d2 = [7], d3 = [8, 9] -> min(d1, d2, d3) = 7
d = [1, 2, 3, 4, 5, 6, 7], d1 = [], d2 = [], d3 = [8, 9] -> min(d1, d2, d3) = 8
d = [1, 2, 3, 4, 5, 6, 7, 8], d1 = [], d2 = [], d3 = [9] -> min(d1, d2, d3) = 9
d = [1, 2, 3, 4, 5, 6, 7, 8, 9], d1 = [], d2 = [], d3 = [] -> []
您可能担心的是,当您有足够的限制以允许您不读取每个文件中的至少一个元素时,即使决定只是要从给定文件中读取更多元素,也将另一个文件留下来阅读。
这与上面的过程相同,唯一的区别是,在阅读了两个文件并合并它们之间的数据之后,您必须从第三个文件和从生成的最后一个文件,即文件1和2的合并。
由于第三个文件和生成的最后一个文件都是肯定进行排序,因此您能够顺序扫描两个文件中的数据,将条目合并为唯一结果。