这个算法叫什么,时间复杂度是多少?

时间:2017-08-18 18:39:13

标签: algorithm

让我们调用可用的RAM数量。

我们有一个10个演出的未分类文件,其中包含一列键(允许重复)。

您将文件拆分为k个文件,每个文件的大小为R. 您对每个文件进行排序并将文件写入磁盘。

您从每个文件中读取(10 / R)演出到输入缓冲区。执行k-way合并,从第一个文件读取第一个键,并与输入缓冲区中的每个其他键进行比较,以找到最小值。您将此添加到输出缓冲区,该缓冲区还应保存(10 / R)数据。

输出缓冲区已满后,将其写入磁盘并将其写入最终的已排序文件。

重复此过程,直到完全读取所有k个文件。如果输入缓冲区为空,请使用其相应文件的下一个(10 / R)gigs填充它,直到文件完全被读取为止。我们可以并行执行此缓冲区重新填充。

此算法的官方名称是什么?它是K-Way Merge排序吗?

我们分成K个文件的第一部分是O((n / k)log(n / k)) 我们合并的第二部分是O(nk)?

如果我错了,我可以解释一下吗?如果这是外部合并排序,我们如何进一步优化呢?

2 个答案:

答案 0 :(得分:0)

我说它是a merge algorithm,确切的文件IO是一个实现细节。

答案 1 :(得分:0)

这是一本教科书external merge sort时间复杂度O(n log n)

这是维基百科上的条目(上面链接):

  

外部排序的一个例子是外部合并排序算法,   对每个适合RAM的块进行排序,然后合并排序的块   一起。例如,用于排序900兆字节的数据   只有100兆字节的RAM:
1)在主存储器中读取100 MB的数据   通过一些传统方法排序,如quicksort。
2)写出已排序的   数据到磁盘。
3)重复步骤1和2,直到所有数据都已排序   100 MB块(有900MB / 100MB = 9块),现在需要   合并为一个输出文件。
4)读取前10 MB(= 100MB /   (9个块+ 1))每个已排序的块进入主存储器中的输入缓冲区   并为输出缓冲区分配剩余的10 MB。 (在实践中,   它可以提供更好的性能,使输出缓冲区更大   输入缓冲区略小。)5)执行9路合并   将结果存储在输出缓冲区中。每当输出缓冲区   填充,将其写入最终排序文件并清空它。每当任何一个   9输入缓冲区清空,用下一个10 MB填充它   关联的100 MB排序块,直到块中没有更多数据   可用。这是使外部合并排序工作的关键步骤   外部 - 因为合并算法只进行一次传递   顺序通过每个块,每个块不必   完全装满;相反,块的连续部分可以   根据需要加载。

从历史上看,有时候是一种,而不是一种   替换选择算法用于执行初始   分配,平均产生一半的输出块   两倍的长度。