日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B树、B+树、AVL树、红黑树

發(fā)布時間:2025/7/25 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 B树、B+树、AVL树、红黑树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

from:?http://blog.csdn.net/chlele0105/article/details/8473846

binary search tree,中文翻譯為二叉搜索樹、二叉查找樹或者二叉排序樹。簡稱為BST

B

???????即二叉搜索樹:

?????? 1.所有非葉子結(jié)點至多擁有兩個兒子(LeftRight);

?????? 2.所有結(jié)點存儲一個關(guān)鍵字;

?????? 3.非葉子結(jié)點的左指針指向小于其關(guān)鍵字的子樹,右指針指向大于其關(guān)鍵字的子樹;

???????如:

???????

?????? B樹的搜索,從根結(jié)點開始,如果查詢的關(guān)鍵字與結(jié)點的關(guān)鍵字相等,那么就命中;

否則,如果查詢關(guān)鍵字比結(jié)點關(guān)鍵字小,就進入左兒子;如果比結(jié)點關(guān)鍵字大,就進入

右兒子;如果左兒子或右兒子的指針為空,則報告找不到相應(yīng)的關(guān)鍵字;

???????如果B樹的所有非葉子結(jié)點的左右子樹的結(jié)點數(shù)目均保持差不多(平衡),那么B

的搜索性能逼近二分查找;但它比連續(xù)內(nèi)存空間的二分查找的優(yōu)點是,改變B樹結(jié)構(gòu)

(插入與刪除結(jié)點)不需要移動大段的內(nèi)存數(shù)據(jù),甚至通常是常數(shù)開銷;

???????如:

??????

???但B樹在經(jīng)過多次插入與刪除后,有可能導致不同的結(jié)構(gòu):

?? 右邊也是一個B樹,但它的搜索性能已經(jīng)是線性的了;同樣的關(guān)鍵字集合有可能導致不同的

樹結(jié)構(gòu)索引;所以,使用B樹還要考慮盡可能讓B樹保持左圖的結(jié)構(gòu),和避免右圖的結(jié)構(gòu),也就

是所謂的“平衡”問題;??????

???????實際使用的B樹都是在原B樹的基礎(chǔ)上加上平衡算法,即“平衡二叉樹”;如何保持B

結(jié)點分布均勻的平衡算法是平衡二叉樹的關(guān)鍵;平衡算法是一種在B樹中插入和刪除結(jié)點的

策略;

?

?

B-

???????是一種多路搜索樹(并不是二叉的):

?????? 1.定義任意非葉子結(jié)點最多只有M個兒子;且M>2

?????? 2.根結(jié)點的兒子數(shù)為[2, M]

?????? 3.除根結(jié)點以外的非葉子結(jié)點的兒子數(shù)為[M/2, M]

?????? 4.每個結(jié)點存放至少M/2-1(取上整)和至多M-1個關(guān)鍵字;(至少2個關(guān)鍵字)

?????? 5.非葉子結(jié)點的關(guān)鍵字個數(shù)=指向兒子的指針個數(shù)-1

?????? 6.非葉子結(jié)點的關(guān)鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]

?????? 7.非葉子結(jié)點的指針:P[1], P[2], …, P[M];其中P[1]指向關(guān)鍵字小于K[1]

子樹,P[M]指向關(guān)鍵字大于K[M-1]的子樹,其它P[i]指向關(guān)鍵字屬于(K[i-1], K[i])的子樹;

?????? 8.所有葉子結(jié)點位于同一層;

???????如:(M=3

?????? B-樹的搜索,從根結(jié)點開始,對結(jié)點內(nèi)的關(guān)鍵字(有序)序列進行二分查找,如果

命中則結(jié)束,否則進入查詢關(guān)鍵字所屬范圍的兒子結(jié)點;重復,直到所對應(yīng)的兒子指針為

空,或已經(jīng)是葉子結(jié)點;

B-樹的特性:

?????? 1.關(guān)鍵字集合分布在整顆樹中;

?????? 2.任何一個關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個結(jié)點中;

?????? 3.搜索有可能在非葉子結(jié)點結(jié)束;

?????? 4.其搜索性能等價于在關(guān)鍵字全集內(nèi)做一次二分查找;

?????? 5.自動層次控制;

???????由于限制了除根結(jié)點以外的非葉子結(jié)點,至少含有M/2個兒子,確保了結(jié)點的至少

利用率,其最底搜索性能為:

????

???????其中,M為設(shè)定的非葉子結(jié)點最多子樹個數(shù),N為關(guān)鍵字總數(shù);

???????所以B-樹的性能總是等價于二分查找(與M值無關(guān)),也就沒有B樹平衡的問題;

???????由于M/2的限制,在插入結(jié)點時,如果結(jié)點已滿,需要將結(jié)點分裂為兩個各占

M/2的結(jié)點;刪除結(jié)點時,需將兩個不足M/2的兄弟結(jié)點合并;

AVL樹

AVL樹是最先發(fā)明的自平衡二叉查找樹。在AVL樹中任何節(jié)點的兩個子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查找、插入和刪除在平均和最壞情況下都是O(log n)。

?

?

B+

?????? B+樹是B-樹的變體,也是一種多路搜索樹:

?????? 1.其定義基本與B-樹同,除了:

?????? 2.非葉子結(jié)點的子樹指針與關(guān)鍵字個數(shù)相同;

?????? 3.非葉子結(jié)點的子樹指針P[i],指向關(guān)鍵字值屬于[K[i], K[i+1])的子樹

B-樹是開區(qū)間);

