今天要給100億個數字排序,100億個 int 型數字放在檔案裡面大概有 37.2gb,非常大,記憶體一次裝不下了。那麼肯定是要拆分成小的檔案乙個乙個來處理,最終在合併成乙個排好序的大檔案。
1.把這個37gb的大檔案,用雜湊分成1000個小檔案,每個小檔案平均38mb左右(理想情況),把100億個數字對1000取模,模出來的結果在0到999之間,每個結果對應乙個檔案,所以我這裡取的雜湊函式是 h = x % 1000,雜湊函式取得」好」,能使衝突減小,結果分布均勻。
2.拆分完了之後,得到一些幾十mb的小檔案,那麼就可以放進記憶體裡排序了,可以用快速排序,歸併排序,堆排序等等。
3.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個數...