外部排序相關演算法知識

2021-07-01 23:16:57 字數 1379 閱讀 9536

這種方法是根據記憶體的大小將乙個大的檔案資料分成多個長度為l的檔案(又叫做順串),然後分別將每個順串讀入記憶體進行排序(注:可以選用任何一種排序方法)之後輸出到外存中,將已經拍好序的進行多路歸併排序。即從每順串中取出第乙個數比較大小,並找個最小的那個數,將這個數充順串中刪除並輸出,以後按此迴圈即可。

勝者樹

在上面的多路歸併的方法中,如果有k個順串,每次有k個候選值,要找出其中的最小值,普通的做法需要進行k-1次比較,而使用敗者樹,則只需要o(logk)次比較,其原理就像我們平常的分組比賽,乙個參賽者在小組出線之後,只需要與其他小組出線的參賽者比賽即可決出最後的冠軍(最值),而不需要和其他所有參賽者都比一遍。

選擇置換演算法用於生成順串,在有限的記憶體限制下,它可以生成大概兩倍於記憶體大小的順串,其演算法步驟如下:

假設記憶體中只有乙個能容納n個整型的陣列:

首先從輸入檔案中讀取n個數字將陣列填滿

使用陣列中現有資料構建乙個最小堆

重複以下步驟直到堆的大小變為0:

a.把根結點的數字a(即當前陣列中的最小值)輸出

b. 從輸入檔案中再讀出乙個數字b,若r比剛輸出的數字a 大,則將b放到堆的根節點處,若b不比a大,則將堆的最後乙個元素移到根結點,將b放到堆的最後乙個位置,並把堆的大小縮減1(即新讀入的資料沒有進入堆中)

c. 在根結點處呼叫siftdown重新維護堆

換乙個輸出檔案,重新回到步驟(2)

解釋:在以上演算法執行過程中,步驟(3)每從最小堆中輸出乙個最小值,就從輸入檔案中再讀入乙個資料,若新讀入的數比剛輸出的數大,則可以屬於當前的順串,將其放入堆中即可,否則只能屬於下乙個順串,需將其放在堆外,在執行過程中,堆的大小逐漸縮減直到0,此時就輸出了乙個順串,而陣列中新的數則可以用於構造乙個新的堆,如此迴圈即可將原先的乙個大檔案轉化成乙個大概2n的順串。至於為什麼是2n,有乙個比較抽象的模擬證明:

假設在一條環形跑道上有一輛鏟雪車在鏟雪,且空中還在均勻地下著雪,那麼當鏟雪車已經沿著跑道開過一圈後,只要車速和降雪速度恆定,則跑道上的積雪量s也恆定,且車後積雪量最少,車前積雪量最多,如下圖a。在這種情況下,設鏟雪車每開一圈的時間,降雪量為x,車鏟雪量為y,則x,y滿足s+x - y =s,即x = y,又因為在鏟雪車開一圈的過程中,鏟掉的雪為原有的積雪加上降雪的一半,所以y = s + x/2, 所以y = 2s,即鏟雪車鏟掉了2s的雪量。而在選擇置換中,陣列的大小就相當於s,剷雪量就相當於輸出順串的大小,即2倍陣列大。這個證明雖然有點抽象,但實際中只要輸入檔案中的數字是隨機分布的,得到的順串大小的確大概是所用陣列大小的兩倍。

外部排序的相關知識

段 segment 歸併段或者順串 run 實現多路歸併的敗者樹,敗者樹是完全二叉樹,且不含葉子,可採用順序儲存結構實現 typedef int size typedef char line 81 此時line型別代表了具有81個元素的字元陣列,使用方法如 line text,secondline ...

外部排序演算法

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

外部排序演算法整理

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