這是為磁碟儲存而專門設計的一類平衡搜尋樹。由於磁碟訪問相對訪存極慢,因此度量b樹的效能,考慮
a. 動態集合操作消耗的計算時間b-tree定義b. 執行了多少次的磁碟訪問。
對每個b樹操作,磁碟訪問的次數隨著b樹的高度增加。
第1. 每個節點x有:第2. 每個內部節點x還包括x.n+1個指向孩子的指標x.c1, x.c2, …。葉節點c屬性沒有意義。a. x.n儲存節點x的關鍵字個數。
b. x.n個關鍵字不嚴格公升序存放
c. x.leaf是布林值,若x是葉節點,則為true;否則false。
第3. 關鍵字x.key,對儲存在各子樹中的關鍵字範圍加以分割:如果ki為任意乙個儲存在以x.ci為根的子樹種的關鍵字,那麼:
第4. 每個葉節點具有相同的深度,即樹的高度為h。
第5. 每個節點所包含的關鍵字個數有上界和下界。最小度數t>=2表示這些界限。
a. 除了根結點以外的每個節點必須至少有t-1個關鍵字。因此,除了根結點以外的每個內部節點至少有t個孩子。對於根結點,如果樹非空,根結點至少有乙個關鍵字。對於b_tree_search, b_tree_create, b_treeinsert,做出合理約定:b. 每個節點至多包含2t-1個關鍵字。因此,內部節點至多2t個孩子。當乙個節點有2t-1個關鍵字,該節點是滿的。
b樹的根結點儲存在主存中。對根結點被改變,需要disk_write搜尋b樹(總的cpu時間是o(tlogt n))任何被當作引數的節點被傳遞之前,都要對它們做一次disk_read
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 操作 抽象出來就是插入到某個節點,滿了之後從中間...