B 樹 B 樹 學習總結

2021-09-22 09:55:31 字數 2581 閱讀 6637

一,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)

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)

x實際上代表根結點。第3行,掃瞄結點上所有的資料項看是否與k匹配,若不匹配且結點不是葉子結點,則需要在第10行進行一次磁碟讀取操作,將該結點中某資料項指向的孩子結點讀入記憶體,再進行比較。

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大 如果小於要...