1. 程式人生 > >多路查詢樹

多路查詢樹

一、二叉樹與B樹

1,二叉樹的問題分析

  二叉樹需要載入到記憶體的,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多(比如 1 億), 就存在如下問題:

        

  • 問題 1:在構建二叉樹時,需要多次進行 i/o 操作(海量資料存在資料庫或檔案中),節點海量,構建二叉樹時,速度有影響
  • 問題 2:節點海量,也會造成二叉樹的高度很大,會降低操作速度。

2,多叉樹

  • 在二叉樹中,每個節點有資料項,最多有兩個子節點。如果允許每個節點可以有更多的資料項和更多的子節點,就是多叉樹(multiway tree)
  • 2-3 樹,2-3-4 樹就是多叉樹,多叉樹通過重新組織節點,減少樹的高度,能對二叉樹進行優化。

       

3,B樹的基本介紹

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

     

  • 如圖 B 樹通過重新組織節點, 降低了樹的高度.
  • 檔案系統及資料庫系統的設計者利用了磁碟預讀原理,將一個節點的大小設為等於一個頁(頁的大小通常為 4k),這樣每個節點只需要一次 I/O 就可以完全載入
  • 將樹的度 M 設定為 1024(每個節點的子節點的個數就稱為該節點的度(degree)),在 600 億個元素中最多隻需要 4 次 I/O 操作就可以讀取到想要的元素, B 樹(B+)廣泛應用於檔案儲存系統以及資料庫系統中。

二、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樹的過程)

   

插入規則:

1) 2-3 樹的所有葉子節點都在同一層.(只要是 B 樹都滿足這個條件) 
2) 有兩個子節點的節點叫二節點,二節點要麼沒有子節點,要麼有兩個子節點. 
3) 有三個子節點的節點叫三節點,三節點要麼沒有子節點,要麼有三個子節點 
4) 當按照規則插入一個數到某個節點時,不能滿足上面三個要求,就需要拆,先向上拆,如果上層滿,則拆本層, 拆後仍然需要滿足上面 3 個條件。 
5) 對於三節點的子樹的值大小仍然遵守(BST 二叉排序樹)的規則

3,2-3-4樹

   

三、B樹、B+樹和B*樹

1,B樹的介紹

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

 

  

說明:

  1. B樹的階:節點的最多子節點個數。比如2-3樹的階是3,2-3-4樹的階是4
  2. B樹的搜尋:從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為空,或已經是葉子結點
  3. 關鍵字集合分佈在整棵樹中,即葉子結點和非葉子節點都存放資料
  4. 搜尋有可能在非葉子結點結束
  5. 其搜尋效能等價於在關鍵字全集內做一次二分查詢

2,B+樹的介紹

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

  B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的資料複製到新結點,最後在父結點中增加新結點的指標;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指標;

   

說明:

  1. B+樹的搜尋與B樹基本相同,區別是B+樹只有達到葉子結點才命中(B樹可以在非葉子結點命中),其效能也等價於在關鍵字全集做一次二分查詢
  2. 所有關鍵字都出現在葉子結點的連結串列中(即資料只能在葉子結點【也叫稠密索引】),且連結串列中的關鍵字(資料)恰好是有序的
  3. B+樹非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層;B樹的非葉子結點也儲存資料(資料資訊),這樣導致每次載入io的資料量減小
  4. 更適合檔案索引系統
  5. B數和B+樹各有自己的應用場景,不能說B+樹完全比B樹好,反之亦然。

3,B*樹的介紹

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

  B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那麼將一部分資料移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字範圍改變了);如果兄弟結點也滿了,則在原結點與兄弟結點之間增加新結點,並各複製1/3的資料到新結點,最後在父結點增加新結點的指標; 所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;

      

 說明:

  1. B*樹定義了非葉子結點關鍵字個數至少為(2/3)*M,即塊的最低使用率為2/3,而B+樹的快的最低使用率為1/2
  2. B*樹分配新結點的概率比B+樹要低,空間使用率更高