外部排序 勝者樹與敗者樹

2021-06-21 13:59:23 字數 2475 閱讀 3662

**:

參考:引子

前面講到的google面試題

賽馬問題

,我一直在想,會不會有一種演算法能講得更清楚,更明白呢。後來我發現賽馬問題和外部排序之歸併排序很相似。賽馬問題中由於賽道只能一次賽5匹馬,就好比我們要對25匹馬進行排序,但是發現計算機記憶體不夠(賽道是賽5匹馬的),最多同時只能排序5匹馬,所以要用外部排序來解決問題。而敗者樹這種資料結構常用於提高外部排序的效率。所以這篇文章的目的就是把敗者樹和勝者樹講清楚。

概念介紹

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

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

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

勝者樹

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

fig. 1

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

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

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

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

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

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

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

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

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

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

fig. 2

敗者樹

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

fig. 3

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

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

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

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

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

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

敗者樹重構過程如下:

fig. 4

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

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

敗者樹和勝者樹的區別

由上可知,敗者樹簡化了重構。敗者樹的重構只是與該結點的父結點的記錄有關,而勝者樹的重構還與該結點的兄弟結點有關。所以敗者樹常用語外部歸併排序。

重要批註

文章寫到這裡,我突然發現,敗者樹還真不能解決賽馬問題。為什麼這麼說呢?因為在賽馬問題中,可以同時比較5匹馬,選出最快的。而在敗者樹中,是每次同時比較兩個數,選其中的較小值。也就是說,如果賽馬問題變換成這樣:有5組馬,每組有5匹馬,並且每組的馬按照速度快慢排列好。現在只有乙個2跑道的馬場,現在要將總共這25匹馬按照速度排序。 這個問題才是敗者樹可以解決的。嘿嘿,描述的問題其實就是外部歸併排序了。5組排好序的馬,就是5個陣列,按照大小排序好。

勝者樹和敗者樹的應用

貼一道題:

給定乙個陣列array,長度為16。如何採用最少的比較次數找出第二大的元素?

1. 直觀方法是通過兩次氣泡排序,15+14=29 次比較可找到第二大的元素。然而直觀方法顯然沒有應用到一些已經比較過的資訊。

2. 採用歸併排序,構造勝者樹。與該勝者比較過的元素有4個(大概就是勝者樹的高度),只需要對這些元素進行比較即可,共比較次數15(勝者樹)+ (4-1)=18 次比較。

注:也就是說勝者樹在求陣列最大值,次大值得時候,有用武之地。

敗者樹在外排序的k路平衡歸併中使用,它是乙個完全二叉樹,其非葉節點(中間節點)為比較中的敗者。根節點為最後一次比較的敗者。最終勝利者則被直接輸出(或到輸出緩衝區)。

敗者樹的引入是因為:k路平衡歸併中,若不使用敗者樹,則對每次對k路需要比較k-1次得到最值,對於總共n個記錄的每一趟歸併共需要(n-1)*(k-1)次比較。若有m個歸併初始段,歸併趟數為logk(m) ,總共比較次數logk(m)*(n-1)*(k-1)。引入敗者樹(由k個元素構造成敗者樹)則每次不需要k-1次比較,只需要log2(k)次即可。

勝者樹與敗者樹

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

勝者樹與敗者樹

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

勝者樹與敗者樹(二)

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