[英]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花費恆定時間。
while
循環的時間復雜度是多少? (我認為O(k log n))。 1.
while
循環的時間復雜度是多少? (我認為O(k log n))。
O ( k log n )是正確的。
2.就此問題而言,是否應認為O(k log n)高於O(n)? 是否有切換閾值?
您不能認為那樣。 k可以介於0到n -1之間,這意味着k log n可以介於0到n log n之間 。
3.該代碼的總時間復雜度是多少? 會是O(n)嗎?
O ( n log n ),因為這是構建堆的成本。
可以在O ( n )的時間內建立一個堆,但是您的代碼卻沒有這樣做。 如果是這樣,您的總復雜度將為O ( n + k log n )或等效地為O (MAX( n , k log n ))。
4.如果尚未使用O(n),是否可以使用PriorityQueue類在O(n)中進行求解?
否。在最壞的情況下,存在選擇算法 O ( n ),但是它們有點復雜,並且不使用PriorityQueue
。
最快的基於PriorityQueue
的解決方案將需要O (MAX( n , n log MIN( k , n - k )))時間。 (關鍵是在迭代時僅將k個最小元素保留在堆中,或者n - k個最大元素並使用最大堆,如果k足夠大,則值得使用。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.