[數據結構]B樹及其基本操作、B+樹的基本概念

前言:寫B樹這種博客可能有很多大佬比我寫的好,甚至我下面的文章也有許多相似之處,我是參考了大佬們的博客寫下我的通俗理解,爲了更好的複習,有相似之處莫怪!!!如果你看得上我的理解,那是我的幸運,祝你們有所獲!!!

一、B樹

B樹就是B-樹,叫做B-tree,全稱Balance-tree(平衡多路查找樹),使用B-tree結構可以顯著減少定位記錄時所經歷的中間過程,從而加快存取速度,這個數據結構一般用於數據庫的索引,綜合效率較高。(平衡:左右分佈均勻,多路:相對於二叉樹而言,二叉樹就是二路查找樹,查找時只有兩條路,而B樹有多條路,父節點有多個子結點)
下面爲了通俗一點,我就沒按照數據庫那種理解:一個記錄應該包含關鍵字和對應數據,也就是關鍵字在數據庫中代表鍵,對應數據代表這個鍵在硬盤上的邏輯地址。下面單純只講關鍵字

B樹的定義:一棵m階B-tree(m>=3),每個結點至多可以擁有m個子結點。其也可以爲空樹,也可以爲滿足以下特性的樹:
1、若根結點不是葉子結點,則至少有兩個孩子結點,至多爲m個;(根結點至少包含一個關鍵字)
3、除根結點和葉子結點外,其他結點,至少有ceil(m/2)個孩子結點,至多m個,其包含的關鍵字數=孩子數-1;(ceil(x):返回大於或者等於x的最小整數,這是java中的Math庫函數,ceil(5/2)=2.0,ceil(2.5)=3,x必須是double類型,在這裏爲了方便就設爲分數
4、每個結點中的關鍵字都按照從小到大的順序排序,每個關鍵字的左子樹中的所有關鍵字都小於它,而右子樹的所有關鍵字都大於它。
5、所有葉子結點都出現在同一層次上,ceil(m/2)-1 <= 結點包含的關鍵字數目 <= m - 1;

在這裏插入圖片描述

二、B樹的基本操作

1、B樹的查找操作

B樹的查找和二叉排序樹的查找類似,B樹每個結點上是多關鍵字的有序表,首先把根結點取出,在根結點所包含的關鍵字中查找給定的關鍵字,使用順序查找也可以使用折半查找。若找到,則查找成功,否則,從指針信息指向的子樹中去查找,當到達葉子結點時,則說明樹中沒有對應的關鍵字,查找失敗。

2、B樹的插入操作

在B樹上插入關鍵字,首先要經過一個樹根結點到葉子的查找過程,查找出K的插入位置,然後再進行插入。關鍵字的插入不是在葉子結點上進行的,而是首先在最底層的某個非終端結點中添加一個關鍵字,若該結點的關鍵字個數不超過m-1,則插入完成;否則·,若該節點的關鍵字個數已達到m個,這與B樹的定義不符,將引起結點的“分裂”。
分裂方法:
(1)將結點中的關鍵字分成三部分,使得前後兩部分的關鍵字個數均大於等ceil(m/2)-1,而中間部分只有一個關鍵字。
(2)前後兩部分分成爲兩個結點,而中間部分的關鍵字將插入到父結點中。
(3)若插入父結點後,父結點中關鍵字個數超過m-1,則父結點繼續分裂,直到插入某個父結點,且其關鍵字個數小於m。

在這裏插入圖片描述
3、B樹的刪除操作

(1)如果當前要刪除關鍵字的結點位於非葉子結點上,則用後繼結點覆蓋要刪除的結點關鍵字,然後在後繼所在的子支中刪除該後繼結點的關鍵字。
(2)如果後繼結點的關鍵字個數>=ceil(m/2)-1,則結束刪除操作。否則執行下一步
(3)如果兄弟結點關鍵字個數大於ceil(m/2)-1,則兄弟結點的一個關鍵字上移到父結點,父結點中的一個關鍵字下移到後繼結點。刪除操作結束。否則執行下一步
(4)將父結點中關鍵字下移與當前結點關鍵字及其兄弟結點中的關鍵字合併,形成一個新的結點。原父結點中的關鍵字的兩個孩子指針就變成了一個孩子指針,指向這個新結點。然後當前結點你的指針指向父結點。

一顆4階B樹,非根結點關鍵字個數,至少ceil(m/2)-1=1,至多3個。(此圖爲了理解,所以設置4階,根結點至少一個關鍵字)
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

三、B+樹

B+樹是一種數據結構,通常用於數據庫和操作系統的文件系統中。B+樹的特點是能夠保持數據穩定有序,其插入與修改擁有較穩定的對數時間複雜度。B+樹元素自底向上插入,這與二叉樹恰好相反。一棵B+樹包含根結點、內部結點和葉子結點。
在這裏插入圖片描述

B+樹是B樹的一種變形形式,一棵m階B+樹的定義如下:
(1)結點的關鍵字個數=孩子個數-1
(2)B+樹包含2種結點:內部結點(索引結點)和葉子結點。根結點可以是內部結點,也可以是葉子結點,根結點關鍵字個數至少一個。
(3)B+樹的內部結點不保存數據,只用於索引,所有數據保存於葉子結點。
(4)m階B+樹內部結點最多有m-1個關鍵字(內部結點最多有m棵子樹)
(5)內部結點的關鍵字也按B樹那樣從小到大排序,內部結點中的一個關鍵字,左子樹中的所有關鍵字都小於它,右子樹的關鍵字大於等於它。
(6)每個葉子結點都存有相鄰葉子結點的指針,葉子結點本身關鍵字大小從小到大順序鏈接

1、B+樹的插入操作

(1)若爲空樹,創建一個葉子結點,記錄插入,這個葉子結點也是根結點,插入操作結束
(2)針對葉子類型結點:根據關鍵字找到葉子結點,然後插入記錄,插入後若當前結點關鍵字個數<=m-1,則插入結束。否則,將這個葉子結點分裂成爲左右兩個葉子結點,左葉子結點包括前m/2個關鍵字,右葉子結點包括剩下的,將第m/2+1個記錄上移到父結點(必須索引結點)。進位到父結點的關鍵字左孩子指針指向左結點,右孩子結點指針指向右結點,本身就指向父結點。
(3)針對索引類型結點:若當前結點的關鍵字個數<=m-1,則插入結束。否則,將這個索引類型結點分裂成兩個索引結點,左索引結點關鍵字包含前(m-1)/2個,右索引結點包含m-((m-1)/2)個,將第m/2個關鍵字上移到父結點中,類同第2步。

2、B+樹的刪除操作

如果葉子結點中沒有要刪除的關鍵字,則刪除失敗,否則執行下面步驟
(1)刪除葉子結點中對應的關鍵字。刪除後若結點關鍵字個數>=ceil(m/2)-1,刪除操作結束,否則執行下一步
(2)若兄弟結點的關鍵字個數>ceil(m/2)-1,向兄弟結點借一個關鍵字,同時用借的關鍵字替換(當前結點與父結點相同的關鍵字),刪除結束,否則執行下一步。
(3)當前結點與兄弟結點合併成新的葉子結點,並刪除父結點中的關鍵字(孩子指針變成一個指針,正好指向新的葉子結點),當前結點指向父結點(索引結點)。執行下一步。
(4)若索引結點的關鍵字個數>=ceil(m/2)-1,則刪除操作結束,否則執行下一步。
(5)若兄弟結點關鍵字個數>ceil(m/2)-1,父結點關鍵字下移,兄弟結點關鍵字上移,刪除結束,否則執行下一步。
(6)當前結點和兄弟結點及其父結點關鍵字下移合併成新的結點,將新結點指向父結點,重複第4步。

四、參考文獻

1、如果本文章滿足不了大家的要求,覺得還要深入理解,請參考一位大佬的文章《從B樹、B+樹、B*樹談到R樹》:https://blog.csdn.net/v_JULY_v/article/details/6530142
2、https://www.cnblogs.com/nullzx/p/8729425.html
3、《數據結構》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章