一,b-樹的定義及介紹
為什麼會有b-樹?
熟悉的樹的結構有二叉樹查詢樹或者平衡二叉樹……平衡二叉樹保證最壞情況下各個操作的時間複雜度為o(logn),但是為了保持平衡,在插入或刪除元素時,需要進行旋轉啊...一系列操作,因此實現起來比較複雜。而對於二叉查詢樹,基本操作在最壞情況下會出現o(n)的時間複雜度。總之,這些樹都是針對於記憶體中的資料操作,它們每個結點最多只有兩個孩子,當資料量大時(結點數目很多),就會導致樹很高。但由於基本操作(查詢元素、插入元素)都是在記憶體中實現,因此,樹高點也就沒有太大的關係。
試想,如果樹中的結點資料 是儲存在磁碟上的,每訪問乙個結點需要進行一次磁碟的讀取操作,那麼樹的高度就很重要了。因為,磁碟訪問的代價(速度)遠遠大於記憶體訪問的代價。對於7200轉的硬碟而言,訪問一次磁碟大約需要8.3ms,而對於4ghz的cpu而言,8.3ms不知可以執行多少次指令了。
因此,b樹乙個很重要的特徵就是:高度小。
那如何讓高度變小呢?讓每個結點可以擁有多個(遠遠大於2)孩子就可以了。但是,為了在插入、刪除中仍然保持b樹的性質(比如高度要低),還需要對b樹做一些其他方面的規定:(實際實現過程中可能不同)。
其中最重要的規定是:每個結點最多包含多少個關鍵字(項),最少需要包含多少個關鍵字。
這裡,給出乙個具體的m階 b樹定義(《資料結構與演算法分析》maw著)
①資料項 只儲存在樹葉上。(資料項就是實實在在的資料,而不是索引)
②非葉子結點最多可以 儲存 m-1個關鍵字以指示搜尋的方向(這裡的關鍵字是指索引)。
這裡的m-1個關鍵字是按從小到大的順序排序的。m-1個關鍵字,就有m個指標,指向進一步查詢的路徑。
③樹的根或者是一片樹葉,或者其兒子數在 2 到 m之間
④除根外,所有非樹葉節點的兒子數在 【m/2】 和 m 之間 【m/2】表示,m/2並向上取整
非葉子結點的兒子數最少為【m/2】,這就是為了保證每個結點足夠多的孩子,從而使樹的高度不至於太大。
⑤所有的樹葉都在相同的深度上並有【l/2】 和 l 個資料項
這裡表明,真正的資料只儲存在葉子結點上。非葉子結點只儲存索引。
在上面的具體規定中,m 和 l 是如何確定的呢?
m 和 l的確定與磁碟塊的大小相關。對於b樹而言,每個結點都盡量佔據乙個磁碟塊。
比如,假設有 1千萬資料項,每個關鍵字(索引)是32b,而每個資料項是256b,磁碟塊的大小是8192b,如何確定m 和 l 呢?
由於m階b樹中,每個結點最多有 m-1 個關鍵字,故關鍵字總大小為 32m-32,m-1個關鍵字最多有m個分支指標,假設每個分支指標是4b(位元組),故分支指標的大小是4*m個位元組。那麼對於乙個非葉子結點,它的大小是36*m-32 位元組,由於磁碟塊大小是8192,故m = 8192/(36*m-32) = 228
(注意:這裡的「關鍵字」其實類似於資料項,待插入的資料項 就是 通過比較關鍵字 來確定走哪條分支指標)
由上面的第5點可知,葉子結點只儲存資料項,每個資料項大小為256b,故 l=8192/256=32,這說明每個葉子結點可以儲存32個資料項。
m 與關鍵字以及指標的大小有關,而l與資料項的大小有關。總之,目標是:不管是葉結點還是非葉結點,都盡量保證乙個結點佔據乙個磁碟塊。
二,b樹的基本操作
1)查詢操作
查詢操作的偽**如下:《演算法導論》這裡的b樹中資料項可儲存在非葉子結點上。
1 b-tree-search(x,k)x實際上代表根結點。第3行,掃瞄結點上所有的資料項看是否與k匹配,若不匹配且結點不是葉子結點,則需要在第10行進行一次磁碟讀取操作,將該結點中某資料項指向的孩子結點讀入記憶體,再進行比較。2 i = 1
3while i<= m'
and k > key(i)
4 i++
5if i<=m'
and k=key(i)
6return (x,i)
7if leaf(x)
8return nil
9else
10 disk-read(child(x(i)))
11return b-tree-search(child(x(i)),k)
2)插入操作
插入操作可能會導致結點**。插入操作的具體實現細節可能與這裡描述的不一樣。
比如,向乙個已經滿了的葉結點插入乙個資料項時,該葉結點**成兩個結點,並將中間資料項上移到該結點的雙親結點。
3)刪除操作
刪除操作可能會導致結點合併。具體描述參考演算法導論。
比如,還可以這樣來處理:當某個節點不包含的資料項已經達到最小時,可以從鄰節點 「領養」 乙個資料項。當鄰節點也不足時,則將這兩個節點合併成乙個節點。
三,b樹與b+樹的主要區別
最主要的區別就是:b樹中非葉子結點可以儲存資料,而b+樹非葉子結點只儲存索引,所有的資料都放在葉子結點上儲存,且所有的葉子結點到根的距離是一樣的(葉子結點都在同一層)。
參考:b樹學習總結
B 樹 B 樹 學習總結
一,b 樹的定義及介紹 為什麼會有b 樹?熟悉的樹的結構有二叉樹查詢樹或者平衡二叉樹 平衡二叉樹保證最壞情況下各個操作的時間複雜度為o logn 但是為了保持平衡,在插入或刪除元素時,需要進行旋轉啊.一系列操作,因此實現起來比較複雜。而對於二叉查詢樹,基本操作在最壞情況下會出現o n 的時間複雜度。...
B樹 B 樹 B 樹 B 樹 總結
b樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進入左兒子 如果比結...
關於B樹 B 樹 B 樹 總結
二叉搜尋樹 特點 1 所有非葉子節點最多2個孩子,廢話,二叉樹 2 所有節點,每個節點儲存乙個值 3 父親節點的左孩子樹的節點比它小,右孩子節點的值比它大。查詢 其實,我一下子想到的是二分查詢。先查詢根,如果相等則找到,如果大於要查詢的值,則查詢右孩子樹 因為右孩子數儲存的值比root大 如果小於要...