Sorting 外部合并排序算法
我在理解外部排序算法中的合并步骤时遇到了一定的困难。我在维基百科上看到了这个例子,但无法理解它 外部排序的一个例子是外部合并排序算法,它对每个适合RAM的块进行排序,然后将排序后的块合并在一起。例如,对于仅使用100 MB RAM对900 MB数据进行排序: 1) 在主存中读取100MB的数据,并通过一些常规方法进行排序,如快速排序。 2) 将排序后的数据写入磁盘。 3) 重复步骤1和2,直到所有数据都已排序为100 MB块(有900MB/100MB=9个块),这些块现在需要合并到单个输出文件中。 4) 将每个已排序块的前10MB(=100MB/(9个块+1))读入主内存中的输入缓冲区,并将剩余的10MB分配给输出缓冲区。(实际上,将输出缓冲区变大而将输入缓冲区变小可能会提供更好的性能。) 5) 执行9路合并并将结果存储在输出缓冲区中。如果输出缓冲区已满,请将其写入最终排序的文件,然后清空。如果9个输入缓冲区中的任何一个为空,则用其关联的100 MB排序块中的下一个10 MB填充该缓冲区,直到该块中没有更多可用数据。Sorting 外部合并排序算法,sorting,merge,external,Sorting,Merge,External,我在理解外部排序算法中的合并步骤时遇到了一定的困难。我在维基百科上看到了这个例子,但无法理解它 外部排序的一个例子是外部合并排序算法,它对每个适合RAM的块进行排序,然后将排序后的块合并在一起。例如,对于仅使用100 MB RAM对900 MB数据进行排序: 1) 在主存中读取100MB的数据,并通过一些常规方法进行排序,如快速排序。 2) 将排序后的数据写入磁盘。 3) 重复步骤1和2,直到所有数据都已排序为100 MB块(有900MB/100MB=9个块),这些块现在需要合并到单个输出文件中
我无法理解这里的第四步。为什么在我们有100 MB可用内存的情况下要读取前10MB内存。我们如何确定外部合并的过程数?我们会对每个块进行排序并将它们存储在9个文件中吗?假设您已将范围拆分为k个排序的元素块。如果您可以对这些已排序的块执行k-way合并并将结果写回磁盘,那么您就已经对输入进行了排序 要进行k-way合并,需要存储k个读取指针(每个文件一个),并重复查看所有k个元素,取最小的元素,然后将该元素写入输出流并前进相应的读取指针 现在,由于所有数据都存储在磁盘上的文件中,所以实际上无法存储指向尚未读取的元素的指针,因为无法将所有内容都放入主内存中 让我们从一个简单的方法开始,来模拟正常的合并算法会做什么。假设您在内存中存储了k个元素的数组。将每个文件中的一个元素读入每个数组插槽。然后,重复以下步骤:
- 扫描阵列插槽并取最小的
- 将该元素写入输出流
- 通过从相应文件中读取下一个值来替换该数组元素
sizeof(record)
≤ 100MB。如果每个项目都是一个字节,那么选择R=10MB和W=10MB可以确保所有内容都适合。这可能也是一个很好的发行版,因为它保持了较低的读写次数