1. 程式人生 > 其它 >B-Tree and B+Tree

B-Tree and B+Tree

B和B+樹的區別

why Balanced Tree

空間區域性性原理:如果一個儲存器的某個位置被訪問,那麼將它附近的位置也會被訪問。

傳統用來搜尋的平衡二叉樹有很多,如 AVL 樹,紅黑樹等。這些樹在一般情況下查詢效能非常好,但當資料非常大的時候它們就無能為力了。原因當資料量非常大時,記憶體不夠用,大部分資料只能存放在磁碟上,只有需要的資料才載入到記憶體中。一般而言記憶體訪問的時間約為 50 ns,而磁碟在 10 ms 左右。速度相差了近 5 個數量級,磁碟讀取時間遠遠超過了資料在記憶體中比較的時間。這說明程式大部分時間會阻塞在磁碟 IO 上。那麼我們如何提高程式效能?減少磁碟 IO 次數。 B-樹每次將範圍分割為多個區間,區間越多,定位資料越快越精確。

b樹

  1. 關鍵字集合分佈在整顆樹中;
  2. 任何一個關鍵字出現且只出現在一個結點中;
  3. 搜尋有可能在非葉子結點結束;
  4. 其搜尋效能等價於在關鍵字全集內做一次二分查詢;

b+樹

  1. 有n棵子樹的非葉子結點中含有n個關鍵字(b樹是n-1個),這些關鍵字不儲存資料,只用來索引,所有資料都儲存在葉子節點(b樹是每個關鍵字都儲存資料)。
  2. 所有的葉子結點中包含了全部關鍵字的資訊,及指向含這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序連結。
  3. 所有的非葉子結點可以看成是索引部分,結點中僅含其子樹中的最大(或最小)關鍵字。
  4. 通常在b+樹上有兩個頭指標,一個指向根結點,一個指向關鍵字最小的葉子結點。
  5. 同一個數字會在不同節點中重複出現,根節點的最大元素就是b+樹的最大元素。

b+樹相比於b樹的查詢優勢:

  1. b+樹的中間節點不儲存資料,所以磁碟頁能容納更多節點元素,更“矮胖”;
  2. b+樹查詢必須查詢到葉子節點,b樹只要匹配到即可不用管元素位置,因此b+樹查詢更穩定(並不慢);
  3. 對於範圍查詢來說,b+樹只需遍歷葉子節點連結串列即可,b樹卻需要重複地中序遍歷

B+樹葉節點兩兩相連可大大增加區間訪問性,可使用在範圍查詢等,而B-樹每個節點 key 和 data 在一起,則無法區間查詢。

由於B-樹節點內部每個 key 都帶著 data 域,而B+樹節點只儲存 key 的副本,真實的 key 和 data 域都在葉子節點儲存。前面說過磁碟是分 block 的,一次磁碟 IO 會讀取若干個 block,具體和作業系統有關,那麼由於磁碟 IO 資料大小是固定的,在一次 IO 中,單個元素越小,量就越大
這就意味著B+樹單次磁碟 IO 的資訊量大於B-樹,從這點來看B+樹相對B-樹磁碟 IO 次數少。