1. 程式人生 > 資料庫 >資料結構-樹(三):多路搜尋樹B樹、B+樹

資料結構-樹(三):多路搜尋樹B樹、B+樹

多路搜尋樹

  1. 完全二叉樹高度:O(log2N),其中2為對數
  2. 完全M路搜尋樹的高度:O(logmN),其中M為對數,樹每層的節點數
  3. M路搜尋樹主要用於解決資料量大無法全部載入到記憶體的資料儲存。通過增加每層節點的個數和在每個節點存放更多的資料來在一層中存放更多的資料,從而降低樹的高度,在資料查詢時減少磁碟訪問次數。
  4. 所以每層的節點數和每個節點包含的關鍵字越多,則樹的高度越矮。但是在每個節點確定資料就越慢,但是B樹關注的是磁碟效能瓶頸,所以在單個節點搜尋資料的開銷可以忽略。

B樹

B樹是一種M路搜尋樹,B樹主要用於解決M路搜尋樹的不平衡導致樹的高度變高,跟二叉樹退化為連結串列導致效能問題一樣。B樹通過對每層的節點進行控制、調整,如節點分離,節點合併,一層滿時向上分裂父節點來增加新的層等操作來來保證該M路搜尋樹的平衡。具體規則如下:

  1. 根節點的兒子樹個數在2到M之間,其他非葉子節點的兒子樹個數在M/2和M之間。如果兒子樹個數因為分裂超過了M則此時需要向上遞迴分裂父節點,當找到一個不需要再分裂的父節點則停止分裂。該分裂過程直到根節點,如果需要分裂根節點,則會產生兩個根,故需要建立一個新的根來將這兩個根作為兒子節點,此時樹的高度會增加1。
  2. 每個非葉子節點的關鍵字的值從左到右依次變大,第i個關鍵字代表子樹i+1中的最小關鍵字;(其中對於根節點來說i在1到(2到M)之間,其他非葉子節點則是1到(M/2到M)之間);
  3. B樹的所有資料項都存放到葉子節點,非葉子節點不存放資料,非葉子節點只存放用於指示搜尋方向的關鍵字,即索引。這樣有利於將更多的非葉子節點載入到記憶體中,方便進行資料查詢;
  4. 所有葉子節點都在相同的深度並且每個葉子節點包含L/2到L項資料。

M和L的大小選擇

  1. M為B樹的階數或者說是路數
  2. L為每個葉子節點最多存放的資料項個數
  3. 在B樹中,每個節點都是一個磁碟區塊,所以需要根據磁碟區塊的大小來決定M和L。

磁碟區塊大小與M的計算

  1. 每個非葉子節點存放了關鍵字和指向兒子樹的指標,具體數量為:M階的B樹,每個非葉子節點存放了M-1個關鍵字和M個指向兒子樹的指標,故加入每個關鍵字的大小為8位元組(如Java的long型別就是8位元組),每個指標為4位元組,則M階B樹的每個非一葉子節點需要:8 * (M-1) + 4 * M = 12M - 8個位元組。
  2. 如果規定每個非葉子節點(磁碟區塊)佔用記憶體不超過8K,即8192,則M最大為683,即683*12-8=8192。

葉子節點資料項個數L

  1. 假如每個資料項大小也是256位元組,則由於磁碟區塊大小為8K,即8192個位元組,而每個葉子節點可以存放L/2到L個數據項,所以每個葉子節點最多存放:8192/256=32個數據項,即L的大小為32。
  2. 一棵5階的B樹的結構如下,即M和L等於5:其中每個非葉子節點包含最多M-1=5-1=4個關鍵字,包含M,即5個指向子樹指標。L等於5,則每個葉子節點最多存放5個數據項。

B+樹

B+樹結構跟B樹基本一致,唯一的區別是B+樹的葉子節點之間通過指標相連形成一個連結串列,故便於遍歷所有的葉子節點,即獲取所有或者搜尋關鍵字某一範圍的所有資料項。MySQL的InnoDB儲存引擎就是會用B+樹作為索引實現。

以上所述是小編給大家介紹的多路搜尋樹B樹、B+樹詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!