eg - 資料結構與演算法分析
外部排序
noteton
大部分內部排序演算法都用到記憶體可直接定址的事實。如果輸入資料再磁碟上,那麼所有這些操作都失去了它們的效率,因為磁帶上的元素只能被順序訪問。
外排序通常採用的是一種「排序-歸併」的策略。在排序階段,先讀入能放在記憶體中的資料量,將其排序輸出到乙個臨時檔案,依次進行,將待排序資料組織為多個有序的臨時檔案。而後在歸併階段將這些個臨時檔案組合成乙個大的有序檔案,也即排序結果。
外部排序的乙個例子是外歸併排序(external merge sort),它先讀入一些能夠在記憶體中放得下的資料量,在記憶體中排序後輸出為乙個順串(即內部資料有序的臨時檔案),處理完所有的資料後在進行歸併。
比如:要對900mb的資料進行排序,但機器上只有100mb的可用記憶體時,外歸併排序按如下方法操作:
1. 讀入100mb的資料至記憶體中,用某種常規排序(如:快速排序、堆排序、歸併排序等)在記憶體中完成排序。
2. 將排序完成的資料寫入磁碟(臨時檔案)。
3. 重複步驟1和步驟2直到所有的資料都存入了不同的100mb的塊(臨時檔案)中。本例中,900mb資料,100mb記憶體,故產生了9個臨時檔案。
4. 讀入每個臨時檔案(順串)的前10mb(=100mb/(9塊+1),在進行多路歸併的時候,這裡有9路,然後輸出緩衝算乙個,所以要將記憶體資源分給10個部分)的資料放入記憶體中的輸入緩衝區(總計90mb),最後的10mb作為輸出緩衝區。(實踐中,將輸入緩衝適當調小,而適當增大輸出緩衝區能獲得比較好的效果)
5. 執行九路歸併演算法,將結果輸出到輸出緩衝區。一旦輸出緩衝區滿,將緩衝區中的資料寫到目標檔案,清空緩衝區。一旦9個輸入緩衝區的乙個變空,就從這個緩衝區關聯的檔案中讀入下乙個10mb資料,除非這個檔案已讀完。這是「外歸併排序」能在主存外完成排序的關鍵步驟——因為「歸併演算法(merge algorithm)」對每乙個大塊只是順序地做一輪訪問(進行歸併),每個大塊不用完全載入主存。
1-3步是排序,4-5步是歸併。
為了增加每乙個有序的臨時檔案的長度,可以採用置換選擇排序(replacement selection sorting)。它可以產生大於記憶體的順串。具體方法是在記憶體中使用乙個最小堆進行排序,設這個最小堆的大小為m,演算法描述如下:
1. 初始時將輸入檔案讀入記憶體,建立最小堆。
2. 將堆頂元素輸出至輸出緩衝區。然後讀入下乙個記錄。
2.1 若該元素的關鍵碼值不小於剛輸出的關鍵碼值,將其作為堆頂元素並調整堆,使之滿足對的性質。
2.2 若該元素的關鍵碼值大於剛輸出的關鍵碼值,將新元素放入堆底位置,將堆的大小減1。
3. 重複第2步,直至堆大小變為0。
4. 此時乙個順串已經產生。將堆中的所有元素建堆,開始生成下乙個順串。
此方法能生成平均長度為2m的順串(證明???),可以進一步減少訪問外部儲存器的次數,節約時間,提高演算法效率。
上述例子的外排序主要有兩個步驟:排序和歸併;我們用一次多路歸併就完成了所以臨時檔案的歸併,並非按照內排序那樣利用記憶體而採用二路歸併,一次歸併兩個字串,耗費lo
g2n次歸併。外排序中不適合這種二路排序的原因是每次讀寫都要對硬碟進行讀寫,非常緩慢,要極力減少對磁碟的讀寫次數。
不過,在上述方法中也存在權衡的問題。當臨時檔案(順串)的數量繼續增大時,歸併時每次從順串中讀入的資料減少了。比如說,50gb的資料量,100mb的可用記憶體,這種情況下用一趟多路歸併就顯得不划算。因為讀入很多的順串花費的時間佔據了排序時間的大部分。這時,我們可以考慮用多次(比如兩次)歸併來解決問題。(注意多次歸併和多路歸併的區別)
這時排序演算法變為下述這樣:
1. 第一步不變:初始時將輸入檔案讀入記憶體,建立最小堆。
2. 將小的順串合併為大一些的順串,適當減少順串的數目。
3. 將剩餘的大一些的順串歸併為最終結果。
即先歸併小的順串成較大的順串,然後再歸併大一些的順串至最終結果。和內排序一樣,高效的外排序所耗的時間依然是o(
nlog
n)。若利用好現在計算機上gb的記憶體,可使得時間複雜度彙總的對數項增長比較緩慢。
計算機科學家吉姆·格雷的sort benchmark**用不同的硬體、軟體環境測試了實現方法不同的多種外排序演算法的效率。效率較高的演算法具有以下的特徵:
1. 平行計算
· 用多個磁碟驅動器並行處理資料,可以加速順序磁碟讀寫。
·在計算機上使用多執行緒,可在多核心的計算機上得到優化。
·使用非同步輸入輸出,可以同時排序和歸併,同時讀寫。
·使用多計算機用高速網路連線,分擔計算任務。
2. 提高硬體速度
·增大記憶體,減小磁碟讀寫次數,減少歸併次數。
·使用快速的外存裝置,比如15000rpm的硬碟或固態硬碟。
·使用效能更加優良的各種裝置,比如使用多核心cpu和延遲時間更短的記憶體。
3. 提高軟體速度
·對於某些特殊資料,在第一階段的排序中使用基數排序。
·壓縮輸入輸出和臨時檔案。
外歸併排序法並不是唯一的外排序演算法,另外還有外分配排序,其原理類似於內排序中的桶排序。在歸併排序和桶排序之間存在數學上的對偶性。此外還有一些不耗費附加磁碟空間的原地排序演算法。
主要參照wiki的外排序;
看到v_july_v大牛的部落格,對這類問題有乙個更詳細的總結,於是,決心另擬一篇博文作為拜讀大牛作品的筆記。
排序之外部排序
有時,待排序的檔案很大,計算機記憶體不能容納整個檔案,這時候對檔案就不能使用內部排序了 這裡做一下說明,其實所有的排序都是在記憶體中做的,這裡說的內部排序是指待排序的內容在記憶體中就可以完成,而外部排序是指待排序的內容不能在記憶體中一下子完成,它需要做內外存的內容交換 外部排序常採用的排序方法也是歸...
排序之外部排序
有時,待排序的檔案很大,計算機記憶體不能容納整個檔案,這時候對檔案就不能使用內部排序了 這裡做一下說明,其實所有的排序都是在記憶體中做的,這裡說的內部排序是指待排序的內容在記憶體中就可以完成,而外部排序是指待排序的內容不能在記憶體中一下子完成,它需要做內外存的內容交換 外部排序常採用的排序方法也是歸...
排序(二 外部排序
一 定義 外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,待排序的檔案無法一次裝入記憶體,需要在記憶體和外部儲存器之間進行多次資料交換,以達到排序整個檔案的目的。二 處理過程 1 按可用記憶體的大小,把外存上含有n個記錄的檔案分成若干個長度為l的子檔案,把這些子檔案依次讀入記憶體,並利用...