【问题标题】:Time complexity of Kth smallest using Heap使用堆的第 K 个最小的时间复杂度
【发布时间】:2017-06-30 00:12:46
【问题描述】:

以下是使用堆查找数组中第 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();
}

【问题讨论】:

  • 这段代码没有按照你说的做。

标签: java heap big-o


【解决方案1】:

你看错了代码,应该是:

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

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

在当前时刻,smallestK.peek() 将保存当前的最小K。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2019-04-11
    • 2022-01-22
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多