1. 程式人生 > >資料結構2:B樹,B+樹,B*樹

資料結構2:B樹,B+樹,B*樹

1.B樹即B-Tree

(圖轉載)

B樹是一種多叉平衡查詢樹,紅黑樹是一種二叉平衡查詢樹,B樹的多叉結構使得對於元素數量非常多的情況,樹的深度不會像二叉樹那麼深,保證查詢效率。

B-Tree是為了磁碟或其他儲存裝置設計的一種多叉平衡查詢樹,相比紅黑樹在降低磁碟I/O方面做得更好,
許多資料庫都是用B-Tree B*Tree, B+Tree來儲存資訊。

性質:m階的B樹

①樹中每個節點最多含有m個孩子

②除根節點和葉子節點,其他每個節點至少含有[m/2](向上取整)個子節點

③根節點至少還有2個孩子

④葉子節點不包括任何關鍵字資訊。

⑤每個非終端節點包含n個關鍵字資訊

    1)安關鍵字升序進行排序

    2)節點的關鍵字的個數n滿足:[m/2-1]<=n<=m-1

樹中每個節點至少含有[m/2]個節點,最多含有m個節點

B樹的插入

①葉子節點空間足夠,即關鍵字個數小於m-1,直接插入

②若空間滿,需要進行分裂,中間關鍵字元素上移到父節點,左側右側分別分裂形成新的節點。

B樹的刪除

進行元素的查詢,若元素存在,則刪除。刪除元素後,判斷該元素是否有左右孩子節點。

    若有,上移孩子節點中的相近元素(左孩子中最右邊或者右孩子中最左邊),移動後情況

    若沒有,直接刪除,移動後情況

刪除元素,然後進行元素的移動,如果節點關鍵字資料不滿足條件(<[m/2]-1),則需要看齊相鄰的兄弟節點是否豐滿(>=[m/2]-1)

    若豐滿,向父節點借一個元素來滿足

    若其相鄰兄弟節點剛脫貧,即借了之後其節點數目<[m/2]-1,則該節點與其相連的某一兄弟節點進行合併成一個節點

2.B+Tree

B樹的一種變形,m階B樹和B+樹的區別:

①所有葉子節點包含全部的關鍵字資訊,以及指向這些關鍵字的指標,葉子節點中關鍵字進行有序連線。

②非葉節點相當於葉子節點的索引(稀疏索引),葉子節點是儲存資料的資料層。

(圖轉載)

B+樹比B-樹更加適合作業系統的檔案索引和資料索引

(B樹內部節點存放關鍵字和指標,B+樹內部節點只存放關鍵字索引,葉節點存放關鍵字和指標

①磁碟讀寫代價更低,B+樹的內部節點沒有指向關鍵字具體資訊的指標,內部節點相對於B樹更小。如果把所有同一內部節點的關鍵字(索引)放在同一塊磁碟中,盤塊所能容納的關鍵字數量也就越多,一次性讀入記憶體中的需要查詢的關鍵字也就越多,相對IO讀寫次數降低。

②B+樹的查詢效率更加穩定。

非葉節點是葉子節點中關鍵字的索引,所以任何關鍵字的查詢都必須走根節點到葉子節點的路,查詢路徑長度相同,使得每個資料查詢效率相當。

總結:B樹提高了I/O效能但是並沒有解決資料查詢效率低下,B+樹只要遍歷葉子節點就能實現整棵樹的遍歷,支援基於範圍的查詢,而B樹不支援(效率低)。

3.B*Tree

B*樹是B+樹的變體,在B+樹的非根和非葉子節點增加指向兄弟的指標。

(圖轉載)

B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的資料複製到新結點,最後在父結點中增加新結點的指標;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指標。

B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那麼將一部分資料移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(因為兄弟結點的關鍵字範圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,並各複製1/3的資料到新結點,最後在父結點增加新結點的指標。

總結:

B樹,多叉平衡搜尋樹,非葉節點儲存值指向關鍵字範圍的子節點;所有關鍵字在樹中出現一次,非葉子節點可以命中。

B+樹,在B樹的基礎上,為葉子節點增加索引,所有關鍵字都在葉子節點中出現,非葉節點作為葉子節點的索引;葉子節點命中

B*樹,在B+樹的基礎上,為非葉節點也增加連結串列指標。