将K个元素插入O(klogk + n)中N个元素的排序列表中

时间:2018-12-11 21:00:48

标签: algorithm sorting time-complexity

如何在时间O(k log k + n)中将k个新元素插入大小为n的排序列表中?

我想klogk可以通过首先对k个元素进行合并排序然后将它们插入大小为n的列表中来实现。但我缺少(+ n)部分。

1 个答案:

答案 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)

>