什麼是B-樹?

什麼是B-樹呢?B-樹全名 Balance Tree,讀作B樹(中間的-,只是分隔做用,不要讀作B減樹哦)。mysql

B樹的特徵

B樹首先它也是屬於樹結構,除了樹結構的節點有序、查找高效外,還有如下特性。以一個m階的B樹來舉慄:web

  1. 根節點至少包含兩個子節點;
  2. 每一箇中間節點包括k-1個元素和k個子節點,其中m/2 <= k <= m
  3. 每個葉子節點包含k-1個元素,其中m/2 <= k <= m
  4. 每一個節點的元素從大到小有序,節點當中k-1個元素是k個子節點的值域的劃分。

純概念很差理解,來張圖描述。這裏使用的是3階B樹爲例:sql

在這裏插入圖片描述

節點【2,6】就知足以上說的特徵,它有兩個元素,分別是2和6,有三個子節點:一、3和五、8。節點1是小於值2,節點3和5是介於值2和6,節點8是大於值6數據庫

在這裏插入圖片描述

B樹的查找

若是須要查詢一個元素,改如何實現呢?假如要查詢的值是5svg

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述 在這裏插入圖片描述 在這裏插入圖片描述
在這裏插入圖片描述
  從圖中能夠看出,B樹查找的次數不比二叉查找樹要少,特別是當某個節點內元素較多的時候,比較次數更多,可是,比較操做是在內存中進行的,因此損耗能夠忽略不計,最重要的是B樹更加「矮胖」,相同數量節點比二叉查找樹存儲更多元素,減小了磁盤IO,磁盤IO纔是資源消耗的大頭3d

B樹的特徵說完了,再說一下b樹的插入和刪除操做。假如咱們要插入的值是4,自上而下的查找,得知值4應該在 3和5之間xml

B樹的插入操做

在這裏插入圖片描述

可是,節點 3,5 已經有兩個元素了,根據上面說的特性2,不能夠在 3,5節點插入元素,父節點 2,6 也是兩元素節點,也不能插入,繼續向上,發現頂級節點9,它是單元素節點,能夠升級成雙元素節點,雙元素分別爲4和9,節點 2,6得拆分兩個節點,分別是2和6blog

在這裏插入圖片描述

是否是很麻煩,爲了插入一個節點居然挪動了這麼多節點,可是,也是由於這麼麻煩,讓B樹維持多路平衡索引

B樹的刪除操做

假如要刪除元素值11,先自上而下的查找元素值11圖片

在這裏插入圖片描述

找到元素11後,進行刪除,刪除完後,發現節點12下面只有一個子節點了,不符合上文說的「每一箇中間節點包括k-1個元素和k個子節點,其中m/2 <= k <= m」,因此,找到元素值 12,13,15的中位數13,13上移一階,節點12下移一階成爲第一個子節點(這個過程成爲左旋
在這裏插入圖片描述

在這裏插入圖片描述

B樹的基礎概念講完了,最後說一下B樹的應用,B樹主要應用文件系統和部分數據庫索引,好比著名的非關係數據庫MongoDB,可是,大部分關係型數據庫,好比mysql,mysql沒有使用B樹,使用的是B+樹來做爲索引的實現,這是爲何呢?這個有機會再討論吧

相關文章
相關標籤/搜索