划分和征服策略以合并多个排序的数组

时间:2015-08-26 06:04:06

标签: algorithm merge divide-and-conquer

使用分而治之的策略如何将每个具有n个元素的k个排序数组合并为一个k * n个元素的数组?

了解到目前为止:我对分割和征服的步骤有了一些了解:

将数组列表分成两个列表,每个列表为k / 2个数组。递归合并 2个列表中的数组,最后将得到的2个排序数组合并到输出数组中。

需要一些想法和帮助!!

public int[] merge(int[][] arrays){
int k = arrays.length;
int n = arrays[0].length;
if size(arrays) == 1:
return arrays.pop()
else
// For longer lengths split the array into two
  int half = arrays.length / 2;
  int[] first_Half = new int[half];
  int[] second_Half = new int[lists.length - half];  
  return merge(merge(first_half),merge(second_half));

我尝试将2-Dim数组作为列表列表传递,并将我的第一和第二半更改为2 Dim。建议使用数组,但我收到错误:&#34; Merge类型中的方法kWayMerge(List<List>)不适用于kWayMerge方法上的参数(int[][])

以下是所做的更改。对于常规合并,我可以使用Arrays.copyOfclone()方法吗?

// solve the problem separately in each sub-array
            List a = kWayMerge(firstHalf);

// K-merge operation using divide and conquer strategy

     public int[] kWayMerge(List<List>array){ // gets a list of lists as input 
            int[][] firstHalf; int[][] secondHalf;
            if(array.size() == 1) return null; // if currently have 1 array, return it - stop clause
    else {
        int half = array.size()/2;
        firstHalf = new int[half][];
        secondHalf = new int[array.size()-half][];
        // solve the problem separately in each sub-array
        List a = kWayMerge(firstHalf);

    }
     return merge((firstHalf ),(secondHalf));   
}

public int[] merge(int[][] arr1, int[][] arr2) {

    return null;
}

1 个答案:

答案 0 :(得分:3)

分而治之的方法是拥有一个递归函数k-way-merge(),它将列表作为输入,并在每一步:

  • 如果您当前有1个数组,请将其返回(停止子句)
  • 否则,将列表列表拆分为两个,每半个列表 - 递归调用k-way-merge()。合并两个结果列表。

您需要在代码中更改的主要方面是:

  int[] first_Half = new int[half];
  int[] second_Half = new int[lists.length - half];  

此处,您需要first_halfsecond_halfint[][],因为它们实际上是列表列表。

另外,在最后一行:

return merge(merge(first_half),merge(second_half));

请注意,外部merge()不同,它不是递归调用 - 而是调用&#34;常规&#34; merge(),将两个数组合并为一个(因为代码中缺少关于如何执行此操作的逻辑,我假设您实现了这样的merge())。

除此之外,该方法看起来正确,但效率有点低,因为每次迭代都会复制int[][]对象,而不是使用索引来记住你在哪里&#34;。