1. 程式人生 > >有10億個雜亂無章的數,怎樣最快地求出其中前1000大的數

有10億個雜亂無章的數,怎樣最快地求出其中前1000大的數

 

1)方法1

建一個1000個數的最小堆,然後依次新增剩餘元素,如果大於堆頂的數(堆中最小的),將這個數替換堆頂,並調整結構使之仍然是一個最小堆,這樣,遍歷完後,堆中的1000個數就是所需的最大的1000個。演算法的時間複雜度為O(nlogk)=n*log1000=10n(n為10億,k為1000)。
優化的方法:分治法。可以把所有10億個資料分組存放,比如分別放在1000個檔案中。這樣處理就可以分別在每個檔案的10^6個數據中找出最大的10000個數,合併到一起再找出最終的結果。
優化的方法:如果這10億個數裡面有很多重複的數,先通過Hash法,把這10億個數字去重複,這樣如果重複率很高的話,會減少很大的記憶體用量,從而縮小運算空間,然後通過分治法或最小堆法查詢最大的1000個數。
---------------------
原文:https://blog.csdn.net/jiangyanting2011/article/details/70325215
2)方法2

藉助於一個1000大小的陣列,以資料流的形式讀入資料,如果讀入的資料少於1000,將這些資料按從小到大的順序進行排序。然後當讀入的資料多餘1000的時候,與最小的資料進行比較,如果比陣列中最小的數都小,則繼續讀入後續資料;如果比最小的數大,則去掉陣列中最小的資料,並將該資料插入陣列中相應的位置(相當於對資料進行一次遍歷),直到所有的資料讀完,最後陣列中的數就是前1000大的資料。

方法2 相比方法1 時間複雜度高,方法2時間複雜度:O(n*k)