外部排序演算法整理

2021-06-14 17:39:02 字數 2914 閱讀 6148

今天看了些排序相關的綜述,裡面介紹了一種外排演算法——置換選擇排序演算法,讀了之後雲裡霧裡的。於是乎谷狗了一下,學習了學習維基百科上關於外排的介紹,感覺還不錯,確實解決了心中的疑問。其中,外歸併排序和置換選擇排序都講得很清楚,還提供了一些不錯的鏈結,如jim gray的sort benchmark**,故在部落格中mark一下,以表感謝!

外排序外排序(external sorting)是指能夠處理極大量資料的排序演算法。通常來說,外排序處理的資料不能一次裝入記憶體,只能放在讀寫較慢的外儲存器(通常是硬碟)上。外排序通常採用的是一種「排序-歸併」的策略。在排序階段,先讀入能放在記憶體中的資料量,將其排序輸出到乙個臨時檔案,依此進行,將待排序資料組織為多個有序的臨時檔案。爾後在歸併段階將這些臨時檔案組合為乙個大的有序檔案,也即排序結果。

[隱藏] 

2其他演算法

3外部鏈結4參考

外排序的乙個例子是外歸併排序(external merge sort),它讀入一些能放在記憶體內的資料量,在記憶體中排序後輸出為乙個順串(即是內部資料有序的臨時檔案),處理完所有的資料後再進行歸併。[1]

[2]比如,要對 900 

mb的資料進行排序,但機器上只有 100 mb 的可用記憶體時,外歸併排序按如下方法操作:

讀入 100 mb 的資料至記憶體中,用某種常規方式(如快速排序、堆排序、歸併排序等方法)在記憶體中完成排序。

將排序完成的資料寫入磁碟。

重複步驟 1 和 2 直到所有的資料都存入了不同的 100 mb 的塊(臨時檔案)中。在這個例子中,有 900 mb 資料,單個臨時檔案大小為 100 mb,所以會產生 9 個臨時檔案。

讀入每個臨時檔案(順串)的前 10 mb ( = 100 mb / (9 塊 + 1))的資料放入記憶體中的輸入緩衝區,最後的 10 mb 作為輸出緩衝區。(實踐中,將輸入緩衝適當調小,而適當增大輸出緩衝區能獲得更好的效果。)

執行九路歸併演算法,將結果輸出到輸出緩衝區。一旦輸出緩衝區滿,將緩衝區中的資料寫出至目標檔案,清空緩衝區。直至所有資料歸併完成。

為了增加每乙個有序的臨時檔案的長度,可以採用置換選擇排序(replacement selection sorting)。它可以產生大於記憶體大小的順串。具體方法是在記憶體中使用乙個最小堆進行排序,設該最小堆的大小為 

初始時將輸入檔案讀入記憶體,建立最小堆。

將堆頂元素輸出至輸出緩衝區。然後讀入下乙個記錄:

若該元素的關鍵碼值不小於剛輸出的關鍵碼值,將其作為堆頂元素並調整堆,使之滿足堆的性質;

否則將新元素放入堆底位置,將堆的大小減 1。

重複第 2 步,直至堆大小變為 0。

此時乙個順串已經產生。將堆中的所有元素建堆,開始生成下乙個順串。[3]

此方法能生成平均長度為 

上述例子的外排序有兩個步驟:排序和歸併。我們用一次多路歸併就完成了所有臨時檔案的歸併,而並非按記憶體中的二路歸併那樣,一次歸併兩個子串,耗費 

不過,在上述方法中也存在權衡。當臨時檔案(順串)的數量繼續增大時,歸併時每次可從順串中讀入的資料減少了。比如說,50 gb 的資料量,100 mb 的可用記憶體,這種情況下用一趟多路歸併就顯得不划算。讀入很多的順串花費的時間佔據了排序時間的大部分。這時,我們可以用多次(比如兩次)歸併來解決這個問題。

這時排序演算法變為下述這樣:

第一步不變。

將小的順串合併為大一些的順串,適當減小順串的數目。

將剩餘的大一些的順串歸併為最終結果。

和內排序一樣,高效的外排序所耗的時間依然是 

計算機科學家吉姆·格雷的 

sort benchmark

提高硬體速度

提高軟體速度

外歸併排序法並不是唯一的外排序演算法。另外還有外分配排序,其原理類似於內排序中的桶排序。在歸併排序和桶排序之間存在數學上的某種對偶性。[6]

此外還有一些不耗費附加磁碟空間的原地排序演算法。

^

donald knuth, 

the art of computer programming, volume 3: 

sorting and searching, second edition. addison-wesley, 1998, 

isbn 0-201-89685-0, section 5.4: external sorting, pp.248–379.

^

* ellis horowitz

and 

sartaj sahni, 

fundamentals of data structures, h. freeman & co., 

isbn 0-7167-8042-9.

^

張銘、王騰蛟、趙海燕. 資料結構與演算法. 北京: 高等教育出版社. 2008:  pp.246-248. 

isbn

978-7-04-023961-4.

^

nikolas askitis, 

ozsort 2.0: sorting up to 252gb for a penny

^

rasmussen et al., 

tritonsort

^

j. s. vitter, 

algorithms and data structures for external memory

, series on foundations and trends in theoretical computer science, now publishers, hanover, ma, 2008, 

isbn 978-1-60198-106-6.

外部排序演算法整理

的。於是乎谷狗了一下,學習了學習維基百科上關於外排的介紹,感覺還不錯,確實解決了心中的疑問。其中,外歸併排序和置換選擇排序都講得很清楚,還提供了一些不錯的鏈結,如jim gray的sort benchmark 故在部落格中mark一下,以表感謝!外排序外排序 external sorting 是指能...

外部排序演算法

外部排序指的是大檔案的排序,即待排序的記錄儲存在外儲存器上,在排序過程中需進行多次的內 外存之間的交換。一般情況下 其中tio取決於所用的外存裝置,顯然tio較tmg要大得多。因此,提高外排的效率應主要著眼於減少外存資訊讀寫的次數d。需要歸併的次數越少,讀寫的次數d越小。因此我們使用k 路平衡歸併的...

外部排序 簡單演算法

資料結構與演算法分析 c語言描述 第七章 外部排序簡單演算法 雖然是用了歸併,涉及到檔案,還是挺麻煩的。檔案讀取之後是不用fseek的話是不能返回的,並且檔案我是用文字儲存數字,每個數字的字元長度不一樣,不能像陣列那樣隨機讀取存放,只能乙個乙個的讀。include include include f...