1、二叉樹與B樹
1,二叉樹的問題分析
二叉樹須要加載到內存的,若是二叉樹的節點少,沒有什麼問題,可是若是二叉樹的節點不少(好比 1 億), 就存在以下問題:數據庫
![](http://static.javashuo.com/static/loading.gif)
- 問題 1:在構建二叉樹時,須要屢次進行 i/o 操做(海量數據存在數據庫或文件中),節點海量,構建二叉樹時,速度有影響
- 問題 2:節點海量,也會形成二叉樹的高度很大,會下降操做速度。
2,多叉樹
- 在二叉樹中,每一個節點有數據項,最多有兩個子節點。若是容許每一個節點能夠有更多的數據項和更多的子節點,就是多叉樹(multiway tree)
- 2-3 樹,2-3-4 樹就是多叉樹,多叉樹經過從新組織節點,減小樹的高度,能對二叉樹進行優化。
![](http://static.javashuo.com/static/loading.gif)
3,B樹的基本介紹
B 樹經過從新組織節點,下降樹的高度,而且減小 i/o 讀寫次數來提高效率。性能
![](http://static.javashuo.com/static/loading.gif)
- 如圖 B 樹經過從新組織節點, 下降了樹的高度.
- 文件系統及數據庫系統的設計者利用了磁盤預讀原理,將一個節點的大小設爲等於一個頁(頁的大小一般爲 4k),這樣每一個節點只須要一次 I/O 就能夠徹底載入
- 將樹的度 M 設置爲 1024(每一個節點的子節點的個數就稱爲該節點的度(degree)),在 600 億個元素中最多隻須要 4 次 I/O 操做就能夠讀取到想要的元素, B 樹(B+)普遍應用於文件存儲系統以及數據庫系統中。
2、2-3樹
1,2-3樹的特色:
- 2-3 樹的全部葉子節點都在同一層.(只要是 B 樹都知足這個條件)
- 有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點
- 有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點
- 2-3 樹是由二節點和三節點構成的樹。
2,2-3樹應用案例:
將數列{16, 24, 12, 32, 14, 26, 34, 10, 8, 28, 38, 20} 構建成 2-3 樹,並保證數據插入的大小順序。(演示一下構建 2-3樹的過程)優化
![](http://static.javashuo.com/static/loading.gif)
插入規則:spa
1) 2-3 樹的全部葉子節點都在同一層.(只要是 B 樹都知足這個條件)
2) 有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點.
3) 有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點
4) 當按照規則插入一個數到某個節點時,不能知足上面三個要求,就須要拆,先向上拆,若是上層滿,則拆本層, 拆後仍然須要知足上面 3 個條件。
5) 對於三節點的子樹的值大小仍然遵照(BST 二叉排序樹)的規則
3,2-3-4樹
![](http://static.javashuo.com/static/loading.gif)
3、B樹、B+樹和B*樹
1,B樹的介紹
B-tree 樹即 B 樹,B 即 Balanced,平衡的意思。
![](http://static.javashuo.com/static/loading.gif)
說明:設計
- B樹的階:節點的最多子節點個數。好比2-3樹的階是3,2-3-4樹的階是4
- B樹的搜索:從根結點開始,對結點內的關鍵字(有序)序列進行二分查找,若是命中則結束,不然進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指針爲空,或已是葉子結點
- 關鍵字集合分佈在整棵樹中,即葉子結點和非葉子節點都存放數據
- 搜索有可能在非葉子結點結束
- 其搜索性能等價於在關鍵字全集內作一次二分查找
2,B+樹的介紹
B+樹是B樹的變體,也是一種多路搜索樹。指針
B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據複製到新結點,最後在父結點中增長新結點的指針;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,因此它不須要指向兄弟的指針;code
![](http://static.javashuo.com/static/loading.gif)
說明:blog
- B+樹的搜索與B樹基本相同,區別是B+樹只有達到葉子結點才命中(B樹能夠在非葉子結點命中),其性能也等價於在關鍵字全集作一次二分查找
- 全部關鍵字都出如今葉子結點的鏈表中(即數據只能在葉子結點【也叫稠密索引】),且鏈表中的關鍵字(數據)剛好是有序的
- B+樹非葉子結點至關因而葉子結點的索引(稀疏索引),葉子結點至關因而存儲(關鍵字)數據的數據層;B樹的非葉子結點也存儲數據(數據信息),這樣致使每次加載io的數據量減少
- 更適合文件索引系統
- B數和B+樹各有本身的應用場景,不能說B+樹徹底比B樹好,反之亦然。
3,B*樹的介紹
B*樹是B+樹的變體,在B+樹的非根和非葉子結點再增長指向兄弟的指針。排序
B*
樹的分裂:當一個結點滿時,若是它的下一個兄弟結點未滿,那麼將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(由於兄弟結點的關鍵字範圍改變了);若是兄弟結點也滿了,則在原結點與兄弟結點之間增長新結點,並各複製1/3的數據到新結點,最後在父結點增長新結點的指針; 因此,B*樹分配新結點的機率比B+樹要低,空間使用率更高;索引
![](http://static.javashuo.com/static/loading.gif)
說明:
- B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3,而B+樹的快的最低使用率爲1/2
- B*樹分配新結點的機率比B+樹要低,空間使用率更高