演算法導論 B樹

2021-08-19 11:04:24 字數 1732 閱讀 5082

這是為磁碟儲存而專門設計的一類平衡搜尋樹。由於磁碟訪問相對訪存極慢,因此度量b樹的效能,考慮

a. 動態集合操作消耗的計算時間

b. 執行了多少次的磁碟訪問。

對每個b樹操作,磁碟訪問的次數隨著b樹的高度增加。

b-tree定義

第1. 每個節點x有:

a. x.n儲存節點x的關鍵字個數。

b. x.n個關鍵字不嚴格公升序存放

c. x.leaf是布林值,若x是葉節點,則為true;否則false。

第2. 每個內部節點x還包括x.n+1個指向孩子的指標x.c1, x.c2, …。葉節點c屬性沒有意義。

第3. 關鍵字x.key,對儲存在各子樹中的關鍵字範圍加以分割:如果ki為任意乙個儲存在以x.ci為根的子樹種的關鍵字,那麼:

第4. 每個葉節點具有相同的深度,即樹的高度為h。

第5. 每個節點所包含的關鍵字個數有上界和下界。最小度數t>=2表示這些界限。

a. 除了根結點以外的每個節點必須至少有t-1個關鍵字。因此,除了根結點以外的每個內部節點至少有t個孩子。對於根結點,如果樹非空,根結點至少有乙個關鍵字。

b. 每個節點至多包含2t-1個關鍵字。因此,內部節點至多2t個孩子。當乙個節點有2t-1個關鍵字,該節點是滿的。

對於b_tree_search, b_tree_create, b_treeinsert,做出合理約定:

b樹的根結點儲存在主存中。對根結點被改變,需要disk_write

任何被當作引數的節點被傳遞之前,都要對它們做一次disk_read

搜尋b樹(總的cpu時間是o(tlogt n))

b_tree_search(x, k)//指向某子樹根節點x的指標與目標搜尋關鍵字k

i = 1

while i <= x

.n && k > x

.keyi

i = i + 1

if i <= x

.n && k == x

.keyi

return (x, i) //搜尋成功,返回節點x與關鍵字下標

elseif x

.leaf

return nil //若x是葉節點,搜尋失敗

else

//這裡有兩種可能,i>x

.n&&k>x

.key(i-1)此處(i-1)是下標。或者 i<=x

.n&&k

.keyi

//若k>x

.key(i-1),則由於i==x

.n+1,下次遞迴呼叫時,x

.key將變更大

//若k

.keyi,下次遞迴呼叫時,x

.key不會變大,有可能變更小。

disk_read(x, ci)//遞迴搜尋

return b_tree_search(x

.ci, k)

創造一棵b樹(o(1)次磁碟操作和o(1)的cpu時間)

b_tree_create(t)

x = allocate_node()

x.leaf = true

x.n = 0

disk_write(x)

t.root = x

演算法導論 B樹

include include define t 3 typedef struct bnodetype bnode,pbnode typedef struct btree,pbtree typedef struct stype,pstype pbnode allocatenode void b tr...

《演算法導論》筆記 B樹

演算法 cc c 資料結構 b樹是平衡樹的一種,主要用於操作儲存在磁碟等二級儲存裝置上的大量資料。相比起記憶體 主存 來說,磁碟操作的速度非常慢 慢幾個數量級 所以涉及到儲存在磁碟的資料的時候,儘量減少磁碟的讀取和寫入操作對於提高操作速度是非常重要的。b樹就是針對這個特點進行設計以滿足相應要求的。b...

演算法導論B樹學習筆記

定義就不重複說明了 b樹與b 樹的不同是,b 樹中非葉子節點的節點也會出現在葉子節點中 b樹要求至少t 1,至多2t 1 b樹一 插入 1 關於高度的定理 h l ogtn 1 2h leqslant log t frac h logt 2n 1 2 操作 抽象出來就是插入到某個節點,滿了之後從中間...