B樹和B+樹


簡介

B樹和B+樹都是多路查找樹,為了解決數據量大,樹的高度大增(二叉樹)而產生的一種數據結構,23樹和234樹都是一種特殊的B樹,為了更好理解B樹,故先介紹23樹和234樹。

23樹

定義

2-3樹是一種多路查找樹,2和3的意思是該樹包含2結點和3結點兩種情況;

  • 2結點包含一個元素和兩個子樹
    • 左子樹包含結點的元素值小於該結點的元素值,右子樹包含結點的元素值大於該結點的元素值
    • 2結點要不有兩個子樹,要不就沒有子樹,不允許只有一個子樹。
  • 3結點包含一大一小兩個元素和三個子樹,元素按照左小右大順序排列;
    • 左子樹包含結點的元素值小於該結點較小的元素值,右子樹包含結點的元素值大於該結點較大的元素值,中間子樹包含的結點的元素值介於這兩個元素值之間。
    • 3結點要不有三個子樹,要不就沒有子樹,不允許有一個或者兩個子樹。
  • 2-3樹所有葉子結點都在同一層次
  • 圖例
    image

234樹

定義

2-3-4樹是一種多路查找樹,2和3和4的意思是該樹包含2結點、3結點和4結點三種情況;
2-3樹是一種多路查找樹,2和3的意思是該樹包含2結點和3結點兩種情況;

  • 2結點包含一個元素和兩個子樹
    • 左子樹包含結點的元素值小於該結點的元素值,右子樹包含結點的元素值大於該結點的元素值
    • 2結點要不有兩個子樹,要不就沒有子樹,不允許只有一個子樹。
  • 3結點包含一大一小兩個元素和三個子樹,元素按照左小右大順序排列;
    • 左子樹包含結點的元素值小於該結點較小的元素值,右子樹包含結點的元素值大於該結點較大的元素值,中間子樹包含的結點的元素值介於這兩個元素值之間。
    • 3結點要不有三個子樹,要不就沒有子樹,不允許有一個或者兩個子樹。
  • 4結點包含小中大三個元素和四個子樹。
    • 最左子樹包含的結點的元素值小於該結點最小的元素值,第二個子樹包含的結點的元素值大於最小的元素值小於中間元素值,第三個子樹包含的的結點的元素值大於中間元素值小於最大元素值,最右子樹包含的結點的元素值大於該結點最大的元素值。
    • 4結點要不有四個子樹,要不就沒有子樹,不允許有一個、兩個子樹或三個子樹。
  • 2-3-4樹所有葉子結點都在同一層次
  • 圖例

略,和2-3樹基本一致,區別就是多了一個4結點。

B樹

定義

B樹也是一種平衡的多路查找樹,2-3樹和2-3-4樹都是B樹的特例,我們把樹中結點最大的子樹數目稱為B樹的階。通常記為m。
一顆m階B樹或為空樹,或為滿足如下特性的m叉樹:

  • 樹中每個結點至多有m棵子樹。(即至多含有m-1個關鍵字,兩顆子樹指針夾着一個關鍵字);
  • 若根結點不是終端結點,則至少有兩顆子樹。(至少一個關鍵字);
  • 除根結點外的所有非葉子結點至少有[m/2]棵子樹。(即至少含有[m/2]-1個關鍵字);
  • 所有的葉子結點出現在同一個層次上,不帶信息。(就像是折半查找判斷樹中查找失敗的結點)。
  • 每一個結點中的關鍵字滿足從左到右依次增大的規則。

B樹的查找操作

B樹是多路查找樹,二叉排序樹是二路查找,B樹是多路查找,所以它是二叉排序樹的拓展。因此,B樹的查找操作和二叉排序樹的查找操作非常類似。
查找過程:
① 先讓待查找關鍵字key和結點中的關鍵字比較,如果等於某個關鍵字,則查找成功。
② 如果和所有的關鍵字都不相等,則看key處在哪個范圍內,然后去對應的指針所指向的子樹中查找。
例: 如果Key比第一個關鍵字K1還小,則去P0指針所指向的子樹中查找,如果比最后一個關鍵字KN還大,則去PN指針所指向的子樹中查找。
image

  • 查找案例
    如圖3階B樹, 查找11key值。
    image
    第一步:和跟節點10比較,不等且比10大,去右邊的子樹中查找;
    第二步: 和右子樹中關鍵字14比較,不等且比14小,故去左子樹中查找;
    第三步:和左子樹中關鍵字11比較,相等,獲取其data,返回。

B樹的插入操作

在二叉排序樹中,僅需查找到需插入的終端結點的位置。但是,在B樹中找到插入的位置后,並不能簡單地將其添加到終端結點位置,因為此時可能會導致整棵樹不再滿足B樹中定義中的要求。

  • 例如:

給定一組關鍵字{20,30,50,52,60,68,70},創建一顆3階B樹的過程。

  • 分析:非葉子結點至少有[m/2]-1個關鍵字,即1個關鍵字;至多含有m-1個關鍵字,即2個關鍵字

