B樹很簡單,插入So easy

這是數據庫索引相關內容的第二篇
複製代碼

B樹

目錄:數據庫

  1. 什麼是B樹
  2. B樹的最小度數
  3. B樹的高度
  4. 什麼狀況下使用B樹
  5. B樹的插入
  6. B樹的刪除

關於1~4已經在上一節介紹過了B樹是個什麼玩意post

這裏重點介紹B樹的插入優化

5. B樹的插入spa

B樹要保持它的平衡及最小度數(t-1=<n<=2t-1, t<=child<=2t)特性,則須要在插入之後也是一個知足此特性的B樹。3d

那麼若是是你,如何保證在插入關鍵字後,新的B樹也能知足其特性呢?code

通常的思路是:cdn

  1. 根據B樹的排序特性,找到插入的節點
  2. 若是插入的節點是不滿的(n<2t-1),直接插入
  3. 若是插入的節點是滿的(n=2t-1),則不能直接插入,由於插入之後,就不符合B樹的特徵了,咱們要一直維護B樹的特徵, n<=2t-1,因此須要將節點進行拆分;
  4. 節點拆分後,若是隻是單純的拆分,一個child的裂變成兩個,顯然這麼簡單的裂變是不行的,由於child+1了,可是父節點的關鍵字個數n沒變,因此不符合child = n+1,子節點多裂變了一個,可是父節點沒變;
  5. 因此節點拆分後,須要將中間的數據,提到父節點中;
  6. 可是若是父節點是滿的,子節點提到父節點中又不知足B樹的特性了,父節點也要裂變,提一個到父父節點中;
  7. 若是父父節點是滿的,則又周而復始....

因此這將是個從上到下查找,又從下到上裂變的過程。blog

雖然這也能夠實現,可是有沒有優化的方法?排序

  1. 觀察一下這個過程,自己定位到插入節點時,已經有一次至上到下的過程了;
  2. 若是在至上而下的過程當中,每發現滿的節點,就進行拆分呢,是否是就能夠作到一次向下查找,就能知足後續的插入裂變。

是的,這就是B樹的插入過程!索引

  1. 至上而下查找
  2. 每發現滿節點,就進行裂變
  3. 找到插入位置,插入,若是須要裂變,就裂變,由於父節點不多是滿的,再剛剛遍歷到父節點的時候,已經提早騰出空間了!

就是這麼簡單!

讓咱們來看個例子:

有以下字母:F, S, Q, K, C, L, H, T, V

  1. 假設如今有個空樹
  2. 假設t = 2, 即最小度數爲2;
  3. 請畫出B樹的插入過程(只畫出關鍵過程)

解答:

  1. t = 2,意味着咱們節點的關鍵字個數在1~3之間,一單關鍵字個數超過3,則要裂變
  2. 在依次插入F,S,Q時,很簡單,由於根節點<=3
    在這裏插入圖片描述
  3. 當插入K時,自上而下的過程當中,發現父節點是滿的,必然要先拆分父節點
    在這裏插入圖片描述
  4. 此時父節點已經被成功拆分紅不滿的節點,而且子節點個數和排序也符合B樹要求
  5. 插入K,好比是從Q向左查找,插入到F以後。
    在這裏插入圖片描述
  6. 接着要插入C,直接插入的到F以前就行,由於在至頂向下的過程當中,沒有發現滿節點
    在這裏插入圖片描述
  7. 好了,下面到L了,當至頂向下的過程當中,L是在Q左側查找,發現了CFK節點是滿的,必然進行拆分; 將中間節點F提上來,父節點個數+1,子節點個數+1, 仍然符合B樹特徵
    在這裏插入圖片描述
  8. 拆分以後,插入L
    在這裏插入圖片描述
    後續的插入,就不用多講了,重複以上過程。

好了,寫的真累,刪除下次再寫吧


其餘相關章節
複製代碼

數據庫索引相關文章之一:《B樹,一點都不神祕》
數據庫索引相關文章之二:《B樹很簡單,插入so easy》
數據庫索引相關文章之三:《索引》
數據庫索引相關文章之四:《什麼索引算是好的索引》
數據庫索引相關文章之五:《如何發現及替換不合適的索引》
數據庫索引相關文章之六:《索引總結》

相關文章
相關標籤/搜索