B-Tree 和 B+Tree傻傻分不清楚

B-Tree

B-Tree又叫作B樹,和平衡二叉樹不一樣的地方在於B樹是多叉樹(平衡多路查找樹),Oracle和MongoDB的索引技術就是基於B樹的數據結構,B樹也能夠看做是對2-3查找樹的一種擴展。面試

一個m階的B-Tree有如下性質數據庫

  1. 每一個節點最多有m個子節點;
  2. 每一個非葉子節點(根節點除外)至少含有m/2個子節點;
  3. 若是根節點不是葉子節點,那麼根節點至少有兩個子節點;
  4. 每一個節點上,全部的關鍵字都是有序的,從左到右,依次從小到大排序;
  5. 每一個關鍵字的左子樹的均值小於當前關鍵字,右子樹的均值大於當前關鍵字;
  6. 每一個節點都存有索引和數據;
  7. 對於一個非葉子節點而言,它最多能存儲m-1個關鍵字;
  8. 全部葉子節點位於同一層。

img

B樹查找

咱們以查找13爲例子:設計模式

第一次磁盤IO:定位到比17小,選擇最左子樹;數據結構

第二次磁盤IO:定位到比12大,選擇最右子樹;post

第三次磁盤IO:定位到13,查出對應的數據後,查找結束。學習

B樹插入

對於一個m階B樹,新節點通常是插在葉子層,可是須要根據實際的狀況考慮是否須要裂變。設計

1.若該節點中關鍵碼個數小於m-1,則直接插入;指針

2.若該節點中關鍵字個數等於m-1,則將進行分裂,以中間關鍵字爲界點將節點一分爲2,產生一個新的節點,並把中間那個關鍵字插入到父節點中,繼續判斷父節點的關鍵字個數是否等於m-1,依次判斷是否分裂,最壞狀況下可一直分裂到根節點,整個樹增長一層。blog

B樹刪除

B樹的刪除也很是複雜排序

若是關鍵字所在節點的原關鍵樹>=(m/2),說明刪除後仍可知足B樹的結構,能夠直接幹掉。

若是被刪除後再也不知足B樹的結構,則須要必定的調整過程:

若是其左右兄弟節點中有多餘的關鍵字,即與該節點相鄰的節點中關鍵字的數目大於(m/2)-1,就會將兄弟節點中的最大(左兄弟)或者最小(右兄弟)移到夫節點上,而後將雙親節點中小於(右兄弟的上移)或者大於(左節點上移)關鍵字的關鍵字下移到被刪關鍵字的節點中。

若是其左右兄弟都沒有多餘關鍵字的時候,狀況將變得很是很是複雜;需把刪除關鍵字節點與其左(或者右)兄弟節點中的關鍵字合併到(父節點指向該刪除關鍵字節點的左(右)兄弟節點的指針)所指向的兄弟節點中去,若是所以父節點中的關鍵字個數小於規定值,則須要對父節點作一樣的處理,最壞狀況下會使得整個樹減小一層。

總結

B樹相對於平衡二叉樹的不一樣是,每一個節點包含的關鍵字增多了,特別是在B樹應用到數據庫的時候,數據庫充分利用了磁盤塊的原理(磁盤數據存儲是採用塊的形式存儲的,每一個塊的大小爲4K,每次IO進行數據讀取時,同一個磁盤塊的數據能夠一次性讀取出來)把節點大小限制和充分使用在磁盤塊大小範圍;把樹的節點關鍵字增多後樹的層級比原來的二叉樹少了不少,大大減小了數據查找和比較的次數,提升了效率。

B+樹

B+Tree中若是有N個關鍵字則會擁有n個分支,而B樹中n個關鍵字的節點包含n+1個分支。

B+Tree中,每一個非根節點中的關鍵字個數是>=(m/2)且<=m,而B樹是>=(m/2)-1且<=(m-1)。

B+Tree中根節點的關鍵字個數是>=1且<=m,而B樹是>=1且<=(m-1)。

