N路合并的算法

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

让我们说,我有N个文件,每个排序了1百万个整数。
我必须将它们合并成1个单一的文件,这将有这100万个排序的整数。

请记住,这个问题的用例实际上是基于磁盘的外部排序。因此,在实际情况下,也会存在内存限制。因此,一次合并2个文件(99次)的朴素方法将无法工作。假设我们只有一个小的滑动窗口可用于每个数组。

我不知道是否已经有一个标准化的解决方案这种N路合并。 (谷歌没有告诉我很多)。

但如果你知道一个好的n路合并算法,请张贴algo /链接。

时间复杂度:如果我们大大增加要合并的文件数(N),那么会如何影响算法的时间复杂性?

感谢您的答案。

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

如下的想法:

>创建优先级队列
>遍历每个文件f

>使用第一值作为优先级密钥将对(nextNumberIn(f),f)排队

>队列不为空

>队列头(m,f)
>输出m
>如果f没有耗尽

> enqueue(nextNumberIn(f),f)

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

假设所有文件具有非空的数字序列,则M> N,因此整个算法应该是O(M×log N)。

http://stackoverflow.com/questions/5055909/algorithm-for-n-way-merge

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:N路合并的算法