您好,登錄后才能下訂單哦!
紅黑樹是一種自平衡二叉查找樹,是在計算機科學中用到的一種數(shù)據(jù)結(jié)構(gòu),典型的用途是實現(xiàn)關(guān)聯(lián)數(shù)組。它是在1972年由Rudolf Bayer發(fā)明的,他稱之為"對稱二叉B樹",它現(xiàn)代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年寫的一篇論文中獲得的。它是復(fù)雜的,但它的操作有著良好的最壞情況運行時間,并且在實踐中是高效的: 它可以在O(log n)時間內(nèi)做查找,插入和刪除,這里的n 是樹中元素的數(shù)目。
紅黑樹是一種很有意思的平衡檢索樹。它的統(tǒng)計性能要好于平衡二叉樹(有些書籍根據(jù)作者姓名,Adelson-Velskii和Landis,將其稱為 AVL-樹),因此,紅黑樹在很多地方都有應(yīng)用。在C++ STL中,很多部分(目前包括set, multiset, map, multimap)應(yīng)用了紅黑樹的變體(SGI STL中的紅黑樹有一些變化,這些修改提供了更好的性能,以及對set操作的支持)。
背景和術(shù)語
紅黑樹是一種特定類型的二叉樹,它是在計算機科學中用來組織數(shù)據(jù)比如數(shù)字的塊的一種結(jié)構(gòu)。所有數(shù)據(jù)塊都存儲在節(jié)點中。這些節(jié)點中的某一個節(jié)點總是擔當啟始位置的功能,它不是任何節(jié)點的兒子;我們稱之為根節(jié)點或根。它有最多兩個"兒子",都是它連接到的其他節(jié)點。所有這些兒子都可以有自己的兒子,以此類推。這樣根節(jié)點就有了把它連接到在樹中任何其他節(jié)點的路徑。
如果一個節(jié)點沒有兒子,我們稱之為葉子節(jié)點,因為在直覺上它是在樹的邊緣上。子樹是從特定節(jié)點可以延伸到的樹的某一部分,其自身被當作一個樹。在紅黑樹中,葉子被假定為 null 或空。
由于紅黑樹也是二叉查找樹,它們當中每一個節(jié)點都的比較值都必須大于或等于在它的左子樹中的所有節(jié)點,并且小于或等于在它的右子樹中的所有節(jié)點。這確保紅黑樹運作時能夠快速的在樹中查找給定的值。
用途和好處
紅黑樹和AVL樹一樣都對插入時間、刪除時間和查找時間提供了最好可能的最壞情況擔保。這不只是使它們在時間敏感的應(yīng)用如即時應(yīng)用(real time application)中有價值,而且使它們有在提供最壞情況擔保的其他數(shù)據(jù)結(jié)構(gòu)中作為建造板塊的價值;例如,在計算幾何中使用的很多數(shù)據(jù)結(jié)構(gòu)都可以基于紅黑樹。
紅黑樹在函數(shù)式編程中也特別有用,在這里它們是最常用的持久數(shù)據(jù)結(jié)構(gòu)之一,它們用來構(gòu)造關(guān)聯(lián)數(shù)組和集合,在突變之后它們能保持為以前的版本。除了O(log n)的時間之外,紅黑樹的持久版本對每次插入或刪除需要O(log n)的空間。
紅黑樹是 2-3-4樹的一種等同。換句話說,對于每個 2-3-4 樹,都存在至少一個數(shù)據(jù)元素是同樣次序的紅黑樹。在 2-3-4 樹上的插入和刪除操作也等同于在紅黑樹中顏色翻轉(zhuǎn)和旋轉(zhuǎn)。這使得 2-3-4 樹成為理解紅黑樹背后的邏輯的重要工具,這也是很多介紹算法的教科書在紅黑樹之前介紹 2-3-4 樹的原因,盡管 2-3-4 樹在實踐中不經(jīng)常使用。
屬性
紅黑樹是每個節(jié)點都有顏色特性的二叉查找樹,顏色的值是紅色或黑色之一。除了二叉查找樹帶有的一般要求,我們對任何有效的紅黑樹加以如下增補要求:
1.節(jié)點是紅色或黑色。
2.根是黑色。
3.所有葉子(外部節(jié)點)都是黑色。
4.每個紅色節(jié)點的兩個子節(jié)點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續(xù)的紅色節(jié)點)
5.從每個葉子到根的所有路徑都包含相同數(shù)目的黑色節(jié)點。
這些約束強制了紅黑樹的關(guān)鍵屬性: 從根到葉子的最長的可能路徑不多于最短的可能路徑的兩倍長。結(jié)果是這個樹大致上是平衡的。因為操作比如插入、刪除和查找某個值都要求與樹的高度成比例的最壞情況時間,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,而不同于普通的二叉查找樹。
要知道為什么這些特性確保了這個結(jié)果,注意到屬性4導(dǎo)致了路徑不能有兩個毗連的紅色節(jié)點就足夠了。最短的可能路徑都是黑色節(jié)點,最長的可能路徑有交替的紅色和黑色節(jié)點。因為根據(jù)屬性5所有最長的路徑都有相同數(shù)目的黑色節(jié)點,這就表明了沒有路徑能多于任何其他路徑的兩倍長。
在很多樹數(shù)據(jù)結(jié)構(gòu)的表示中,一個節(jié)點有可能只有一個兒子,而葉子節(jié)點包含數(shù)據(jù)。用這種范例表示紅黑樹是可能的,但是這會改變一些屬性并使算法復(fù)雜。為此,本文中我們使用 "nil 葉子" 或"空(null)葉子",如上圖所示,它不包含數(shù)據(jù)而只充當樹在此結(jié)束的指示。這些節(jié)點在繪圖中經(jīng)常被省略,導(dǎo)致了這些樹好像同上述原則相矛盾,而實際上不是這樣。與此有關(guān)的結(jié)論是所有節(jié)點都有兩個兒子,盡管其中的一個或兩個可能是空葉子。
操作
在紅黑樹上只讀操作不需要對用于二叉查找樹的操作做出修改,因為它也二叉查找樹。但是,在插入和刪除之后,紅黑屬性可能變得違規(guī)?;謴?fù)紅黑屬性需要少量(O(log n))的顏色變更(這在實踐中是非常快速的)并且不超過三次樹旋轉(zhuǎn)(對于插入是兩次)。這允許插入和刪除保持為 O(log n) 次,但是它導(dǎo)致了非常復(fù)雜的操作。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。