我正在阅读Jon Bentley的编程珍珠(reference)。
这里作者提到了各种排序算法,如合并排序,多通道排序。
问题:
合并排序的算法如何通过读取输入文件一次并使用工作文件并只输出一次输出文件来工作?
作者如何表示40通道即多通道排序算法仅通过一次写入输出文件并且没有工作文件来工作?
有人可以通过一个简单的例子来解释上述内容,比如有内存来存储3位数并且有10位数字可以存储,例如: 9,0,8,6,5,4,1,2,3,7
答案 0 :(得分:2)
这是来自Jon Bentley的“Programming Pearls”(第二版)的第1章,这是一本很好的书。第一版的等效示例略有不同;多通道算法仅对数据进行了27次传递(并且可用内存较少)。
Jon Bentley描述的排序有特殊的设置限制。
输入文件的单次读取会从输入中汲取尽可能多的行以适应内存,对该数据进行排序,并将其写入工作文件。冲洗并重复,直到输入文件中没有更多数据。
然后,通过读取工作文件并将排序后的内容合并到单个输出文件中来完成该过程。在极端情况下,可能需要创建新的,更大的工作文件,因为程序无法一次读取所有工作文件。如果发生这种情况,您可以安排最终传递以获得可以处理的最大输入数,并让中间传递合并适当数量的文件。
这是一种通用算法。
这是利用数据的特殊属性的地方。由于数字是唯一的并且范围有限,算法可以第一次读取文件,从该范围的前四十分之一中提取数字,对它们进行排序和写入;然后它提取范围的第二十四,然后是第三,......,然后是最后的第四十。
这是一种特殊用途算法,利用数字的性质。