勝者樹與敗者樹

2021-09-23 18:58:33 字數 2648 閱讀 4742

勝者樹與敗者樹

勝者樹和敗者樹都是完全二叉樹,是樹形選擇排序的一種變型。每個葉子結點相當於乙個選手,每個中間結點相當於一場比賽,每一層相當於一輪比賽。

不同的是,勝者樹的中間結點記錄的是勝者的標號;而敗者樹的中間結點記錄的敗者的標號。

勝者樹與敗者樹可以在log(n)的時間內找到最值。任何乙個葉子結點的值改變後,利用中間結點的資訊,還是能夠快速地找到最值。在k路歸併排序中經常用到。

一、勝者樹

勝者樹的乙個優點是,如果乙個選手的值改變了,可以很容易地修改這棵勝者樹。只需要沿著從該結點到根結點的路徑修改這棵二叉樹,而不必改變其他比賽的結果。

fig.1是乙個勝者樹的示例。規定數值小者勝。

1.         b3 pk b4,b3勝b4負,內部結點ls[4]的值為3;

2.         b3 pk b0,b3勝b0負,內部結點ls[2]的值為3;

3.         b1 pk b2,b1勝b2負,內部結點ls[3]的值為1;

4.         b3 pk b1,b3勝b1負,內部結點ls[1]的值為3。.

當fig. 1中葉子結點b3的值變為11時,重構的勝者樹如fig. 2所示。

1.         b3 pk b4,b3勝b4負,內部結點ls[4]的值為3;

2.         b3 pk b0,b0勝b3負,內部結點ls[2]的值為0;

3.         b1 pk b2,b1勝b2負,內部結點ls[3]的值為1;

4.         b0 pk b1,b1勝b0負,內部結點ls[1]的值為1。.

fig. 2

二、敗者樹

敗者樹是勝者樹的一種變體。在敗者樹中,用父結點記錄其左右子結點進行比賽的敗者,而讓勝者參加下一輪的比賽。敗者樹的根結點記錄的是敗者,需要加乙個結點來記錄整個比賽的勝利者。採用敗者樹可以簡化重構的過程。

fig. 3是一棵敗者樹。規定數大者敗。

1.         b3 pk b4,b3勝b4負,內部結點ls[4]的值為4;

2.         b3 pk b0,b3勝b0負,內部結點ls[2]的值為0;

3.         b1 pk b2,b1勝b2負,內部結點ls[3]的值為2;

4.         b3 pk b1,b3勝b1負,內部結點ls[1]的值為1;

5.         在根結點ls[1]上又加了乙個結點ls[0]=3,記錄的最後的勝者。

敗者樹重構過程如下:

·            將新進入選擇樹的結點與其父結點進行比賽:將敗者存放在父結點中;而勝者再與上一級的父結點比較。

·            比賽沿著到根結點的路徑不斷進行,直到ls[1]處。把敗者存放在結點ls[1]中,勝者存放在ls[0]中。

fig. 4是當b3變為13時,敗者樹的重構圖。

注意,敗者樹的重構跟勝者樹是不一樣的,敗者樹的重構只需要與其父結點比較。對照fig. 3來看,b3與結點ls[4]的原值比較,ls[4]中存放的原值是結點4,即b3與b4比較,b3負b4勝,則修改ls[4]的值為結點3。同理,以此 類推,沿著根結點不斷比賽,直至結束。

由上可知,敗者樹簡化了重構。敗者樹的重構只是與該結點的父結點的記錄有關,而勝者樹的重構還與該結點的兄弟結點有關。

一 外部排序的基本思路

假設有乙個72kb的檔案,其中儲存了18k個整數,磁碟中物理塊的大小為4kb,將檔案分成18組,每組剛好4kb。

首先通過18次內部排序,把18組資料排好序,得到初始的18個歸併段r1~r18,每個歸併段有1024個整數。

然後對這18個歸併段使用4路平衡歸併排序:

第1次歸併:產生5個歸併段

r11   r12    r13    r14    r15

其中r11是由中的資料合併而來

r12是由中的資料合併而來

r13是由中的資料合併而來

r14是由中的資料合併而來

r15是由中的資料合併而來

把這5個歸併段的資料寫入5個檔案:

foo_1.dat    foo_2.dat    foo_3.dat     foo_4.dat     foo_5.dat

第2次歸併:從第1次歸併產生的5個檔案中讀取資料,合併,產生2個歸併段

r21  r22

其中r21是由中的資料合併而來

其中r22是由中的資料合併而來

把這2個歸併段寫入2個檔案

bar_1.dat   bar_2.dat

第3次歸併:從第2次歸併產生的2個檔案中讀取資料,合併,產生1個歸併段

r31

r31是由中的資料合併而來

把這個檔案寫入1個檔案

foo_1.dat

此即為最終排序好的檔案。

勝者樹與敗者樹

概念介紹 勝者樹和敗者樹都是完全二叉樹,是樹形選擇排序的一種變型。每個葉子結點相當於乙個選手,每個中間結點相當於一場比賽,每一層相當於一輪比賽。不同的是,勝者樹的中間結點記錄的是勝者的標號 而敗者樹的中間結點記錄的敗者的標號。勝者樹與敗者樹可以在log n 的時間內找到最值。任何乙個葉子結點的值改變...

勝者樹與敗者樹(二)

勝者樹和敗者樹都是完全二叉樹,是樹形選擇排序的一種變型。每個葉子結點相當於乙個選手,每個中間結點相當於一場比賽,每一層相當於一輪比賽。不同的是,勝者樹的中間結點記錄的是勝者的標號 而敗者樹的中間結點記錄的敗者的標號。勝者樹與敗者樹可以在log n 的時間內找到最值。任何乙個葉子結點的值改變後,利用中...

外部排序 勝者樹與敗者樹

參考 引子 前面講到的google面試題 賽馬問題 我一直在想,會不會有一種演算法能講得更清楚,更明白呢。後來我發現賽馬問題和外部排序之歸併排序很相似。賽馬問題中由於賽道只能一次賽5匹馬,就好比我們要對25匹馬進行排序,但是發現計算機記憶體不夠 賽道是賽5匹馬的 最多同時只能排序5匹馬,所以要用外部...