今天要給100億個數字排序,100億個 int 型數字放在檔案裡面大概有 37.2gb,很是大,記憶體一次裝不下了。那麼確定是要拆分紅小的檔案乙個乙個來處理,最終在合併成乙個排好序的大檔案。
1.把這個37gb的大檔案,用雜湊分紅1000個小檔案,每乙個小檔案平均38mb左右(理想狀況),把100億個數字對1000取模,模出來的結果在0到999之間,每乙個結果對應乙個檔案,因此我這裡取的雜湊函式是 h = x % 1000,雜湊函式取得」好」,能使衝突減少,結果分布均勻。
2.拆分完了以後,獲得一些幾十mb的小檔案,那麼就能夠放進記憶體裡排序了,能夠用快速排序,歸併排序,堆排序等等。
3.1000個小檔案內部排好序以後,就要把這些內部有序的小檔案,合併成乙個大的檔案,能夠用二叉堆來作1000路合併的操做,每乙個小檔案是一路,合併後的大檔案仍然有序。函式
首先遍歷1000個檔案,每乙個檔案裡面取第乙個數字,組成 (數字, 檔案號) 這樣的組合加入到堆裡(假設是從小到大排序,用小頂堆),遍歷完後堆裡有1000個 (數字,檔案號) 這樣的元素
而後不斷從堆頂拿元素出來,每拿出乙個元素,把它的檔案號讀取出來,而後去對應的檔案裡,加乙個元素進入堆,直到那個檔案被讀取完。拿出來的元素固然追加到最終結果的檔案裡。
按照上面的操做,直到堆被取空了,此時最終結果檔案裡的所有數字就是有序的了。
最後我用c++寫了個實驗程式,具體**在這裡能夠看到。
如何拆分大檔案?乙個32g的大檔案,用fopen()開啟不會所有載入到記憶體的,而後for迴圈遍歷啊,把每乙個數字對1000取模,會獲得0到999種結果,而後每種結果在寫入到新的檔案中,就拆分了。
**:
100億個數字排序
今天要給100億個數字排序,100億個 int 型數字放在檔案裡面大概有 37.2gb,非常大,記憶體一次裝不下了。那麼肯定是要拆分成小的檔案乙個乙個來處理,最終在合併成乙個排好序的大檔案。1.把這個37gb的大檔案,用雜湊分成1000個小檔案,每個小檔案平均38mb左右 理想情況 把100億個數字...
100億資料找出最大的1000個數字
這是網際網路領域乙個比較經典的演算法問題 top k 如何在巨大的資料中找出最大,或者訪問量最高的前10個,前100個或者前1000個資料。比如在2億使用者記錄中找出信用等級最高的,在上億個搜尋詞彙中找出被搜尋次數最高的10個關鍵字。前提是資料儲存在檔案中 一般遇到這個問題,第一反應會想到排序,但是...
100億資料找出最大的1000個數字
轉於 1 最容易想到的方法是將資料全部排序。該方法並不高效,因為題目的目的是尋找出最大的10000個數即可,而排序卻是將所有的元素都排序了,做了很多的無用功。2 區域性淘汰法。用乙個容器儲存前10000個數,然後將剩餘的所有數字一一與容器內的最小數字相比,如果所有後續的元素都比容器內的10000個數...