1. 程式人生 > >9.4-外部排序+k路歸併

9.4-外部排序+k路歸併

轉自http://hawstein.com/posts/9.4.html

k路歸併可以參考leetcode題:http://blog.csdn.net/todorovchen/article/details/26366553
當面試官說到2GB檔案的時候,他其實就是在暗示你, 他並不希望一次性把所有的資料都載入記憶體。這樣子的話,我們要怎麼做呢? 我們每次就將部分資料載入記憶體就好了。

演算法:

首先我們要了解,可以用的記憶體有多大?假設我們有X MB的記憶體可用。

  1. 我們將檔案分為K份,其中X*K=2GB。每次取其中一份載入到記憶體中, 用O(nlog n)的演算法排序,然後再儲存到外部檔案。
  2. 載入下一份並排序
  3. 當我們將K份小檔案都排好序,合併它們。

上面的演算法就是外排序,步驟3又稱為N路歸併。

使用外排序是由於資料太大了,無法一次全部載入到記憶體中,所以需要藉助磁碟進行儲存, 每次只從磁碟中載入一部分資料進入記憶體,進行排序。