合并未知数量的数组

时间:2012-03-30 09:45:44

标签: algorithm mergesort

我的问题是,是否有可能将(未知数量的数组)合并到一个数组中。因此我不完全知道数组的数量(不像合并两个数组合并n数组等) 签名:

  > int [] merge(int k)//k is number of arrays to be merged into a one
    > merge them 
     //and so on..
    > 
    > return array;

4 个答案:

答案 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))复杂度。

相关问题