多路歸併 大資料處理
阿新 • • 發佈:2018-12-12
問題描述:
輸入:給定一個檔案,裡面最多含有n個不重複的正整數(也就是說可能含有少於n個不重複正整數),且其中每個數都小於等於n,n=10^7。 輸出:得到按從小到大升序排列的包含所有輸入的整數的列表。 條件:最多有大約1MB的記憶體空間可用,但磁碟空間足夠。且要求執行時間在5分鐘以下,10秒為最佳結果。
分析檔案大小:
10^7 = 1000,0000 = 10,000,000 一個數據=1B,那麼大約為10M
歸併排序(二路歸併排序):
你可能會想到把磁碟檔案進行歸併排序,但題目要求你只有1MB的記憶體空間可用,所以,歸併排序這個方法不行。
最終解決辦法:
外排序(快速排序+多路歸併排序):
記憶體中快速排序
- 由於要求的可用記憶體為1MB,那麼每次可以在記憶體中對250K的資料進行排序,然後將有序的數寫入硬碟。
- 那麼10M的資料需要迴圈40次,最終產生40個有序的檔案。
多路歸併排序
- 將每個檔案最開始的數讀入(由於有序,所以為該檔案最小數),存放在一個大小為40的first_data陣列中;
- 選擇first_data陣列中最小的數min_data,及其對應的檔案索引index;
- 將first_data陣列中最小的數寫入檔案result,然後更新陣列first_data(根據index讀取該檔案下一個數代替min_data);
- 判斷是否所有資料都讀取完畢,否則返回2。
多路歸併程式的流程圖:
第一步、Memory Sort。