使用堆{K}最小的时间复杂度

时间:2017-02-11 18:47:39

标签: java heap big-o

以下是使用堆查找数组中第k个最小元素的代码。时间复杂度为O(n log(k)),其中k是堆的大小。

根据我的理解,你首先要浏览整个数组,即O(n)来填充你的堆。并且,当您到达数组的末尾时,您将拥有堆顶部的第k个最小元素,您可以立即返回作为最终答案。

但是,在下面的代码中,还有一个从k开始到数组长度的额外循环。我真的不了解第二个循环的必要性。

public int findKthSmallest(int[] arr, int k ) {

    if(k <= 0 || k > arr.length) {
        throw new IllegalArgumentException();
    }

    PriorityQueue<Integer> smallestK = new PriorityQueue<>(k, Collections.reverseOrder());

    for(int i = 0; i < arr.length; i++) {
        smallestK.add(arr[i]);
    }

    for(int j = k; j < arr.length; j++) {
        if(arr[j] < smallestK.peek()) {
            smallestK.remove();
            smallestK.add(arr[j]);
        }
    }
    return smallestK.peek();
}

1 个答案:

答案 0 :(得分:2)

你读错了代码,应该是:

for(int i = 0; i < k; i++) {
    smallestK.add(arr[i]);
}

在第一个循环中,我们需要在堆中插入第一个k元素。

目前,smallestK.peek()将保持当前最小的K。

在第二个循环中,我们处理数组中的剩余元素。我们将该值与当前最小的K进行比较。