B樹,B+樹,B*樹學習筆記

B數據庫


B+數組

這兩種處理索引的數據結構的不一樣之處:數據結構


1.    B樹中同一鍵值不會出現屢次,而且它有可能出如今葉結點,也有可能出如今非葉結點中.而B+樹的鍵必定會出如今葉結點中,而且有可能在非葉結點中也有可能重複出現,以維持B+樹的平衡.
spa


2.由於B樹鍵位置不定,且在整個樹結構中只出現一次,雖然能夠節省存儲空間,但使得在插入、刪除操做複雜度明顯增長.B+樹相比來講是一種較好的折中.
操作系統


3.B樹的查詢效率與鍵在樹中的位置有關,最大時間複雜度與B+樹相同(在葉結點的時候),最小時間複雜度爲1(在根結點的時候).而B+樹的時候複雜度對某建成的樹是固定的.
.net

 

 爲何說B+-tree比B 樹更適合實際應用中操做系統的文件索引和數據庫索引?指針

1) B+-tree的磁盤讀寫代價更低orm

        B+-tree的內部結點並無指向關鍵字具體信息的指針。所以其內部結點相對B 樹更小。若是把全部同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入內存中的須要查找的關鍵字也就越多。相對來講IO讀寫次數也就下降了。blog

        舉個例子,假設磁盤中的一個盤塊容納16bytes,而一個關鍵字2bytes,一個關鍵字具體信息指針2bytes。一棵9階B-tree(一個結點最多8個關鍵字)的內部結點須要2個盤快。而B+ 樹內部結點只須要1個盤快。當須要把內部結點讀入內存中的時候,B 樹就比B+ 樹多一次盤塊查找時間(在磁盤中就是盤片旋轉的時間)。索引

2) B+-tree的查詢效率更加穩定

        因爲非終結點並非最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。因此任何關鍵字的查找必須走一條從根結點到葉子結點的路。全部關鍵字查詢的路徑長度相同,致使每個數據的查詢效率至關。

B*

        B*-tree是B+-tree的變體,在B+樹的基礎上(全部的葉子結點中包含了所有關鍵字的信息,及指向含有這些關鍵字記錄的指針),B*樹中非根和非葉子結點再增長指向兄弟的指針;B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3(代替B+樹的1/2)。

        B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據複製到新結點,最後在父結點中增長新結點的指針;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,因此它不須要指向兄弟的指針。

        B*樹的分裂:當一個結點滿時,若是它的下一個兄弟結點未滿,那麼將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(由於兄弟結點的關鍵字範圍改變了);若是兄弟也滿了,則在原結點與兄弟結點之間增長新結點,並各複製1/3的數據到新結點,最後在父結點增長新結點的指針。

        因此,B*樹分配新結點的機率比B+樹要低,空間使用率更高;


總結:

B樹:有序數組+平衡多叉樹;

B+樹:有序數組鏈表+平衡多叉樹;

B*樹:一棵豐滿的B+樹。


詳情看出處:

http://blog.csdn.net/v_JULY_v/article/details/6530142/

相關文章
相關標籤/搜索