日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B+树和B*树详解

發布時間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 B+树和B*树详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

B+樹和B*樹詳解

文章目錄

  • B+樹和B*樹詳解
    • 一、B+樹
      • 1.B+樹的定義
      • 2.性質
      • 3. B+樹的插入操作
      • 4.B+樹的刪除操作
    • 二、B*樹
      • 1.概念
      • 2.性質
      • 3.總結
        • 1.B-/B樹:
        • 2.B+樹:
        • 3.B*樹:

一、B+樹

1.B+樹的定義

2.性質

B+樹是B樹的變體,也是一種多路搜索樹,除了:

  • 1)B+樹包含2種類型的結點:內部結點(也稱索引結點)和葉子結點。根結點本身即可以是內部結點,也可以是葉子結點。根結點的關鍵字個數最少可以只有1個。
  • 2)B+樹與B樹最大的不同是內部結點不保存數據,只用于索引,所有數據(或者說記錄)都保存在葉子結點中。
  • 3) m階B+樹表示了內部結點最多有m-1個關鍵字(或者說內部結點最多有m個子樹),階數m同時限制了葉子結點最多存儲m-1個記錄。
  • 4)內部結點中的key都按照從小到大的順序排列,對于內部結點中的一個key,左樹中的所有key都小于它,右子樹中的key都大于等于它。葉子結點中的記錄也按照key的大小排列。
  • 5)每個葉子結點都存有相鄰葉子結點的指針,葉子結點本身依關鍵字的大小自小而大順序鏈接。

3. B+樹的插入操作

  • 1)若為空樹,創建一個葉子結點,然后將記錄插入其中,此時這個葉子結點也是根結點,插入操作結束。

  • 2)針對葉子類型結點:根據key值找到葉子結點,向這個葉子結點插入記錄。插入后,若當前結點key的個數小于等于m-1,則插入結束。

  • 否則將這個葉子結點分裂成左右兩個葉子結點,左葉子結點包含前m/2個記錄,右結點包含剩下的記錄,將第m/2+1個記錄的key進位到父結點中(父結點一定是索引類型結點),進位到父結點的key左孩子指針向左結點,右孩子指針向右結點。將當前結點的指針指向父結點,然后執行第3步。

  • 3)針對索引類型結點:若當前結點key的個數小于等于m-1,則插入結束

  • 否則,將這個索引類型結點分裂成兩個索引結點,左索引結點包含前(m-1)/2個key,右結點包含m-(m-1)/2個key,將第m/2個key進位到父結點中,進位到父結點的key左孩子指向左結點, 進位到父結點的key右孩子指向右結點。將當前結點的指針指向父結點,然后重復第3步。

  • 下面是一顆5階B樹的插入過程,5階B數的結點最少2個key,最多4個key。

  • a)空樹中插入5

  • b)依次插入8,10,15

  • c)插入16

  • 插入16后超過了關鍵字的個數限制,所以要進行分裂。在葉子結點分裂時,分裂出來的左結點2個記錄,右邊3個記錄,中間key成為索引結點中的key,分裂后當前結點指向了父結點(根結點)。結果如下圖所示。

    當然我們還有另一種分裂方式,給左結點3個記錄,右結點2個記錄,此時索引結點中的key就變為15。

  • d)插入17

  • e)插入18,插入后如下圖所示

  • 當前結點的關鍵字個數大于5,進行分裂。分裂成兩個結點,左結點2個記錄,右結點3個記錄,關鍵字16進位到父結點(索引類型)中,將當前結點的指針指向父結點。

    當前結點的關鍵字個數滿足條件,插入結束。

  • f)插入若干數據后

  • g)在上圖中插入7,結果如下圖所示

  • 當前結點的關鍵字個數超過4,需要分裂。左結點2個記錄,右結點3個記錄。分裂后關鍵字7進入到父結點中,將當前結點的指針指向父結點,結果如下圖所示。

  • 當前結點的關鍵字個數超過4,需要繼續分裂。左結點2個關鍵字,右結點2個關鍵字,關鍵字16進入到父結點中,將當前結點指向父結點,結果如下圖所示。

    當前結點的關鍵字個數滿足條件,插入結束。