第一步:取兩個key作為根結點。
image
第二步:再取一個key50插入,如下圖,但是每個結點最多有兩個關鍵字,所有這個結點不能滿足B樹的要求,需要分裂。
image
分裂的方法:取這個關鍵字數組中的中間關鍵字([n/2])作為新的結點,然后其他關鍵字形成兩個結點作為新結點的左右子結點。
image
第三步:插入52,由於50結點只有一個關鍵字,所以可以插入52
image
第四步:接下來插入60,插入60之后該結點關鍵字數量又不符合要求,需要分裂
image
分裂的方法:取中間關鍵字([3/2]=2)52,由於根結點只含有30一個關鍵字,可以將52和30合並到一起。接下來需處理50和60這兩個結點,由於30<50<52,60>52,所以50和60各自單獨作為一個結點。
image
第五步:接下來插入68,由於60結點只有一個關鍵字。所以可以插入68
image
第六步: 接下來插入70,插入70之后該結點關鍵字數量又不符合要求,需要分裂
image

分裂的方法:取中間關鍵字([3/2]=2)68,由於根結點包含有30和52兩個關鍵字,將68關鍵字放在根結點后,又需要分裂,又取根結點52,作為新的根結點的關鍵字。
第一次分裂:
image
第二次分離(即最終結果):
image

B樹的刪除操作

B樹中的刪除操作與插入操作類似,但是稍微復雜些,要使得刪除后的結點中的關鍵字個數>=[m-2]-1,因此將涉及結點的"合並"問題。由於刪除的關鍵字位置不同,可以分為關鍵字在終端結點和不在終端結點上兩種情況。
1)如果刪除的關鍵字在終端結點上(最底層非葉子結點):

  • 結點內關鍵字數量大於[m/2]-1,這時刪除這個關鍵字不會破壞B樹的定義要求。所以直接刪除。
  • 結點內關鍵字數量等於[m/2]-1,並且其左右兄弟結點中存在關鍵字數量大於[m/2]-1的結點,則去兄弟結點中借關鍵字。
  • 結點內關鍵字數量等於[m/2]-1,並且其左右兄弟結點中不存在關鍵字數量大於[m/2]-1的結點,則需要進行結點合並。
例子:

image
第一種情況: 刪除9,直接刪除即可。
第二種情況: 刪除2,從左右兄借結點,並按照順序進行整理結點;

  • 整理第一步: 將兄弟結點中的最小結點7進行放在上一節點,因為刪除的是2,在7的左邊;
  • 整理第一步: 將父結點中5放入子結點。整理完成后如下圖;
    image
    第二種情況: 刪除16,左右兄弟結點都只有一個關鍵字,所以需要進行合並;
  • 合並第一步: 上一層的結點取關鍵字與下一層的結點合並。方式不唯一,可以把從把關鍵字14取下來和11合並成一個結點,也可以把20和22合並成一個結點。
    image
    2)如果刪除的關鍵字不在終端結點上(最底層非葉子結點):需要先轉換成再終端結點上,再按照在終端結點上的情況來分別考慮對應的方法。
    相鄰關鍵字: 對於不在終端結點上的關鍵字,它的相鄰關鍵字是其左子樹值最大的關鍵字或者右子樹中值最小的關鍵字。
  • 第一種情況:存在關鍵字數量大於[m/2]-1結點的左子樹或右子樹,在對應子樹上找到該關鍵字的相鄰關鍵字,然后將相鄰關鍵字替換待刪除的關鍵字。

例如: 下圖刪除10
image
第一步: 找出這個待刪除關鍵字的相鄰關鍵字,比如說下圖中10的相鄰關鍵字就是9或者11,其實就是這個大小序列中該關鍵字的直接前驅或者是直接后驅關鍵字。
第二步:將這個待刪除的關鍵字和某個相鄰關鍵字互換;互換后,按照關鍵字在終端結點上的情況進行刪除即可。
互換后:
image
刪除后:
image

  • 第二種情況:左右子樹的關鍵字數量均等於[m/2]-1,則將這兩個左右子樹結點合並,然后刪除待刪除關鍵字。如圖刪除14
    image
    合並后:
    image

刪除后:
image

B+樹

定義

B+樹是常用於數據庫和操作系統的文件系統中的一種用於查找的數據結構。

B+樹圖例

image

B+tree性質

①:n棵子tree的節點包含n個關鍵字,不用來保存數據而是保存數據的索引。
②:所有的葉子結點中包含了全部關鍵字的信息,及指向含這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。
③: 所有的非終端結點可以看成是索引部分,結點中僅含其子樹中的大(或小)關鍵字。
④:B+樹中,數據對象的插入和刪除僅在葉節點上進行。
⑤:B+樹有2個頭指針,一個是樹的根節點,一個是小關鍵碼的葉節點。

B+樹和B樹的區別

①:在B+樹中,具有n個關鍵字的結點只含有n棵子樹,即每個關鍵字對應一顆子樹;而在B樹中,具有n個關鍵字的結點含有(n+1)棵子樹。
②:在B+樹中,每個結點(非根內部結點)關鍵字個數n的范圍是[m/2]<=n<=m(根結點1<=n<=m),在B樹中,每個結點(非根內部結點)關鍵字個數n的范圍是[m/2]-1<=n<=m-1(根結點:1<=n<=m-1)。
③: 在B+樹中,葉結點包含信息,所有非葉結點僅起到索引的作用,非葉結點中的每個索引項只含有對應子樹的最大關鍵字和指向該子樹的指針,不含有該關鍵字對應的存儲地址。
④:在B+樹中,葉結點包含了全部關鍵字,即在非葉結點中出現的關鍵字也會出現在葉結點中;而在B樹中,葉結點包含的關鍵字和其他結點包含的關鍵字是不重復的。
⑤:在B+樹中,有一個指針指向關鍵字最小的葉子結點,所有葉子結點連接成一個單鏈表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM