【问题标题】:What is the runtime complexity of this K-way merge routine?这个 K-way 合并例程的运行时复杂度是多少?
【发布时间】:2016-01-17 20:38:51
【问题描述】:

这似乎是 O(n log(k)),其中 k 是网格的宽度,n 是深度(假设是平滑网格或网格中的元素总数,如果它是锯齿状的)。对吗?

public class KWayMerge {

  private int[] merge(int[][] grid) {
    return merge(grid, 0, grid.length - 1);
  }

  // O(n log k) wehre k is the width of the grid and n is the depth (assuming smooth grid)
  private int[] merge(int[][] grid, int start, int end) {
    if (end == start) {
      return grid[end];
    } else if (end - start == 1) {
      return merge(grid[end], grid[start]);
    } else {
      return merge(merge(grid, start, (end + start) / 2), merge(grid, ((end + start) / 2) + 1, end));
    }
  }

  private static int[] merge(int[] left, int[] right) {
    int[] result = new int[left.length + right.length];
    int lPos = 0, rPos = 0, pos = 0;
    while(true) {
      if (lPos >= left.length) {
        System.arraycopy(right, rPos, result, pos, right.length - rPos);
        break;
      } else if (rPos >= right.length) {
        System.arraycopy(left, lPos, result, pos, left.length - lPos);
        break;
      }

      if (left[lPos] < right[rPos]) {
        result[pos] = left[lPos];
        lPos++;
      } else {
        result[pos] = right[rPos];
        rPos++;
      }

      pos++;
    }

    return result;
  }
}

【问题讨论】:

  • 示例代码似乎是矩阵行的 2 路合并。 k-way 合并一般是指一次合并两个以上元素的合并排序。例如,4 路合并 (k == 4) 一次合并 4 个元素,对从一组 4 合并的每个元素使用 3 次比较(或优先级队列)。当它到达运行结束时,它下降到 3方式合并,然后 2 方式合并,然后是最后剩余运行的其余部分的副本。

标签: algorithm sorting merge time-complexity


【解决方案1】:

你的复杂度 O(NKLogK)

例如,您有 8 个大小为 N 的数组:

您将有以下合并: 迭代 #1:

  1. 12 (2*N)
  2. 34 (2*N)
  3. 56 (2*N)
  4. 78 (2*N)

迭代 #2:

  1. 1234 (4*N)
  2. 5678 (4*N)

迭代 #3: 1. 12345678 (8*N)

完全: 你有以下复杂性 K/2 * (2*N) K/4 * (4*N) K/8 * (8*N)

then = K*N 和 LogK 计数。

总复杂度为 O(KN*LogK) 其中K个数组,N是数组的平均大小。

【讨论】:

    猜你喜欢
    • 2019-06-08
    • 2013-09-09
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2022-09-22
    相关资源
    最近更新 更多