第k大的數,前k大的數

2022-05-10 12:14:01 字數 663 閱讀 7214

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...