如何在时间O(k log k + n)中将k个新元素插入大小为n的排序列表中?
我想klogk可以通过首先对k个元素进行合并排序然后将它们插入大小为n的列表中来实现。但我缺少(+ n)部分。
答案 0 :(得分:3)
我们可以先 sort 要插入的元素,这可以通过 merge sort 或 heap sort这样的算法来完成,在 O(k log k)中。
接下来,我们可以对两个列表(或任何类型的数据结构,只要我们可以按升序对其进行迭代)进行合并。合并可以在 O(k + n)中完成,因为我们可以同时迭代两个列表,并且每次“发射”两个列表中的最小列表并前进相应的光标。
例如,对于已排序的两个数组,我们可以将它们与:
合并public static int[] merge_sorted(int[] a, int[] b) {
k = a.length;
n = b.length;
int[] c = new int[k+n];
int ai = 0;
int bi = 0;
int ci = 0;
while(ai < k && bi < n) {
if(a[ai] <= b[bi]) {
c[ci++] = a[ai++];
} else {
c[ci++] = b[bi++];
}
}
while(ai < k) {
c[ci++] = a[ai++];
}
while(bi < n) {
c[ci++] = b[bi++];
}
return c;
}
因此时间复杂度为 O(k log k + k + n),但这等于 O(k log k + k + n)。
>