1. 程式人生 > >Java資料結構(十五)—— 多路查詢樹

Java資料結構(十五)—— 多路查詢樹

多路查詢樹

二叉樹和B樹

二叉樹的問題分析
  • 二叉樹操作效率高

  • 二叉樹需要載入到記憶體,若二叉樹的節點多存在如下問題:

    1. 問題1:構建二叉樹時,需多次進行I/O操作,對與速度有影響

    2. 問題2:節點海量造成二叉樹的高度很大,會降低操作速度

多叉樹
  1. 在二叉樹中,每個節點有資料項,最多有兩個子節點。如果允許每個節點可以有更多的資料線和更多的子節點,就是多叉樹(multiway tree)

  2. 多叉樹通過重新組織節點,減少樹的高度,能對二叉樹進行優化

B樹的基本介紹

B樹通過重新組織節點,降低樹的高度,並且減少I/O讀寫次數來提升效率

  1. 如圖B樹通過重新組織節點降低了樹的高度

  2. 檔案系統及資料庫系統設計者利用了磁碟預讀原理,將一個節點的大小設為等於一個頁(頁的大小為4k)這樣每隔節點只需要一次I/O就可以完全載入

  3. 將樹的度M設定為1024,在600億個元素中最多隻需要4次I/O操作就可以讀取到想要的元素,B樹廣泛應用於檔案儲存系統以及資料庫系統中

節點度:節點子樹的個數

樹的度:節點度的最大值是樹的度

2-3樹

基本介紹

  1. 2-3樹是最簡單的B-樹結構

  2. 2-3樹的所有葉子節點都在同一層

  3. 有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點

  4. 有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點

  5. 2-3樹是由二節點和三節點構成的樹

2-3樹應用案例

要求

將數列{16,24,12,32,14,26,34,10,8,28,38,20}構建成2-3樹,並保證資料插入的大小順序。

插入規則

  1. 2-3樹的所有葉子節點都在同一層

  2. 有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點

  3. 有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點

  4. 當按照規則插入一個數到某個節點時,不能滿足上面的要求,就需要拆,先向上拆,如果上層滿,則拆本層,拆後仍需滿足上述條件

  5. 對於三節點的子樹的值大小仍然遵循(BST 二叉排序樹)的規則

構建過程圖解

B樹、B+樹和B*樹

B樹
  • B-tree即B樹,B即Balanced,平衡的意思。

  • 2-3樹和2-3-4樹都是B樹

B樹如圖:

說明

  1. B樹的階:節點的最多的子節點個數

  2. B樹的搜尋,從根節點開始,對節點內的關鍵字(有序)序列進行二分查詢,命中則退出,否則查詢孩子節點,直到所對應的孩子指標為空,或已經是葉子節點

  3. 關鍵字分佈在整棵樹中,即葉子節點和非葉子節點都存放資料

  4. 搜尋有可能在非葉子節點結束

  5. 其搜尋性等價於在關鍵字全集內做一次二分查詢

B+樹
  • B+樹是B樹的變體,也是一種多路搜尋樹

如圖:

說明

  1. B+樹的搜尋與B樹基本相同,區別是B+樹只有達到葉子節點才命中,其效能也等價於在關鍵字全集做一次二分查詢

  2. 所有關鍵字都出現在葉子節點的連結串列中,資料只能在葉子節點(稠密索引),且連結串列中的關鍵字是有序的

  3. 非葉子節點相當於是葉子節點的所有(稀疏索引),葉子節點相當於是儲存(關鍵字)資料的資料層

  4. 更適合檔案索引系統

  5. B樹和B+樹各有自己的應用場景

B*樹
  • B*樹是B+樹的變體,在B+樹的非根和非葉子節點再增加兄弟指標

如圖

說明

  1. B樹定義了非葉子節點關鍵字個數至少為(2/3)M,即塊的最低使用率為2/3,而B+樹塊的最低使用率為1/2

  2. 從第一個特點可以看出,B*樹分配新節點的概率比B+樹要低,空間使用率更高

 

 所有原始碼都可在gitee倉庫中下載:https://gitee.com/vvwhyyy/java_algor