簡體   English   中英

使用Java中的PriorityQueue的第k個最小數的時間復雜度

[英]Time complexity of k-th smallest number using PriorityQueue in Java

我正在嘗試解決流行的面試問題。 Find the k-th smallest number in an array of distinct integers 我閱讀了一些解決方案,發現堆數據結構非常適合此問題。

因此,我嘗試使用Collections框架的PriorityQueue類來實現一種解決方案,假設它在功能上與堆相同。

這是我嘗試過的代碼:

public static int getKthMinimum(int[] input, int k){
    PriorityQueue<Integer> heap = new PriorityQueue<Integer>();

    // Total cost of building the heap - O(n) or O(n log n) ?
    for(int num : input){
        heap.add(num);      // Add to heap - O(log n)
    }

    // Total cost of removing k smallest elements - O(k log n) < O(n) ?
    while(k > 0){
        heap.poll();        // Remove min - O(log n)
        k--;
    }
    return heap.peek();     // Fetch root - O(1) 
}

基於docs ,poll&add方法花費O(log n)時間,而peek花費恆定時間。

  1. while循環的時間復雜度是多少? (我認為O(k log n))。
  2. 就此問題而言,是否應認為O(k log n)高於O(n)? 是否有切換閾值?
  3. 該代碼的總時間復雜度是多少? 會是O(n)嗎?
  4. 如果尚未使用O(n),是否可以使用PriorityQueue類在O(n)中解決該問題?

1. while循環的時間復雜度是多少? (我認為O(k log n))。

Ok log n )是正確的。

2.就此問題而言,是否應認為O(k log n)高於O(n)? 是否有切換閾值?

您不能認為那樣。 k可以介於0到n -1之間,這意味着k log n可以介於0到n log n之間

3.該代碼的總時間復雜度是多少? 會是O(n)嗎?

On log n ),因為這是構建堆的成本。

可以在On )的時間內建立一個堆,但是您的代碼卻沒有這樣做。 如果是這樣,您的總復雜度將為On + k log n )或等效地為O (MAX( nk log n ))。

4.如果尚未使用O(n),是否可以使用PriorityQueue類在O(n)中進行求解?

否。在最壞的情況下,存在選擇算法 On ),但是它們有點復雜,並且不使用PriorityQueue

最快的基於PriorityQueue的解決方案將需要O (MAX( nn log MIN( kn - k )))時間。 (關鍵是在迭代時僅將k個最小元素保留在堆中,或者n - k個最大元素並使用最大堆,如果k足夠大,則值得使用。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM