大文件小內存排序問題


比如外存中有100G的字符串文件,1G的內存,對字符串進行排序操作。
1.首先將100G的內容分成若干個小部分,每個部分不超過500MB。分別讀取這些小部分進行排序,然后寫入到外存中。這樣就得到了若干個已經排好序的小部分。
2.多路歸並排序,(相對二路歸並而言)。對於k個已經排好序的小部分,每次取出它們各自的最小值,找到最小值中的最小值,寫入到外存,同時將最小值所在外存區域指針向右移動。
每次比較最小值需要比較k-1次,總共有n-1輪,所以時間復雜度為O((n-1)*(k-1))。
這里還可以使用勝者樹(完全二叉樹)優化找最小值的過程。對第一次的查找建立一顆勝者樹,如下所示:
找到最小值后,讀取最小值所在外存區域的新值,然后修改勝者樹對應節點的值,沿着從該結點到根結點的路徑修改這棵二叉樹,最多操作log(k)次。這樣總體排序的時間復雜度就可以降為O(nlogk)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM