我的问题是,是否有可能将(未知数量的数组)合并到一个数组中。因此我不完全知道数组的数量(不像合并两个数组合并n数组等) 签名:
> int [] merge(int k)//k is number of arrays to be merged into a one
> merge them
//and so on..
>
> return array;
答案 0 :(得分:4)
虽然可以迭代合并数组,但更有效的方法是k-way merge,这在O(nlogk)
中完成,其中k
是数组的数量n
}是使用优先级队列的元素总数。
注意:它不能比O(nlogk)
做得更好,因为如果可能的话[让我们说复杂性O(g(n))
,其中g(n)
渐近变弱nlogn
] - 然后我们可以生成以下排序算法:
sort(array A):
split A into n arrays, each of size 1, B1,...,Bn
A <- special_merge(B1,...Bn)
return A
很容易看出这个算法具有复杂性O(g(n) + n) = O(g(n))
,我们得到了一个矛盾,因为我们得到了比O(nlogn)
更好的排序 - 这对于基于隔离的算法是不可能的,因为这问题是Omega(nlogn)
答案 1 :(得分:3)
如果你知道如何合并2个数组,那么你可以合并任意数量的数组;)
答案 2 :(得分:1)
当然,将数组1与数组2合并,将数组1 + 2与数组3合并,将数组1 + 2 + 3与数组4合并,直到没有数组为止。您只需要一个合并2个数组的方法,以及一个用数组列表调用它的方法,直到列表为空。
答案 3 :(得分:0)
是的,对于k
数组,它通常可以使用大小为k
的优先级队列来完成。队列中包含每个数组中的一个元素(以及用于记住元素来自哪个数组的标记。)
最初,队列中填充了每个数组中的最小元素。然后你只是迭代地从队列中删除最小元素,然后从最后一个最小元素来自的数组中将下一个元素添加到队列中。
假设pqueue的标准堆实现,这会产生O(nlog(k))复杂度。