B+樹是B樹的擴展,允許有效的插入,刪除和搜索操作。
在B樹中,鍵和記錄都可以存儲在內部節點和葉子節點中。 然而,在B+樹中,記錄(數據)只能存儲在葉節點上,而內部節點只能存儲鍵值。
B+樹的葉節點以單鏈表的形式鏈接在一起,以使搜索查詢更有效。
B+樹用於存儲無法存儲在主記憶體中的大量數據。 由於主記憶體的大小總是有限的事實,B+樹的內部節點(訪問記錄的鍵)存儲在主記憶體中,而葉節點存儲在輔助記憶體中。
B+樹的內部節點通常稱為索引節點。 B+樹的排序3,如下圖所示。
1. B+樹的優點
- 可以在相同數量的磁片訪問中獲取記錄。
- 樹高度保持平衡,與B樹相比較少。
- 可以順序訪問存儲在B+樹中的數據,也可以直接訪問。
- 鍵用於索引。
- 更快的搜索查詢,因為數據僅存儲在葉節點上。
2. B樹與B+樹比較
編號 | B樹 | B+樹 |
---|---|---|
1 | 搜索鍵無法重複存儲。 | 可以存在冗餘搜索鍵。 |
2 | 數據可以存儲在葉節點以及內部節點中 | 數據只能存儲在葉節點上。 |
3 | 搜索某些數據是一個較慢的過程,因為可以在內部節點和葉節點上找到數據。 | 搜索速度相對較快,因為只能在葉節點上找到數據。 |
4 | 刪除內部節點非常複雜且耗時。 | 刪除永遠不會是一個複雜的過程,因為元素將始終從葉節點中刪除。 |
5 | 葉節點不能鏈接在一起。 | 葉節點鏈接在一起以使搜索操作更有效。 |
3. B+樹插入操作
第1步 :將新節點作為葉節點插入。
第2步 :如果葉子沒有所需空間,則拆分節點並將中間節點複製到下一個索引節點。
第3步 :如果索引節點沒有所需空間,則拆分節點並將中間元素複製到下一個索引節點。
示例:
將值195
插入到下圖所示的5階B+樹中。
在190
之後,將在右子樹120
中插入195
。將其插入所需位置。
該節點包含大於最大的元素數量,即4
,因此將其拆分並將中間節點放置到父節點。
現在,索引節點包含6
個子節點和5
個違反B+樹屬性的鍵,因此需要將其拆分,如下所示。
4. B+樹刪除操作
第1步:從葉子中刪除鍵和數據。
第2步:如果葉節點包含少於最小數量的元素,則將節點與其兄弟節點合併,並刪除它們之間的鍵。
第3步:如果索引節點包含少於最小數量的元素,則將節點與兄弟節點合併,並在它們之間向下移動鍵。
示例
從下圖所示的B+樹中刪除鍵為200
。
在195
之後的190
的右子樹中存在200
,刪除它。
使用195
,190
,154
和129
合併兩個節點。
現在,元素120
是節點中存在的違反B+樹屬性的單個元素。 因此,需要使用60
,78
,108
和120
來合併它。
現在,B+
樹的高度將減1
。