二叉樹和B樹
二叉樹的問題分析
-
二叉樹操作效率高
-
二叉樹需要載入到記憶體,若二叉樹的節點多存在如下問題:
-
問題1:構建二叉樹時,需多次進行I/O操作,對與速度有影響
-
問題2:節點海量造成二叉樹的高度很大,會降低操作速度
-
多叉樹
-
在二叉樹中,每個節點有資料項,最多有兩個子節點。如果允許每個節點可以有更多的資料線和更多的子節點,就是多叉樹(multiway tree)
-
多叉樹通過重新組織節點,減少樹的高度,能對二叉樹進行優化
B樹的基本介紹
B樹通過重新組織節點,降低樹的高度,並且減少I/O讀寫次數來提升效率
-
如圖B樹通過重新組織節點降低了樹的高度
-
檔案系統及資料庫系統設計者利用了磁碟預讀原理,將一個節點的大小設為等於一個頁(頁的大小為4k)這樣每隔節點只需要一次I/O就可以完全載入
-
將樹的度M設定為1024,在600億個元素中最多隻需要4次I/O操作就可以讀取到想要的元素,B樹廣泛應用於檔案儲存系統以及資料庫系統中
節點度:節點子樹的個數
樹的度:節點度的最大值是樹的度
2-3樹
基本介紹
-
2-3樹是最簡單的B-樹結構
-
2-3樹的所有葉子節點都在同一層
-
有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點
-
有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點
-
2-3樹是由二節點和三節點構成的樹
2-3樹應用案例
要求
將數列{16,24,12,32,14,26,34,10,8,28,38,20}構建成2-3樹,並保證資料插入的大小順序。
插入規則
-
2-3樹的所有葉子節點都在同一層
-
有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點
-
有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點
-
當按照規則插入一個數到某個節點時,不能滿足上面的要求,就需要拆,先向上拆,如果上層滿,則拆本層,拆後仍需滿足上述條件
-
對於三節點的子樹的值大小仍然遵循(BST 二叉排序樹)的規則
構建過程圖解
B樹、B+樹和B*樹
B樹
-
B-tree即B樹,B即Balanced,平衡的意思。
-
2-3樹和2-3-4樹都是B樹
B樹如圖:
說明
-
B樹的階:節點的最多的子節點個數
-
B樹的搜尋,從根節點開始,對節點內的關鍵字(有序)序列進行二分查詢,命中則退出,否則查詢孩子節點,直到所對應的孩子指標為空,或已經是葉子節點
-
關鍵字分佈在整棵樹中,即葉子節點和非葉子節點都存放資料
-
搜尋有可能在非葉子節點結束
-
其搜尋性等價於在關鍵字全集內做一次二分查詢
B+樹
-
B+樹是B樹的變體,也是一種多路搜尋樹
如圖:
說明
-
B+樹的搜尋與B樹基本相同,區別是B+樹只有達到葉子節點才命中,其效能也等價於在關鍵字全集做一次二分查詢
-
所有關鍵字都出現在葉子節點的連結串列中,資料只能在葉子節點(稠密索引),且連結串列中的關鍵字是有序的
-
非葉子節點相當於是葉子節點的所有(稀疏索引),葉子節點相當於是儲存(關鍵字)資料的資料層
-
更適合檔案索引系統
-
B樹和B+樹各有自己的應用場景
B*樹
-
B*樹是B+樹的變體,在B+樹的非根和非葉子節點再增加兄弟指標
如圖
說明
-
B樹定義了非葉子節點關鍵字個數至少為(2/3)M,即塊的最低使用率為2/3,而B+樹塊的最低使用率為1/2
-
從第一個特點可以看出,B*樹分配新節點的概率比B+樹要低,空間使用率更高
所有原始碼都可在gitee倉庫中下載:https://gitee.com/vvwhyyy/java_algorithm