【資料結構】排序——外部排序(2)
【資料結構】排序——外部排序(2)
上一章說到減少初始歸併段數量或者是增大歸併路數,都可以減少歸併的趟數,進而減少磁碟的讀寫次數。
置換選擇排序(生成初始歸併段)
是在樹形選擇排序的基礎上得來的的,特點是在整個排序的過程中,選擇最小(或最大)關鍵字和輸入、輸出交叉或平行。
實現過程
FI:初始待排檔案。FO:初始歸併段輸出檔案。WA:記憶體工作區。FO和WA初始狀態為空,WA可容納w個記錄
- 從FI輸入w個記錄到工作區WA
- 從WA中選出其中關鍵字取最小值得記錄,極為MINMAX記錄
- 將MINMAX記錄輸出到FO中去
- 若FI不為空,則從FI輸入下一個記錄到WA中
- 從WA中所有關鍵字必MINMAX記錄的關鍵字大的記錄中選出最小關鍵字記錄,作為新的MINMAX記錄
- 重複3-5,直至WA中選不出新的MINMAX記錄為止,由此得到一個初始歸併段,輸出一個歸併段的結束標誌到FO中去
- 重複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個空歸併段就可以建立歸併樹。