小橙書閱讀指南(九) 紅黑平衡樹(2)

2022-02-01 06:08:21 字數 2316 閱讀 2920

從標準二叉樹的極端情況我們推導出2-3樹這樣的資料結構具備自平衡的特性,但是要實現這個特性在演算法上相當複雜。考慮在大部分情況下,對於檢索的指數級時間消費o(lgn)要求並不嚴格。因此,我們會看到如何將一顆標準的2-3樹轉變成紅黑樹的過程。

一、區域性變換

考慮如果在2-節點上掛新的鍵並不會破壞2-3樹的平衡結構。可是在3-節點上掛新的鍵,可能的變化卻多達6種。這個臨時的4-節點可能是根節點,可能是乙個2-節點的左子節點或者右子節點,也可能是3-節點的左子節點、中子節點或者右子節點。2-3樹插入演算法的根本在於這些變換都是區域性的:除了相關的節點和鏈結之外不必修改該或者檢查樹的其他部分。因此,每次變換中,變更的鏈結數量都不會超過乙個很小的常熟。

每乙個變換都會將4-節點中的乙個鍵送入它的父節點中,並重構相應的鏈結,但不必涉及樹的其他部分。這也是2-3樹的重要特性:一次聚聚變換不會影響樹的有序和平衡性:

二、紅黑樹與2-3樹的相互轉換

儘管2-3樹一種高效的結構並提供了自平衡特性,但是它的演算法過於複雜以至於在一般的情況下我們並不願意使用這樣的結構作為首選方案。但是紅黑樹則不然,它的實現演算法非常簡單,**量也不大。但理解整個紅黑樹的構造過程卻需要一番仔細的**。

對於紅黑樹我們給出的定義如下:

1.紅連線均為左連線;

2.沒有任何乙個節點同時和兩條紅連線相連;

3.該樹是完美黑色平衡的,即任意空節點到根節點的路徑上的黑色鏈結數量相等。

我們只需要將一顆紅黑樹中的紅連線畫平,那麼所有的空節點到根節點的距離都是相同的。如果我們將由紅連線項鍊的節點合併,得到的就是一顆2-3樹。

}三、旋轉和顏色變化

對紅黑樹來說旋轉是它的基礎變化,在實現**前我們先思考一下為什麼需要旋轉。

向2-3樹的2-節點插入新的鍵是非常簡單的,無論這個鍵本身是e還是s,在插入新的鍵以後都乙個樣子。但對於紅黑樹來說就不是這樣了,回想一下之前對紅黑樹的定義:紅連線均為左連線。如果要插入的新值小於節點我們可以直接插入,如果新值大於節點,我們就會建立一條紅色的右鏈結。因此我們就需要通過旋轉將右鏈結變成左連線。當然更複雜的情況下,我們還會通過旋轉把左連線變成右鏈結。也許到這裡有人會問:當插入的新鍵大於節點的時候,為什麼不可以直接插入一條黑色的右鏈結呢?在思考一下2-3樹的生長特性以及紅黑樹對平衡的定義:

1.2-3樹是區別於二叉樹,它是向上生長的。

2.紅黑樹中任一空節點到根節點的距離相同。

綜合起來就是,我們在紅黑樹中插入的新鍵都必須從紅鏈結開始,再通過變換來調整樹的高度以恢復平衡。

接下來我們再考慮乙個問題,如果我們向紅黑樹插入了一條向左的紅鏈結(顯然此時並未破壞樹的平衡性,因此我們不必調整樹的結構)然後再向同乙個節點插入了一條紅色的右鏈結怎麼辦?左鏈結已經被佔據了,我們無法再通過旋轉調整平衡。

回想一下2-3樹在遇到這樣的情況是是如何變化的:我們先構造乙個臨時的4-節點,再將它轉換成3個2-節點並把父節點向上轉移。那麼對於紅黑樹來說似乎就更簡單了一些。我們只需要調整兩條子鏈結為黑鏈結並把根鏈結變成紅連線即可。

你或許又會問了:如果父節點已經是紅色的怎麼辦呢?事實上你完全不用擔心這樣的情況發生,因為紅黑樹的另一條特性已經保證了:沒有任何乙個節點同時和兩條紅連線相連。換言之,如果父節點(e)為紅色,當我們在插入(a)的時候已經不符合紅黑樹的定義,我們需要通過旋轉來恢復平衡。

總的來說,無論之前節點的情況如何,我們通過0次,1次或2次旋轉以及顏色的變化得到期望的結果。

演算法(小橙書)筆記 常用的資料結構(二)

佇列的特點 先進先出。即先入隊的元素將被先彈出佇列。實現佇列,同實現棧一樣,也可以用兩種基本的資料結構,一是利用連續的儲存結構 陣列 二是使用鏈式結構。在實現資料結構之前先應該確定它的介面有哪些,對於佇列來說最重要的介面就是入隊 enqueue 和出棧 dequeue 其他的輔助介面如佇列的大小等。...

文章 書閱讀

reliable ftp上reliable下目錄的 lifetime reliability toward an architectural solution reliable on chip systems in the nano era lessons learnt and future tre...

deep learning書的閱讀

最近堅持讀書,雖然大多數讀的都是一些閒書,傳記 歷史或者散文之類的書籍,但是也讀了點專業書。閒書是散時間讀的,放車裡,有時間就拿起來讀讀,專業書則更多的靠得是專注。因為我給自己的規定是一定時間內讀完幾本書。deep learning這本書讀到第四章了,耐心讀完前面,覺得其實我還是蠻有收穫的,作者主要...