4.B+樹的刪除操作

  • 如果葉子結點中沒有相應的key,則刪除失敗。否則執行下面的步驟
  • 1)刪除葉子結點中對應的key。刪除后若結點的key的個數大于等于Math.ceil(m-1)/2 – 1,刪除操作結束,否則執行第2步。
  • 2)若兄弟結點key有富余(大于Math.ceil(m-1)/2 – 1),向兄弟結點借一個記錄,同時用借到的key替換父結(指當前結點和兄弟結點共同的父結點)點中的key,刪除結束。否則執行第3步。
  • 3)若兄弟結點中沒有富余的key,則當前結點和兄弟結點合并成一個新的葉子結點,并刪除父結點中的key(父結點中的這個key兩邊的孩子指針就變成了一個指針,正好指向這個新的葉子結點),將當前結點指向父結點(必為索引結點),執行第4步(第4步以后的操作和B樹就完全一樣了,主要是為了更新索引結點)。
  • 4)若索引結點的key的個數大于等于Math.ceil(m-1)/2 – 1,則刪除操作結束。否則執行第5步
  • 5)若兄弟結點有富余,父結點key下移,兄弟結點key上移,刪除結束。否則執行第6步
  • 6)當前結點和兄弟結點及父結點下移key合并成一個新的結點。將當前結點指向父結點,重復第4步。

注意,通過B+樹的刪除操作后,索引結點中存在的key,不一定在葉子結點中存在對應的記錄。

  • 下面是一顆5階B樹的刪除過程,5階B數的結點最少2個key,最多4個key。
  • a)初始狀態
  • b)刪除22,刪除后結果如下圖

    刪除后葉子結點中key的個數大于等于2,刪除結束
  • c)刪除15,刪除后的結果如下圖所示
  • 刪除后當前結點只有一個key,不滿足條件,而兄弟結點有三個key,可以從兄弟結點借一個關鍵字為9的記錄,同時更新將父結點中的關鍵字由10也變為9,刪除結束。
  • d)刪除7,刪除后的結果如下圖所示
  • 當前結點關鍵字個數小于2,(左)兄弟結點中的也沒有富余的關鍵字(當前結點還有個右兄弟,不過選擇任意一個進行分析就可以了,這里我們選擇了左邊的),所以當前結點和兄弟結點合并,并刪除父結點中的key,當前結點指向父結點。

  • 此時當前結點的關鍵字個數小于2,兄弟結點的關鍵字也沒有富余,所以父結點中的關鍵字下移,和兩個孩子結點合并,結果如下圖所示。

二、B*樹

1.概念

是B+樹的變體,在B+樹的非根和非葉子結點再增加指向兄弟的指針;

2.性質

  • B*樹定義了非葉子結點關鍵字個數至少為(2/3)*M,即塊的最低使用率為2/3(代替B+樹的1/2);
  • B+樹的分裂:當一個結點滿時,分配一個新的結點,并將原結點中1/2的數據復制到新結點,最后在父結點中增加新結點的指針;
  • B+樹的分裂只影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;
  • B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那么將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最后修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字范圍改變了);
  • 如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,并各復制1/3的數據到新結點,最后在父結點增加新結點的指針;
  • 所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高;

3.總結

1.B-/B樹:

關鍵字的數量比孩子的數量少一,M階的B-/B樹最多有M個孩子,M- 1個關鍵字。分裂的方式把關鍵字已經滿的節點中的數據移動1/2到另一個節點

2.B+樹:

B+樹中關鍵字的數量和孩子的數量相等,在B-樹基礎上,為葉子結點增加鏈表指針,所有關鍵字都在葉子結點中出現,非葉子結點作為葉子結點的索引,遍歷葉子節點就可以得到所有的數據;B+樹總是到葉子結點才命中。M階的B+樹一個節點最少有M/ 2個關鍵字。分裂的方式把關鍵字已經滿的節點中的數據拷貝1/2到另一個新節點

3.B*樹:

在B+樹基礎上,為非葉子結點也增加鏈表指針,M階的B樹一個節點最少有M 2/3 個關鍵字,將結點空間的最低利用率從1/2提高到2/3分裂的方式是:如果它的下一個兄弟節點的關鍵字沒滿,就把關鍵字已經滿的節點中的數據移動到兄弟節點當中;如果兄弟節點也滿了,就在二者之間增加新節點,各復制1/3的數據到新節點當中

總結

以上是生活随笔為你收集整理的B+树和B*树详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。