作为Mergesort算法的一部分,广泛研究了2路合并。但是我有兴趣找出执行N路合并的最佳方法吗?
可以说,我有一些N文件,每个文件都排序了100万个整数。我必须将它们合并到1个单个文件中,该文件将具有1亿个排序整数。
N
请记住,此问题的用例实际上是基于磁盘的外部排序。因此,在实际情况下也将存在内存限制。因此,一次(99次)合并2个文件的幼稚方法将不起作用。可以说,每个数组只有一个很小的可用内存滑动窗口。
我不确定该N路合并是否已有标准化的解决方案。 (谷歌搜索并没有告诉我太多) 。
但是,如果您知道一个好的n路合并算法,请发布算法/链接。
时间复杂度: 如果我们大大增加了N要合并的文件()的数量,这将如何影响算法的时间复杂度?
感谢您的回答。
在任何地方都没有问过我这个问题,但是我觉得这可能是一个有趣的面试问题。 因此加了标签。
以下想法如何:
创建优先级队列
遍历每个文件 f
虽然队列不为空
由于可以在对数时间内将元素添加到优先级队列,因此项目2为 O(N×log N) 。由于while循环的(几乎所有)迭代都会添加一个元素,因此整个while循环为 O(M×log N) ,其中 M 是要排序的总数。
假设所有文件都有一个非空数字序列,则我们有 M > N,因此整个算法应为 O(M×log N) 。