平衡查詢樹

2021-09-26 14:46:17 字數 2147 閱讀 5862

在前面我們說了二叉查詢樹,它在最壞的情況下是很糟糕的。下面我們來說一種查詢樹,這種這查詢樹能夠保證無論如何構造它,它的執行時間都是對數級別的。理想情況下我們希望能夠保持二分查詢樹的平衡性。在一棵含有n個結點的樹中,我們希望樹的高度為lgn,這樣我們就能保證所有查詢能在lgn次比較內結束,就和二分查詢一樣。

為了保證查詢樹的平衡性,我們需要一些靈活性,因此在這裡我們允許樹中的乙個結點儲存多個鍵。確切的說,我們將一顆標準的二叉查詢樹中的結點稱為2-結點(含有乙個鍵和兩條鏈),而現在我們引入3-結點,它含有兩個鍵和三條鏈結。

2-3查詢樹或為一顆空樹,或者有以下結點組成:

和以前一樣,我們將指向一顆空樹的鏈結

一顆完美平衡的2-3查詢樹中的所有空鏈結到根結點的距離應該是相同的。

將二叉查詢樹的查詢演算法一般化我們就能夠直接得到2-3查詢演算法。要判斷乙個鍵是否在樹中,我們先將它和根結點中的鍵比較。如果它和其中任意乙個相等,查詢命中;否則我們就根據比較的結果找到指向相應區間的鏈結,並在其指向的子樹只能夠遞迴的繼續查詢。如果這是個空鏈結,表示查詢未命中。

要在2-3樹中插入乙個新結點,我們可以和二叉樹一樣先進行一次未命中的查詢,然後把新結點掛在樹的底部。但這樣的話樹無法保持完美的平衡性。我們使用2-3樹的主要原因就在於它能夠在插入後繼續保持平衡。

如果未命中的查詢結束於乙個2-結點,那麼事情就變得簡單的多:我們只要把這個2-結點替換成乙個3-結點,將要插入的鍵儲存在其中即可。如果未命中的查詢結束於乙個3-結點,事情就要麻煩一些。

在考慮一般情況之前,先假設我們需要向一顆只含有乙個3-結點的樹中插入乙個新鍵。這棵樹中有兩個鍵,所以在它唯一的結點中已經沒有可插入新鍵的空間了。為了將新鍵插入,我們先臨時將新鍵存入該結點中,使之成為乙個4-結點(含有3個鍵和4條鏈結)。之後我們將它轉換為一顆由3個2-結點組成的2-3查詢樹,其中乙個結點(根)含有中鍵,乙個結點含有3個鍵中的最小者(和根結點的左鏈結相連),乙個結點含有3個鍵中的最大者(和根結點的右鏈結相連)。這棵樹既是一顆含有3個結點的二叉查詢樹,同時也是一顆平衡的2-3樹,因為其中所有的空鏈結到根結點的距離都相等。插入前樹的高度為0,插入後樹的高度為1.

現在假設未命中的查詢結束於乙個父結點為3-結點的結點。我們再次和剛才一樣構造乙個臨時的4-結點並分解它,然後將它的中鍵插入到它的父結點中。但父結點也是乙個3-結點,因此我們在用這個中鍵構造乙個臨時4-結點,然後在這個節點上進行相同的變換,即分解這個父結點並將它的中鍵構造乙個新的臨時4-結點,然後在這個節點上進行相同的變換,即分解這個父結點並將它的中鍵插入到它的父節點中去。推廣到一般情況,我們就這樣一直往上不斷分解臨時的4-結點並將中鍵插入到更高的父結點中,直到遇到乙個2-結點並將它替換為乙個不需要繼續分解的3-結點,或者是到達3-結點的根。

如果從插入結點到根結點的路徑上全都是3-結點,我們的根結點最終變成了乙個臨時的4-結點。此時我們可以按照一顆樹只有乙個3-結點的樹中插入新鍵的方法處理這個問題。我們將臨時的4-結點分解為3個2結點,是得樹的高度加1。如下圖所示:

總的來說就是臨時4-結點拆分為2-結點,2-結點變為3-結點的過程。

將乙個4-結點分解為一顆2-3樹可能有六種情況,都總結到了下圖中:

和標準的二叉查詢樹由上向下的生長不同,2-3樹的生長是由下向上的。

在一棵大小為n的2-3樹中,查詢和插入操作訪問的結點必然不超過lgn個。

但是,我們和真正的實現還有一段距離。儘管我們可以用不同的資料型別表示2-結點和3-結點並寫出變換所需的**,但用這種直白的表示方法實現大多數的操作並不方便,因為需要處理的情況實在太多。我們需要維護兩種不同型別的結點,將被查詢的鍵和結點中的每個鍵進行比較,將鏈結和其他資訊從一種結點複製到另一種結點,將結點從一種資料型別轉換為另一種資料型別,等等。平衡一棵樹的初衷是為了消除最壞的情況,但我們希望這種保障所需要的**能夠越少越好。

幸好我們存在一種途徑我們只需要付出一點點代價就能用同一的方式完成所有變換。

平衡查詢樹之2 3查詢樹

二叉查詢樹不能保證樹的平衡性,在最壞情況下,查詢插入操作需要線性時間。為了保證查詢樹的平衡性,有了2 3樹的概念。它是實現紅黑樹的基礎。2 3樹中有兩種結點 當插入結點時,通過一些基本操作,可以保證這棵樹是完美平衡的,因此查詢和插入的時間會是對數級的。插入過程有如下幾種可能性 區域性變換不會影響樹的...

平衡查詢樹之2 3樹

本文及後面文章介紹的平衡查詢樹的資料結構能夠保證在最差的情況下也能達到lgn的效率,要實現這一目標我們需要保證樹在插入完成之後始終保持平衡狀態,這就是平衡查詢樹 balanced search tree 在一棵具有n 個節點的樹中,我們希望該樹的高度能夠維持在lgn左右,這樣我們就能保證只需要lgn...

《演算法》 3 3平衡查詢樹(1)

理想情況下如何保持二叉樹的平衡?這裡引入平衡查詢樹。2 3查詢樹定義 2 節點,含有乙個鍵 及其對應值 和兩條鏈結,左鏈結指向的節點的鍵小於該節點,右鏈結指向的節點的鍵大於該節點 3 節點,含有兩個鍵 及其對應值 和三條鏈結,左鏈結指向的節點的鍵都小於該節點,中鏈結指向的節點的鍵介於節點的兩個鍵之間...