1. 程式人生 > 其它 >【資料結構】排序——外部排序(2)

【資料結構】排序——外部排序(2)

【資料結構】排序——外部排序(2)

上一章說到減少初始歸併段數量或者是增大歸併路數,都可以減少歸併的趟數,進而減少磁碟的讀寫次數。

置換選擇排序(生成初始歸併段)

是在樹形選擇排序的基礎上得來的的,特點是在整個排序的過程中,選擇最小(或最大)關鍵字和輸入、輸出交叉或平行。

實現過程

FI:初始待排檔案。FO:初始歸併段輸出檔案。WA:記憶體工作區。FO和WA初始狀態為空,WA可容納w個記錄

  1. 從FI輸入w個記錄到工作區WA
  2. 從WA中選出其中關鍵字取最小值得記錄,極為MINMAX記錄
  3. 將MINMAX記錄輸出到FO中去
  4. 若FI不為空,則從FI輸入下一個記錄到WA中
  5. 從WA中所有關鍵字必MINMAX記錄的關鍵字大的記錄中選出最小關鍵字記錄,作為新的MINMAX記錄
  6. 重複3-5,直至WA中選不出新的MINMAX記錄為止,由此得到一個初始歸併段,輸出一個歸併段的結束標誌到FO中去
  7. 重複2-6,直至WA為空,由此得到全部初始歸併段。

手動實現過程

eg、FI={17、21、05、44、10、12、56、32、29},WA=3。

其中WA區域中MINMAX記錄選擇是利用敗者樹完成。

最佳歸併樹

由置換選擇生成樹所得初始歸併段,其各長短不等對平衡歸併有什麼影響?
若將初始歸併段的長度看成是歸併樹中葉子結點的權,顯然,歸併方案不同,所得歸併樹也不同,樹的帶權路徑長度(或外存讀寫次數)也不同。因此若對長度不同的多個初始歸併段,構造一棵哈夫曼樹作為歸併樹,便可以使在進行外部歸併時所需對外存進行的讀寫次數達到最少,這棵歸併樹成為最佳歸併樹。

結構概述

各葉結點表示一個初始歸併段,上面的權值表示該歸併段的長度;葉結點到根的路徑長度表示其參加歸併的趟數;各非葉結點代表歸併成的新歸併段;根結點表示最終生成的歸併段;樹的帶權路徑長度WPL為歸併過程中的總讀記錄數。

演算法優化

引入哈夫曼樹的思想,在歸併樹中,讓記錄少的初始歸併段最先歸併,記錄數多的初始歸併段最晚歸併,就可以建立總的讀寫次數最少的最佳歸併樹。
eg、由置換選擇排序得到的9個初始歸併段,其長度依次為{9,30,12,18,3,17,2,6,24},現作3-路平衡歸併

顯然這不是最佳方案。

演算法修正

若初始歸併段不足以構成一棵嚴格k叉樹時,則需要新增長度為0的“虛段”
按照哈夫曼樹的原則,權為0的葉子應該離樹根最遠。

需要修正的條件

度為0的結點有n個,度為k的結點有m個。
嚴格k叉樹有n=(k-1)m+1=>m=(n-1)/(k-1)
若(n-1)MOD(k-1)=0,則說明正好可以構造k叉歸併樹
若m=(n-1)MOD(k-1)=u(u不為0),則再加上k-u-1個空歸併段就可以建立歸併樹。

一往無前虎山行,撥開雲霧見光明。