?????? 5.為所有葉子結(jié)點增加一個鏈指針;

?????? 6.所有關(guān)鍵字都在葉子結(jié)點出現(xiàn);

???????如:(M=3

???B+的搜索與B-樹也基本相同,區(qū)別是B+樹只有達到葉子結(jié)點才命中(B-樹可以在

非葉子結(jié)點命中),其性能也等價于在關(guān)鍵字全集做一次二分查找;

?????? B+的特性:

?????? 1.所有關(guān)鍵字都出現(xiàn)在葉子結(jié)點的鏈表中(稠密索引),且鏈表中的關(guān)鍵字恰好

是有序的;

?????? 2.不可能在非葉子結(jié)點命中;

?????? 3.非葉子結(jié)點相當于是葉子結(jié)點的索引(稀疏索引),葉子結(jié)點相當于是存儲

(關(guān)鍵字)數(shù)據(jù)的數(shù)據(jù)層;

?????? 4.更適合文件索引系統(tǒng);

??

B*

???????B+樹的變體,在B+樹的非根和非葉子結(jié)點再增加指向兄弟的指針;

???B*樹定義了非葉子結(jié)點關(guān)鍵字個數(shù)至少為(2/3)*M,即塊的最低使用率為2/3

(代替B+樹的1/2);

?????? B+樹的分裂:當一個結(jié)點滿時,分配一個新的結(jié)點,并將原結(jié)點中1/2的數(shù)據(jù)

復制到新結(jié)點,最后在父結(jié)點中增加新結(jié)點的指針;B+樹的分裂只影響原結(jié)點和父

結(jié)點,而不會影響兄弟結(jié)點,所以它不需要指向兄弟的指針;

?????? B*樹的分裂:當一個結(jié)點滿時,如果它的下一個兄弟結(jié)點未滿,那么將一部分

數(shù)據(jù)移到兄弟結(jié)點中,再在原結(jié)點插入關(guān)鍵字,最后修改父結(jié)點中兄弟結(jié)點的關(guān)鍵字

(因為兄弟結(jié)點的關(guān)鍵字范圍改變了);如果兄弟也滿了,則在原結(jié)點與兄弟結(jié)點之

間增加新結(jié)點,并各復制1/3的數(shù)據(jù)到新結(jié)點,最后在父結(jié)點增加新結(jié)點的指針;

???????所以,B*樹分配新結(jié)點的概率比B+樹要低,空間使用率更高;

??

小結(jié)

?????? B樹:二叉樹,每個結(jié)點只存儲一個關(guān)鍵字,等于則命中,小于走左結(jié)點,大于

走右結(jié)點;

?????? B-樹:多路搜索樹,每個結(jié)點存儲M/2M個關(guān)鍵字,非葉子結(jié)點存儲指向關(guān)鍵

字范圍的子結(jié)點;

???????所有關(guān)鍵字在整顆樹中出現(xiàn),且只出現(xiàn)一次,非葉子結(jié)點可以命中;

?????? B+樹:在B-樹基礎(chǔ)上,為葉子結(jié)點增加鏈表指針,所有關(guān)鍵字都在葉子結(jié)點

中出現(xiàn),非葉子結(jié)點作為葉子結(jié)點的索引;B+樹總是到葉子結(jié)點才命中;

?????? B*樹:在B+樹基礎(chǔ)上,為非葉子結(jié)點也增加鏈表指針,將結(jié)點的最低利用率

1/2提高到2/3


紅黑樹與AVL(自平衡二叉查找樹)樹

《算法導論》關(guān)于紅黑樹的定義:

正如在CLRS中定義的那樣(CLRS指的是就是算法導論這本書《Introduction to Algorithms》,CLRS是該書作者Cormen, Leiserson, Rivest and Stein的首字母縮寫),一棵紅黑樹是指一棵滿足下述性質(zhì)的二叉搜索樹(BST, binary search tree): 1. 每個結(jié)點或者為黑色或者為紅色。 2. 根結(jié)點為黑色。 3. 每個葉結(jié)點(實際上就是NULL指針)都是黑色的。 4. 如果一個結(jié)點是紅色的,那么它的兩個子節(jié)點都是黑色的(也就是說,不能有兩個相鄰的紅色結(jié)點)。 5. 對于每個結(jié)點,從該結(jié)點到其所有子孫葉結(jié)點的路徑中所包含的黑色結(jié)點數(shù)量必須相同。

數(shù)據(jù)項只能存儲在內(nèi)部結(jié)點中(internal node)。我們所指的"葉結(jié)點"在其父結(jié)點中可能僅僅用一個NULL指針表示,但是將它也看作一個實際的結(jié)點有助于描述紅黑樹的插入與刪除算法,葉結(jié)點一律為黑色。?定義詳解:?根據(jù)性質(zhì) 5:紅黑樹從根節(jié)點到每個葉子節(jié)點的路徑都包含相同數(shù)量的黑色節(jié)點,因此從根節(jié)點到葉子節(jié)點的路徑中包含的黑色節(jié)點數(shù)被稱為樹的“黑色高度(black-height)”。 性質(zhì) 4 則保證了從根節(jié)點到葉子節(jié)點的最長路徑的長度不會超過任何其他路徑的兩倍。假如有一棵黑色高度為 3 的紅黑樹:從根節(jié)點到葉節(jié)點的最短路徑長度是 2,該路徑上全是黑色節(jié)點(黑節(jié)點 – 黑節(jié)點 – 黑節(jié)點)。最長路徑也只可能為 4,在每個黑色節(jié)點之間插入一個紅色節(jié)點(黑節(jié)點 – 紅節(jié)點 – 黑節(jié)點 – 紅節(jié)點 – 黑節(jié)點),性質(zhì) 4 保證絕不可能插入更多的紅色節(jié)點。由此可見,紅黑樹中最長路徑就是一條紅黑交替的路徑。 根據(jù)定義我們做如下練習: -不符合定義的一顆非紅黑樹:??紅黑樹的這5個性質(zhì)中,第3點是比較難理解的,但它卻非常有必要。我們看圖1中的左邊這張圖,如果不使用黑哨兵,它完全滿足紅黑樹性質(zhì),結(jié)點50到兩個葉結(jié)點8和葉結(jié)點82路徑上的黑色結(jié)點數(shù)都為2個。但如果加入黑哨兵后(如圖1右圖中的小黑圓點),葉結(jié)點的個數(shù)變?yōu)?個黑哨兵,根結(jié)點50到這8個葉結(jié)點路徑上的黑高度就不一樣了,所以它并不是一棵紅黑樹。?-兩顆正確的紅黑樹:??定理