B+樹是B樹的一個升級版,由於B+Tree非葉子節點不存儲關鍵字記錄的指針,因此其相對於B樹來講B+樹更充分的利用了節點的空間,讓查找速度更加穩定,其速度徹底接近於二分查找。

\1. B+樹的非葉子節點不對關鍵字記錄的指針進行保存,只進行數據索引,使得B+樹非葉子節點能保存關鍵字的能力大大提高,並且樹的層級會更少;

2.B+樹葉子節點保存了其父節點的關鍵字記錄的指針,因此每次查詢必須到葉子節點才能真正獲取到相關數據,並且平不少叉樹的特色是全部子節點的層級相差不會超過一,因此查詢速度相對是很是穩定的;

3.B+Tree樹葉子節點的關鍵字從小到大有序排列,左邊結尾數據都會保存右邊節點開始數據的指針;

4.非葉子節點的子節點樹=關鍵字數。

img

B+樹查找

B+樹的查找規格是B樹同樣,都是按照大小一層一層往下,可是不一樣點在於其必定會執行到葉子節點,由於只有葉子節點纔會存儲數據的指針。

B+樹插入

插入操做所有在葉子節點中進行

1.若爲空樹,建立一個葉子節點,而後將記錄插入,同時這個葉子節點也是根節點;

2.若被插入的關鍵字所在的節點,其含有的關鍵字數目小於m,則直接插入;

3.若被插入關鍵字所在的節點的關鍵字數等於m的時候,則須要分裂爲兩個節點,並將m/2的關鍵字上移到父節點中,同時判斷父節點的關鍵字個數是否大於m,若是須要分裂繼續按照上面的流程進行分裂。

B+樹刪除

1.若是要刪除關鍵字所在節點的關鍵字個數,若是大於m/2,直接刪除便可;

2.當刪除關鍵字所在節點的關鍵字個數等於m/2的時候,若兄弟節點中含有多餘的關鍵字,也可從兄弟節點中借用關鍵字完成刪除操做;

3.若兄弟節點沒有多餘的關鍵字,則須要與其餘兄弟進行合併;

4.若是合併後致使父節點再也不符合B+樹的結構,則須要按照上面的規律進行再次結構的調整;

5.注意B+樹的結構(非葉子節點會存儲索引信息,葉子節點纔會存儲數據指針),修改完後還需修改其父節點中的索引值。

總結

\1. B+樹的層級更少;

\2. B+樹查詢速度更加穩定;

3.B+樹自然具有排序功能,因爲B+樹全部的葉子節點數據構成了一個有序鏈表,在查詢範圍區間數據的時候會更加方便,數據緊密性很好高;

4.B+樹全節點遍歷更快:B+樹遍歷整棵樹只須要遍歷全部的葉子節點便可,而B樹須要對每一層進行遍歷,因此B+樹更有利於全表掃描;

B*樹

B*樹是B+樹的變種,不一樣點以下

1.關鍵字個數限制,B+樹初始化的關鍵字的個數是m/2,而B樹的初始化個數是2m/3,因此B樹的層級會更少;

2.B+樹節點滿時就會分裂,而B*樹滿時會檢查兄弟節點是否滿,若是兄弟節點沒有滿的話則會向兄弟節點轉移關鍵字,若是兄弟節點也滿了的話則從當前節點和兄弟節點各拿出1/3的數據建立一個新的節點出來。這個特性使得其相對B+樹分裂的次數也更少;

3.B*樹除了根節點外的非葉子節點也會存儲兄弟節點的指針;

總結

B*樹對比 B+Tree其初始化的容量更大,存儲的關鍵字更多,層級更少,裂變次數也會更少。

來源:https://juejin.cn/post/6910880043980259342

歡迎關注公衆號 【碼農開花】一塊兒學習成長 我會一直分享Java乾貨,也會分享免費的學習資料課程和麪試寶典 回覆:【計算機】【設計模式】【面試】有驚喜哦

相關文章
相關標籤/搜索