各位朋友,你們好,今日沒有更新文章,還請見諒~ 從今天開始將連續4日更新 B+樹,今日是關於 B+樹基本概念的一個介紹,希望今天的點滴內容未能讓你失望!
爲了實現動態多層索引,通常採用 B-樹 和 B+樹。但是,用於索引的 B-樹 存在缺陷,它的所有中間結點均存儲的是數據指針(指向包含鍵值的磁盤文件塊的指針),與該鍵值一起存儲在B-樹的結點中。這就會導致可以存儲在 B-樹中的結點數極大地減少了,從而增加 B-樹的層數,進而增加了記錄的搜索時間。
B+樹通過僅在樹的葉子結點中存儲數據指針而消除了上述缺陷。因此,B+樹的葉結點的結構與 B-樹的內部結點的結構完全不同。在這裏應該注意,由於數據指針僅存在於葉子結點中,因此葉子結點必須將所有鍵值及其對應的數據指針存儲到磁盤文件塊以便訪問。此外,葉子結點被鏈接磁盤的某個位置,以提供對記錄的有序訪問。因此,葉子結點形成第一級索引,而內部結點形成多層索引的其他層。葉子結點的某些關鍵字 key 也出現在內部結點中,充當控制搜索記錄的媒介。
與 B-樹不同,B+樹中的結點存在兩個階(order):對於階 “a” 和 “ b”,一個用於內部結點,另一個用於外部(或葉)結點。
階爲 a 的 B+樹內部結點的結構如下:
對於每一個形如:
的內部結點,其中 ,每一個 表示指向子樹根結點的指針, 表示關鍵字值對於每一個內部結點中的關鍵字值均滿足:$K_1<k_2 <="" ...="" k_{c-1}$="" .(內部結點的關鍵字由小到大有序排列)<="" p="">
對於一個位於 所指向的子樹中的結點 而言,滿足:
當 時,均有 .
當 時, .
當 時, .
每一個內部結點最多有
a
個指向子樹的指針,即c
最大取a
.根結點至少包含兩個指向子樹的結點指針,即對於根結點而言 ; 除了根之外的每個結點都包含最少 個指向子樹的指針。
如果任意一個內部結點包含
c
個指向孩子結點的指針且 ,則該結點包含 的關鍵字。
階爲 b 的 B+樹葉子結點的結構:
對於每一個形如:
的葉子結點,其中 , 是一個數據指針(指向磁盤上的值等於 的真實記錄的指針,或者包含記錄 的磁盤文件塊), 是一個關鍵字, 表示 B+樹中指向下一個葉子結點的指針。對任意一個葉子結點均有:$K_1<k_2 <="" ...="" k_{c-1}$="" ,$c\le="" b$="" .<="" p="">
每一個葉子結點至少包含 個值.
所有的葉子結點在同一層。
使用 指針可以遍歷所有的葉子結點,就和單鏈表一樣,從而實現對磁盤上記錄的有序訪問。
下圖爲一顆完整的 B+樹的結構示例:
B+樹的優點
同爲 層的 B-樹和 B+樹,B+樹可以存儲更多的結點元素,更加 ”矮胖“。這也是 B+樹最大的優勢所在,極大地改善了 B-樹的查找效率。對於同樣多的記錄,B+樹的高度會更矮,並且 指針的出現可以幫助 B+樹快速訪問磁盤記錄且效率非常高。總之,就是 B+樹比 B-樹更加好,B+樹的磁盤 I / O 會更少,相比於 B-樹的中序遍歷,B+樹只需要像遍歷單鏈表一樣掃描一遍葉子結點。
推薦閱讀:
作者:景禹,一個追求極致的共享主義者,想帶你一起擁有更美好的生活,化作你的一把傘。