B+树操作方式
1 簡介
B+樹與B樹相似, 也存在不同. 可以理解為把所有元素都放在葉子節(jié)點, 索引B樹化的樹.
B+樹的一些性質:
1. B+樹的節(jié)點分類: 內部節(jié)點(索引節(jié)點), 葉子節(jié)點.?如果只有根節(jié)點有元素, 那么其可以是內部節(jié)點也可以是葉子節(jié)點.
2. B+樹與B樹最大的不同是內部節(jié)點不保存數(shù)據(jù), 只用與索引, 所有數(shù)據(jù)都放在葉子節(jié)點
3. 跟B樹相同的性質: m階B+樹每個節(jié)點(包括葉子節(jié)點和內部節(jié)點)最多有m-1個關鍵字
4. 節(jié)點內部的key同B樹相同, 也是從小到大排列, 對于內部節(jié)點的每個key, 其左樹中的所有key都小于該key, 右樹中的所有key都大于等于該key(注意是大于等于, 此處也是同B樹的不同)
5. 每個葉子節(jié)點都存有相鄰葉子節(jié)點的指針(雙向鏈表)
2 增刪操作
2.1 增加節(jié)點
跟B樹相同的是, 插入元素也是必須要插入葉子節(jié)點, 如果被插入的葉子節(jié)點的key數(shù)量達到階數(shù), 葉子節(jié)點進行分裂, 然后中間的節(jié)點(索引為m / 2的, 從0開始)復制一份進入父節(jié)點(注意此處是與B樹的不同, B樹是移到父節(jié)點, 而不是復制). 當索引節(jié)點滿了時, 就按照B樹的方式, 移動到父節(jié)點.
舉例說明:
1. 空的5階B+樹, 插入5:
2. 再插入8, 10, 15:
3. 插入16:
3.1 插入該節(jié)點
3.2 此時該節(jié)點達到了階樹5, 那么進行分裂, 索引(5 / 2 = 2)的節(jié)點(key為10)復制到父節(jié)點成為內部節(jié)點, 而子節(jié)點從該key進行分裂(該節(jié)點進入右邊, 注意新的兩個葉子節(jié)點要連起來):
4. 插入17:
5. 插入18
5.1 直接插入:
5.2 節(jié)點key數(shù)量達到了5, 裂開, 6復制進入父節(jié)點:
6. 插入一些數(shù)據(jù)后:
7. 插入7:
7.1 直接插入, 此時該節(jié)點key數(shù)量達到了階數(shù)5:
7.2 裂開, 7進入父節(jié)點
7.3 父節(jié)點分裂, 此時不需要復制:
2.2 刪除操作
首先就是在葉子節(jié)點中找到要刪除的節(jié)點, 如果沒有找到, 那么刪除失敗. 找到之后, 先把目標節(jié)點拿掉, 再看拿掉之后的節(jié)點key的數(shù)量, 如果大于ceil(m - 1) / 2 - 1(以后用最小key數(shù)量代替), 那么刪除動作結束. 如果小于的話, 就需要進行接下來的操作. 如果該節(jié)點的兄弟節(jié)點key數(shù)量大于最小key數(shù)量, 那么就向其借一個key, 注意更新其索引節(jié)點的key. 如果兄弟節(jié)點key不大于最小key數(shù)量, 那么就將二者合并, 形成一個新的葉子節(jié)點, 并把兩者的父節(jié)點中多余的key刪除, 同時按照B樹刪除節(jié)點的方式遞歸向上刪除.
舉例說明:
1. 初始狀態(tài):
2. 刪除22:
3. 刪除15
3.1 拿掉15:
3.2 發(fā)現(xiàn)此時節(jié)點key數(shù)量小于最小key數(shù)量?--- 2, 其兄弟節(jié)點有3個key, 大于2, 那么向其借用一個9, 并更新其父索引節(jié)點的key:
4. 刪除7
4.1 拿掉7:
4.2 其節(jié)點key小于2, 其兄弟節(jié)點key均為2, 沒有大于2, 所以就合并其與兄弟節(jié)點, 并刪除其父索引節(jié)點的key:
4.3 此時發(fā)現(xiàn)其父索引節(jié)點的key為1, 小于2, 那么就要按照B樹的方式, 其兄弟節(jié)點為2, 沒有大于2, 那么就將其父節(jié)點下移與該節(jié)點以及其兄弟節(jié)點合并:
總結
- 上一篇: c语言 静态变量 初始化,c – 静态变
- 下一篇: java .vm h2_java-H2服