1、排序後去出前k個,o(n*log(n)) 如果k2、o(nlog(k))快排把數分為了兩個部分,所以考慮兩個情況,如果大的部分的個數》k,說明只要繼續在大的部分找就可以了,
如果大的部分的個數3、o(nlog((maxv-minv)/delta)),平均為o(nlogn) 轉化為找第k個, 假設最大的數為maxv,最小的為minv,那麼第k個數必然在[minv,maxv]這個區間中,每次二分這個區間,設mid的數為s,看陣列a中比s大的數有沒有k大來調整二分,就最後可以得到了。
如果檔案太大,每次統計midv的個數都需要讀一次檔案,完成乙個迴圈後,把新的區間存入乙個新的檔案,然後直到新的檔案可以放入記憶體。
while(maxv- minv >delta)f(a,n,midv)是找出a陣列中比midv大的數的個數
4、維護乙個k個數的小頂堆,遍歷陣列a,然後每次更新小頂堆即可 o(nlog(k)) 實際就是堆排序
if(x > h[0])
else
break
; }
}
如果k太大不能一次裝入記憶體k個數的堆,那麼選乙個可以裝入記憶體的數s,第一次找s個,然後找s個。。。直到s*i >k即可。。。但這樣要讀的陣列a的次數就必須增加了。
前k大的數
取前 k 個數,並取出最小值 mi k min k,n 遍歷 第 k 1 n的數,與 mi k 比較。若小於 mi k 遍歷下乙個。若大於 mi k 放入該值,並移除mi k 後,再次取出最小值 mi k min k,n 時間複雜度 o n k 1.將資料分成三個區間 1 k 1,k m,m 1 n...
第K大的數
這道題是我去年聽說的,一次比賽悲劇的,前幾天ac的,大體思路是二分答案,記住在統計的時候,複雜度為n,而不是nlogn,這道題複雜度為 nlog max min include include includeusing namespace std define maxn 51000 int64 a ...
第k大的數
題目 陣列a和陣列b,裡面都有n個整數。陣列c共有n 2個整數,分別是a 0 b 0 a 0 b 1 a 1 b 0 a 1 b 1 a n 1 b n 1 陣列a同陣列b的組合 求陣列c中第k大的數。例如 a 1 2 3,b 2 3 4。a與b組合成的c包括2 3 4 4 6 8 6 9 12共9...