一棵擁有n個內(nèi)部結(jié)點的紅黑樹的樹高h<=2log(n+1)

由此我們可以得出結(jié)論:對于給定的黑色高度為 N 的紅黑樹,從根到葉子節(jié)點的最短路徑長度為 N-1,最長路徑長度為 2 * (N-1)。 提示:排序二叉樹的深度直接影響了檢索的性能,正如前面指出,當插入節(jié)點本身就是由小到大排列時,排序二叉樹將變成一個鏈表,這種排序二叉樹的檢索性能最低:N 個節(jié)點的二叉樹深度就是 N-1。?紅黑樹通過上面這種限制來保證它大致是平衡的——因為紅黑樹的高度不會無限增高,這樣保證紅黑樹在最壞情況下都是高效的,不會出現(xiàn)普通排序二叉樹的情況。?由于紅黑樹只是一個特殊的排序二叉樹,因此對紅黑樹上的只讀操作與普通排序二叉樹上的只讀操作完全相同,只是紅黑樹保持了大致平衡,因此檢索性能比排序二叉樹要好很多。?但在紅黑樹上進行插入操作和刪除操作會導致樹不再符合紅黑樹的特征,因此插入操作和刪除操作都需要進行一定的維護,以保證插入節(jié)點、刪除節(jié)點后的樹依然是紅黑樹。

3 紅黑樹和AVL樹的比較

