1. 程式人生 > >B+樹的簡單介紹

B+樹的簡單介紹

前言

部落格編寫人:Willam
部落格編寫時間:2017/3/28
博主郵箱:2930526477@qq.com(有志同道合之人,可以加qq交流交流程式設計心得)

1、B+樹的介紹

B+樹是B-樹的變體,也是一種多路搜尋樹:
其定義基本與B-樹同,除了:

  1. 有n顆子樹的結點中含有n個關鍵字
  2. 所有的葉子結點中包含了全部關鍵字的資訊,以及指向包含這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結
  3. 所有的非終端結點可以看成索引部分,結點中僅含有其子樹(根結點)中最大(或最小)關鍵字。

如下圖所示,就是一個B+樹
這裡寫圖片描述

  1. 根結點只有1個,分支數量範圍[2,m]。
  2. 除根以外的非葉子結點,每個結點包含分支數範圍[[m/2],m],其中[m/2]表示取大於m/2的最小整數。
  3. 所有非葉子節點的關鍵字數目等於它的分支數量
  4. 所有葉子節點都在同一層,且關鍵字數目範圍是[[m/2],m],其中[m/2]表示取大於m/2的最小整數。
  5. 所有非葉子節點的關鍵字可以看成是索引部分,這些索引等於其子樹(根結點)中的最大(或最小)關鍵
    字。例如一個非葉子節點包含資訊: (n,A0,K0, A1,K1,……,Kn,An),其中Ki為關鍵字,Ai為指向子樹根結點的指標,n表示關鍵字個數。即Ai所指子樹中的關鍵字均小於或等於Ki,而Ai+1所指的關鍵字均大於Ki(i=1,2,……,n)。

  6. 葉子節點包含全部關鍵字的資訊(非葉子節點只包含索引),且葉子結點中的所有關鍵字依照大小順序連結(所以一個B+樹通常有兩個頭指標,一個是指向根節點的root,另一個是指向最小關鍵字的sqt)。

2、B+樹比B-樹的優勢

下面是B+樹和B-樹的一個對比截圖:(來自:參考檔案
這裡寫圖片描述

為什麼說B+-tree比B 樹更適合實際應用中作業系統的檔案索引和資料庫索引?(摘抄自:參考檔案

(1)B+-tree的磁碟讀寫代價更低

B+-tree的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對B 樹更小。如果把所有同一內部結點的關
鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也就越多。相
對來說IO讀寫次數也就降低了。
    舉個例子,假設磁碟中的一個盤塊容納16bytes,而一個關鍵字2bytes,一個關鍵字具體資訊指標2
bytes。一棵 9階B-tree ( 一個結點最多8個關鍵字) 的內部結點需要2個盤快。而B+ 樹內部結點只需要1個盤快。當需要把 內部結點讀入記憶體中的時候,B 樹就比B+ 樹多一次盤塊查詢時間(在磁碟中就是碟片旋轉的時間)。

(2)B+-tree的查詢效率更加穩定

由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從
根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。