一尘不染

N路合并算法

algorithm

作为Mergesort算法的一部分,广泛研究了2路合并。但是我有兴趣找出执行N路合并的最佳方法吗?

可以说,我有一些N文件,每个文件都排序了100万个整数。我必须将它们合并到1个单个文件中,该文件将具有1亿个排序整数。

请记住,此问题的用例实际上是基于磁盘的外部排序。因此,在实际情况下也将存在内存限制。因此,一次(99次)合并2个文件的幼稚方法将不起作用。可以说,每个数组只有一个很小的可用内存滑动窗口。

我不确定该N路合并是否已有标准化的解决方案。 (谷歌搜索并没有告诉我太多)

但是,如果您知道一个好的n路合并算法,请发布算法/链接。

时间复杂度: 如果我们大大增加了N要合并的文件()的数量,这将如何影响算法的时间复杂度?

感谢您的回答。

在任何地方都没有问过我这个问题,但是我觉得这可能是一个有趣的面试问题。 因此加了标签。


阅读 292

收藏
2020-07-28

共1个答案

一尘不染

以下想法如何:

  1. 创建优先级队列

  2. 遍历每个文件 f

    1. 使用第一个值作为优先级键 将对(nextNumberIn(f),f) 排队
  3. 虽然队列不为空

    1. 出队头 (M,F) 队列的
    2. 输出 m
    3. 如果 f 没有耗尽
    4. 入队 (nextNumberIn(f),f)

由于可以在对数时间内将元素添加到优先级队列,因此项目2为 O(N×log N)
。由于while循环的(几乎所有)迭代都会添加一个元素,因此整个while循环为 O(M×log N) ,其中 M 是要排序的总数。

假设所有文件都有一个非空数字序列,则我们有 M > N,因此整个算法应为 O(M×log N)

2020-07-28