B树、B+树、AVL树、红黑树
from:?http://blog.csdn.net/chlele0105/article/details/8473846
binary search tree,中文翻譯為二叉搜索樹、二叉查找樹或者二叉排序樹。簡稱為BST
B樹
???????即二叉搜索樹:
?????? 1.所有非葉子結點至多擁有兩個兒子(Left和Right);
?????? 2.所有結點存儲一個關鍵字;
?????? 3.非葉子結點的左指針指向小于其關鍵字的子樹,右指針指向大于其關鍵字的子樹;
???????如:
???????
?????? B樹的搜索,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那么就命中;
否則,如果查詢關鍵字比結點關鍵字小,就進入左兒子;如果比結點關鍵字大,就進入
右兒子;如果左兒子或右兒子的指針為空,則報告找不到相應的關鍵字;
???????如果B樹的所有非葉子結點的左右子樹的結點數目均保持差不多(平衡),那么B樹
的搜索性能逼近二分查找;但它比連續內存空間的二分查找的優點是,改變B樹結構
(插入與刪除結點)不需要移動大段的內存數據,甚至通常是常數開銷;
???????如:
??????
???但B樹在經過多次插入與刪除后,有可能導致不同的結構:
?? 右邊也是一個B樹,但它的搜索性能已經是線性的了;同樣的關鍵字集合有可能導致不同的
樹結構索引;所以,使用B樹還要考慮盡可能讓B樹保持左圖的結構,和避免右圖的結構,也就
是所謂的“平衡”問題;??????
???????實際使用的B樹都是在原B樹的基礎上加上平衡算法,即“平衡二叉樹”;如何保持B樹
結點分布均勻的平衡算法是平衡二叉樹的關鍵;平衡算法是一種在B樹中插入和刪除結點的
策略;
?
?
B-樹
???????是一種多路搜索樹(并不是二叉的):
?????? 1.定義任意非葉子結點最多只有M個兒子;且M>2;
?????? 2.根結點的兒子數為[2, M];
?????? 3.除根結點以外的非葉子結點的兒子數為[M/2, M];
?????? 4.每個結點存放至少M/2-1(取上整)和至多M-1個關鍵字;(至少2個關鍵字)
?????? 5.非葉子結點的關鍵字個數=指向兒子的指針個數-1;
?????? 6.非葉子結點的關鍵字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
?????? 7.非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小于K[1]的
子樹,P[M]指向關鍵字大于K[M-1]的子樹,其它P[i]指向關鍵字屬于(K[i-1], K[i])的子樹;
?????? 8.所有葉子結點位于同一層;
???????如:(M=3)
?????? B-樹的搜索,從根結點開始,對結點內的關鍵字(有序)序列進行二分查找,如果
命中則結束,否則進入查詢關鍵字所屬范圍的兒子結點;重復,直到所對應的兒子指針為
空,或已經是葉子結點;
B-樹的特性:
?????? 1.關鍵字集合分布在整顆樹中;
?????? 2.任何一個關鍵字出現且只出現在一個結點中;
?????? 3.搜索有可能在非葉子結點結束;
?????? 4.其搜索性能等價于在關鍵字全集內做一次二分查找;
?????? 5.自動層次控制;
???????由于限制了除根結點以外的非葉子結點,至少含有M/2個兒子,確保了結點的至少
利用率,其最底搜索性能為:
????
???????其中,M為設定的非葉子結點最多子樹個數,N為關鍵字總數;
???????所以B-樹的性能總是等價于二分查找(與M值無關),也就沒有B樹平衡的問題;
???????由于M/2的限制,在插入結點時,如果結點已滿,需要將結點分裂為兩個各占
M/2的結點;刪除結點時,需將兩個不足M/2的兄弟結點合并;
AVL樹
AVL樹是最先發明的自平衡二叉查找樹。在AVL樹中任何節點的兩個子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查找、插入和刪除在平均和最壞情況下都是O(log n)。
?
?
B+樹
?????? B+樹是B-樹的變體,也是一種多路搜索樹:
?????? 1.其定義基本與B-樹同,除了:
?????? 2.非葉子結點的子樹指針與關鍵字個數相同;
?????? 3.非葉子結點的子樹指針P[i],指向關鍵字值屬于[K[i], K[i+1])的子樹
(B-樹是開區間);
?????? 5.為所有葉子結點增加一個鏈指針;
?????? 6.所有關鍵字都在葉子結點出現;
???????如:(M=3)
???B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹可以在
非葉子結點命中),其性能也等價于在關鍵字全集做一次二分查找;
?????? B+的特性:
?????? 1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好
是有序的;
?????? 2.不可能在非葉子結點命中;
?????? 3.非葉子結點相當于是葉子結點的索引(稀疏索引),葉子結點相當于是存儲
(關鍵字)數據的數據層;
?????? 4.更適合文件索引系統;
??
B*樹
???????是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針;
???B*樹定義了非葉子結點關鍵字個數至少為(2/3)*M,即塊的最低使用率為2/3
(代替B+樹的1/2);
?????? B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數據
復制到新結點,最后在父結點中增加新結點的指針;B+樹的分裂只影響原結點和父
結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;
?????? B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分
數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字
(因為兄弟結點的關鍵字范圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之
間增加新結點,并各復制1/3的數據到新結點,最后在父結點增加新結點的指針;
???????所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;
??
小結
?????? B樹:二叉樹,每個結點只存儲一個關鍵字,等于則命中,小于走左結點,大于
走右結點;
?????? B-樹:多路搜索樹,每個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵
字范圍的子結點;
???????所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;
?????? B+樹:在B-樹基礎上,為葉子結點增加鏈表指針,所有關鍵字都在葉子結點
中出現,非葉子結點作為葉子結點的索引;B+樹總是到葉子結點才命中;
?????? B*樹:在B+樹基礎上,為非葉子結點也增加鏈表指針,將結點的最低利用率
從1/2提高到2/3;
紅黑樹與AVL(自平衡二叉查找樹)樹
《算法導論》關于紅黑樹的定義:
正如在CLRS中定義的那樣(CLRS指的是就是算法導論這本書《Introduction to Algorithms》,CLRS是該書作者Cormen, Leiserson, Rivest and Stein的首字母縮寫),一棵紅黑樹是指一棵滿足下述性質的二叉搜索樹(BST, binary search tree): 1. 每個結點或者為黑色或者為紅色。 2. 根結點為黑色。 3. 每個葉結點(實際上就是NULL指針)都是黑色的。 4. 如果一個結點是紅色的,那么它的兩個子節點都是黑色的(也就是說,不能有兩個相鄰的紅色結點)。 5. 對于每個結點,從該結點到其所有子孫葉結點的路徑中所包含的黑色結點數量必須相同。
數據項只能存儲在內部結點中(internal node)。我們所指的"葉結點"在其父結點中可能僅僅用一個NULL指針表示,但是將它也看作一個實際的結點有助于描述紅黑樹的插入與刪除算法,葉結點一律為黑色。?定義詳解:?根據性質 5:紅黑樹從根節點到每個葉子節點的路徑都包含相同數量的黑色節點,因此從根節點到葉子節點的路徑中包含的黑色節點數被稱為樹的“黑色高度(black-height)”。 性質 4 則保證了從根節點到葉子節點的最長路徑的長度不會超過任何其他路徑的兩倍。假如有一棵黑色高度為 3 的紅黑樹:從根節點到葉節點的最短路徑長度是 2,該路徑上全是黑色節點(黑節點 – 黑節點 – 黑節點)。最長路徑也只可能為 4,在每個黑色節點之間插入一個紅色節點(黑節點 – 紅節點 – 黑節點 – 紅節點 – 黑節點),性質 4 保證絕不可能插入更多的紅色節點。由此可見,紅黑樹中最長路徑就是一條紅黑交替的路徑。 根據定義我們做如下練習: -不符合定義的一顆非紅黑樹:??紅黑樹的這5個性質中,第3點是比較難理解的,但它卻非常有必要。我們看圖1中的左邊這張圖,如果不使用黑哨兵,它完全滿足紅黑樹性質,結點50到兩個葉結點8和葉結點82路徑上的黑色結點數都為2個。但如果加入黑哨兵后(如圖1右圖中的小黑圓點),葉結點的個數變為8個黑哨兵,根結點50到這8個葉結點路徑上的黑高度就不一樣了,所以它并不是一棵紅黑樹。?-兩顆正確的紅黑樹:??定理:
一棵擁有n個內部結點的紅黑樹的樹高h<=2log(n+1)
由此我們可以得出結論:對于給定的黑色高度為 N 的紅黑樹,從根到葉子節點的最短路徑長度為 N-1,最長路徑長度為 2 * (N-1)。 提示:排序二叉樹的深度直接影響了檢索的性能,正如前面指出,當插入節點本身就是由小到大排列時,排序二叉樹將變成一個鏈表,這種排序二叉樹的檢索性能最低:N 個節點的二叉樹深度就是 N-1。?紅黑樹通過上面這種限制來保證它大致是平衡的——因為紅黑樹的高度不會無限增高,這樣保證紅黑樹在最壞情況下都是高效的,不會出現普通排序二叉樹的情況。?由于紅黑樹只是一個特殊的排序二叉樹,因此對紅黑樹上的只讀操作與普通排序二叉樹上的只讀操作完全相同,只是紅黑樹保持了大致平衡,因此檢索性能比排序二叉樹要好很多。?但在紅黑樹上進行插入操作和刪除操作會導致樹不再符合紅黑樹的特征,因此插入操作和刪除操作都需要進行一定的維護,以保證插入節點、刪除節點后的樹依然是紅黑樹。
3 紅黑樹和AVL樹的比較
1.?紅黑樹并不追求“完全平衡”——它只要求部分地達到平衡要求,降低了對旋轉的要求,從而提高了性能。 紅黑樹能夠以O(log2 n)?的時間復雜度進行搜索、插入、刪除操作。此外,由于它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的數據結構,能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的算法時間復雜度和AVL相同,但統計性能比AVL樹更高。 當然,紅黑樹并不適應所有應用樹的領域。如果數據基本上是靜態的,那么讓他們待在他們能夠插入,并且不影響平衡的地方會具有更好的性能。如果數據完全是靜態的,做一個哈希表,性能可能會更好一些。 紅黑樹是一個更高效的檢索二叉樹,因此常常用來實現關聯數組。典型地,JDK 提供的集合類 TreeMap 本身就是一個紅黑樹的實現。 IBM DevelopWorks?上一篇文章講解非常好,供參考。 TreeMap 和 TreeSet 是 Java Collection Framework 的兩個重要成員,其中 TreeMap 是 Map 接口的常用實現類,而 TreeSet 是 Set 接口的常用實現類。雖然 HashMap 和 HashSet 實現的接口規范不同,但 TreeSet 底層是通過 TreeMap 來實現的,因此二者的實現方式完全一樣。而 TreeMap 的實現就是紅黑樹算法。 對于 TreeMap 而言,由于它底層采用一棵“紅黑樹”來保存集合中的 Entry,這意味這 TreeMap 添加元素、取出元素的性能都比 HashMap 低:當 TreeMap 添加元素時,需要通過循環找到新增 Entry 的插入位置,因此比較耗性能;當從 TreeMap 中取出元素時,需要通過循環才能找到合適的 Entry,也比較耗性能。 但 TreeMap、TreeSet 比 HashMap、HashSet 的優勢在于:TreeMap 中的所有 Entry 總是按 key 根據指定排序規則保持有序狀態,TreeSet 中所有元素總是根據指定排序規則保持有序狀態。 2?AVL樹是最先發明的自平衡二叉查找樹。在AVL樹中任何節點的兩個兒子子樹的高度最大差別為一,所以它也被稱為高度平衡樹。查找、插入和刪除在平均和最壞情況下都是O(log n)。增加和刪除可能需要通過一次或多次樹旋轉來重新平衡這個樹。 引入二叉樹的目的是為了提高二叉樹的搜索的效率,減少樹的平均搜索長度.為此,就必須每向二叉樹插入一個結點時調整樹的結構,使得二叉樹搜索保持平衡,從而可能降低樹的高度,減少的平均樹的搜索長度. AVL樹的定義: 一棵AVL樹滿足以下的條件: 1>它的左子樹和右子樹都是AVL樹 2>左子樹和右子樹的高度差不能超過1 性質: 1>一棵n個結點的AVL樹的其高度保持在0(log2(n)),不會超過3/2log2(n+1) 2>一棵n個結點的AVL樹的平均搜索長度保持在0(log2(n)). 3>一棵n個結點的AVL樹刪除一個結點做平衡化旋轉所需要的時間為0(log2(n)). 為了保證平衡,AVL樹中的每個結點都有一個平衡因子(balance factor,以下用BF表示),它表示這個結點的左、右子樹的高度差,也就是左子樹的高度減去右子樹的高度的結果值。AVL樹上所有結點的BF值只能是-1、0、1。反之,只要二叉樹上一個結點的BF的絕對值大于1,則該二叉樹就不是平衡二叉樹。下圖演示了平衡二叉樹和非平衡二叉樹。 從1這點來看紅黑樹是犧牲了嚴格的高度平衡的優越條件為代價紅黑樹能夠以O(log2 n)的時間復雜度進行搜索、插入、刪除操作。此外,由于它的設計,任何不平衡都會在三次旋轉之內解決。當然,還有一些更好的,但實現起來更復雜的數據結構能夠做到一步旋轉之內達到平衡,但紅黑樹能夠給我們一個比較“便宜”的解決方案。紅黑樹的算法時間復雜度和AVL相同,但統計性能比AVL樹更高.總結
以上是生活随笔為你收集整理的B树、B+树、AVL树、红黑树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GPUImage
- 下一篇: opencv实现图像的拼接功能