1
的在this post on how to find the K largest of N elements提出的第二方法的複雜性是:什麼是這種方法的尋找k個最大N個
- 商店前k在臨時數組臨時[0..k-1]的元素。
- 查找temp []中的最小元素,讓最小元素爲min。
- 對於arr [k]到arr [n-1]中的每個元素x如果x大於min,則從temp []中移除min並插入x。溫度的
- 打印最後k個元素[]
雖然我理解的方式,我不明白他們O((n-k)*k)
計算 時間複雜度。
從我的角度來看,您正在對n-k
元素進行線性遍歷並對每個元素進行單一比較。然後可能替換K
元素的臨時數組中的一個元素。
更具體地說,O((n-k)*k)
的O((n-k)*k)
計算的 時間複雜度的*k
方面從哪裏來?爲什麼他們乘以n-k
?
也許是因爲你必須臨時數組(K)與初始陣列的每個剩餘元素中的每個元素進行比較(N - k)的,即K *(N - k)。看起來算法描述有點不對,因爲如果我沒有弄錯,你必須重複步驟#2和#3: – Ivan
使用最大堆來存儲數字,那麼總的複雜度就是'O(n )'爲build-heap和'O(k * lg(n))'找到k個最大的元素。 –
@SandipanDey或更好,但爲第一個_k_元素構建最小堆,然後爲_(nk)logk_時間執行_(nk)_插入和刪除 - 分鐘,然後爲另一個_klogk_執行_k_ find-mins和delete-mins _nlogk_時間。 –