【发布时间】: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