1.?紅黑樹并不追求“完全平衡”——它只要求部分地達到平衡要求,降低了對旋轉(zhuǎn)的要求,從而提高了性能。 紅黑樹能夠以O(log2 n)?的時間復雜度進行搜索、插入、刪除操作。此外,由于它的設(shè)計,任何不平衡都會在三次旋轉(zhuǎn)之內(nèi)解決。當然,還有一些更好的,但實現(xiàn)起來更復雜的數(shù)據(jù)結(jié)構(gòu),能夠做到一步旋轉(zhuǎn)之內(nèi)達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的算法時間復雜度和AVL相同,但統(tǒng)計性能比AVL樹更高。 當然,紅黑樹并不適應(yīng)所有應(yīng)用樹的領(lǐng)域。如果數(shù)據(jù)基本上是靜態(tài)的,那么讓他們待在他們能夠插入,并且不影響平衡的地方會具有更好的性能。如果數(shù)據(jù)完全是靜態(tài)的,做一個哈希表,性能可能會更好一些。 紅黑樹是一個更高效的檢索二叉樹,因此常常用來實現(xiàn)關(guān)聯(lián)數(shù)組。典型地,JDK 提供的集合類 TreeMap 本身就是一個紅黑樹的實現(xiàn)。 IBM DevelopWorks?上一篇文章講解非常好,供參考。 TreeMap 和 TreeSet 是 Java Collection Framework 的兩個重要成員,其中 TreeMap 是 Map 接口的常用實現(xiàn)類,而 TreeSet 是 Set 接口的常用實現(xiàn)類。雖然 HashMap 和 HashSet 實現(xiàn)的接口規(guī)范不同,但 TreeSet 底層是通過 TreeMap 來實現(xiàn)的,因此二者的實現(xiàn)方式完全一樣。而 TreeMap 的實現(xiàn)就是紅黑樹算法。 對于 TreeMap 而言,由于它底層采用一棵“紅黑樹”來保存集合中的 Entry,這意味這 TreeMap 添加元素、取出元素的性能都比 HashMap 低:當 TreeMap 添加元素時,需要通過循環(huán)找到新增 Entry 的插入位置,因此比較耗性能;當從 TreeMap 中取出元素時,需要通過循環(huán)才能找到合適的 Entry,也比較耗性能。 但 TreeMap、TreeSet 比 HashMap、HashSet 的優(yōu)勢在于:TreeMap 中的所有 Entry 總是按 key 根據(jù)指定排序規(guī)則保持有序狀態(tài),TreeSet 中所有元素總是根據(jù)指定排序規(guī)則保持有序狀態(tài)。 2?AVL樹是最先發(fā)明的自平衡二叉查找樹。在AVL樹中任何節(jié)點的兩個兒子子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查找、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉(zhuǎn)來重新平衡這個樹。 引入二叉樹的目的是為了提高二叉樹的搜索的效率,減少樹的平均搜索長度.為此,就必須每向二叉樹插入一個結(jié)點時調(diào)整樹的結(jié)構(gòu),使得二叉樹搜索保持平衡,從而可能降低樹的高度,減少的平均樹的搜索長度. AVL樹的定義: 一棵AVL樹滿足以下的條件: 1>它的左子樹和右子樹都是AVL樹 2>左子樹和右子樹的高度差不能超過1 性質(zhì): 1>一棵n個結(jié)點的AVL樹的其高度保持在0(log2(n)),不會超過3/2log2(n+1) 2>一棵n個結(jié)點的AVL樹的平均搜索長度保持在0(log2(n)). 3>一棵n個結(jié)點的AVL樹刪除一個結(jié)點做平衡化旋轉(zhuǎn)所需要的時間為0(log2(n)). 為了保證平衡,AVL樹中的每個結(jié)點都有一個平衡因子(balance factor,以下用BF表示),它表示這個結(jié)點的左、右子樹的高度差,也就是左子樹的高度減去右子樹的高度的結(jié)果值。AVL樹上所有結(jié)點的BF值只能是-1、0、1。反之,只要二叉樹上一個結(jié)點的BF的絕對值大于1,則該二叉樹就不是平衡二叉樹。下圖演示了平衡二叉樹和非平衡二叉樹。 從1這點來看紅黑樹是犧牲了嚴格的高度平衡的優(yōu)越條件為代價紅黑樹能夠以O(shè)(log2 n)的時間復雜度進行搜索、插入、刪除操作。此外,由于它的設(shè)計,任何不平衡都會在三次旋轉(zhuǎn)之內(nèi)解決。當然,還有一些更好的,但實現(xiàn)起來更復雜的數(shù)據(jù)結(jié)構(gòu)能夠做到一步旋轉(zhuǎn)之內(nèi)達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的算法時間復雜度和AVL相同,但統(tǒng)計性能比AVL樹更高.

總結(jié)

以上是生活随笔為你收集整理的B树、B+树、AVL树、红黑树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。