现在问题非常简单。你有1000 MB,你必须对它进行排序。现在的问题是你只有100 MB的空间来排序数据。 (可以说1000 MB存储在磁盘中,你只有100 MB Ram来对数据进行排序。 - 在任何时候你都可以在Ram中只有100 MB的数据。)
现在我想出了这个解决方案:
现在我面临的问题是,当我们连接时,我们将分别合并100 MB,我们将犯错误。 (这些100 MB也应该合并在一起。)
我该如何解决这个问题?
答案 0 :(得分:1)
外部合并排序与合并阶段的内部版本不同。在您的问题中,您试图直接将内部合并算法应用于外部合并。
因此,您最终必须合并两个大小为n / 2
的块。正如您所记得的那样,由于内存不足,这将无效。
假设您有足够的内存来排序所有元素中的1/k
个。这会为您留下k
个排序列表。您可以一次合并所有k
,而不是合并两个列表:
n / 2
。这会留下n / 2
内存用于输入缓冲或每个子块m = n / (2 x k)
。m
元素。现在使用了所有内存,并且您拥有内存中每个子块的最低m
个元素。k
输入缓冲区中选择最低值。将此值附加到输出缓冲区。重复,直到其中一个输入缓冲区用完为止。m
元素。如果没有更多元素,则完成子块。输出文件现已排序。
您可以将输入缓冲区视为已排序存储区上的一组流缓冲区。检查流并从所有流中选择 best (即最低)元素,并将其保存到输出列表中。从外部看,它是一个与智能预取和输出缓冲的流合并。
答案 1 :(得分:0)
您需要重复步骤3和4. N-1次。