高階搜尋樹之B樹
【說明】部落格內容選自課件內容
目錄
1.B-樹的定義
B-樹是一種滿足以下特性的m叉動態搜尋樹:
1)根結點至少有兩個子樹;
2)除根結點外,所有內部結點至少有⌈m/2⌉ 個子樹,最多有 m 棵子樹;
3)所有外部結點位於同一層上;
(1). 多叉特性
在 m 階的B-樹上,每個內部結點可能含有:
n 個關鍵字 Ki(1≤ i≤n) ⌈m/2⌉ -1≤n≤m-1
n+1 個指向子樹的指標 Ai(0≤i≤n);
(2). 查詢特性
l內部結點中的多個關鍵字均從小到大有序排列,即:K1< K2 < … < Kn;
l A
l Ai 所指子樹上所有關鍵字均大於Ki;
(3). 平衡特性
l樹中所有葉子(外部)結點均在樹的同一層次上;
l根結點或為葉子結點,或至少含有兩棵子樹;
l其餘所有非葉結點均至少含有ém/2ù棵子樹,至少⌈m/2⌉-1個關鍵字,至多含有 m 棵子樹;
2.查詢演算法:
從根結點出發,沿指標搜尋內部結點和在結點內進行順序(或折半)查詢 兩個過程交叉進行。
l若查詢成功,則返回指向被查關鍵字所在結點的指標和關鍵字在結點中的位置
l 若查詢不成功,則返回插入位置。
3.插入操作
在查詢不成功之後,需進行插入。顯然,關鍵字插入的位置 p 必定在
1)若 p 為空,則建新的根結點。
2)插入後,該結點的關鍵字個數n<m,不修改指標;
3)插入後,該結點的關鍵字個數 n=m,則需進行“結點分裂”。
令 s = ⌈m/2⌉,假設插入後的原結點中:(A0, K1, …, Ks-1,As-1 , Ks, As, Ks+1,… Km, Am )
則在原結點中保留:(A0,K1,。。。, Ks-1,As-1);
並建新結點(As,Ks+1,。。。 ,Km,Am);
然後將 Ks 插入p的雙親結點;
4.刪除操作
與插入相反,首先必須找到待刪除關鍵字所在結點,並刪除之。刪除分兩種情況:
1.所刪的
此時又有三種可能:
1)被刪關鍵字所在結點的關鍵字數目大於⌈m/2⌉-1,則只需刪除該關鍵字和相應指標;
2) 被刪關鍵字所在結點關鍵字數目等於⌈m/2⌉-1,且該結點相鄰的左(右)兄弟結點中的關鍵字大於⌈m/2⌉-1,則將其兄弟結點中的最小(最大)的關鍵字上移至雙親結點中,將雙親結點中小於(大於)且緊靠該上移關鍵字的關鍵字下移至被刪關鍵字所在結點中。
3) 被刪關鍵字所在結點和其相鄰的左(右)兄弟結點中的關鍵字數目均等於⌈m/2⌉-1。則在刪除關鍵字之後,將它所在結點中剩餘的關鍵字,加上雙親結點中的相應關鍵字,合併到左(右)兄弟結點中。如果因此使雙親結點中的關鍵字數目小於ém/2ù-1 ,則依次作相應處理。
2. 所刪結點不是最下層的內部結點;
設所刪關鍵字為Ki,則以指標Ai所指子樹中的最小關鍵字Y替代Ki ,然後刪除相應結點中的Y ;
5.查詢效能的分析
問題:含 N 個關鍵字的 m 階 B-樹可能達到的最大深度 H 為多少?
反問: 深度為H的m階 B-樹中,至少含有多少個結點?
先推導每一層所含最少結點數:
問題:如果B- 樹中含有 N 個關鍵字,則葉子結點的個數為?N+1
假設 m 階 B-樹的深度為 H+1,由於第 H+1 層為葉子結點,所以深度為 H+1的m階B-樹的葉子結點至少為2*⌈m/2⌉ ^H-1
因此: N+1≥2(⌈m/2⌉)H-1
H-1≤log⌈m/2⌉((N+1)/2)
H≤log⌈m/2⌉ ((N+1)/2)+1
結論:在含 N 個關鍵字的m階B-樹上進行一次查詢,需訪問的結點個數不超過log ⌈m/2⌉ ((N+1)/2)+1
疑惑:B-樹中的關鍵字到底指的是什麼?為什麼葉子節點的個數比關鍵字的個數多一?(之後學習會說明我的問題)