【发布时间】:2015-06-08 13:44:52
【问题描述】:
我在理解外部排序算法中的合并步骤时遇到了一些麻烦。我在 Wikipedia 中看到了这个示例,但无法理解。
外部排序的一个例子是外部合并排序算法,它对每个适合 RAM 的块进行排序,然后将排序后的块合并在一起。例如,仅使用 100 兆字节的 RAM 对 900 兆字节的数据进行排序: 1) 读取主存中的 100 MB 数据并通过一些常规方法进行排序,例如快速排序。 2) 将排序后的数据写入磁盘。 3) 重复第 1 步和第 2 步,直到所有数据都在排序后的 100 MB 块中(有 900MB / 100MB = 9 个块),现在需要将其合并到一个输出文件中。 4) 将每个已排序块的前 10 MB (= 100MB / (9 块 + 1)) 读入主内存中的输入缓冲区,并将剩余的 10 MB 分配给输出缓冲区。 (实际上,使输出缓冲区更大而输入缓冲区稍小可能会提供更好的性能。) 5) 执行 9 路合并并将结果存储在输出缓冲区中。如果输出缓冲区已满,则将其写入最终排序的文件,并将其清空。如果 9 个输入缓冲区中的任何一个变空,则用其关联的 100 MB 排序块中的下一个 10 MB 填充它,直到该块中没有更多数据可用。
我无法理解这里的第四步。为什么当我们有 100 MB 的可用内存时要读取前 10MB 的内存。我们如何确定外部合并的传递次数?我们会对每个块进行排序并将它们存储在9 个文件?
【问题讨论】: