1. 程式人生 > >高階搜尋樹之B樹

高階搜尋樹之B樹

【說明】部落格內容選自課件內容

目錄

1B-樹的定義

B-樹是一種滿足以下特性m叉動態搜尋樹

1)根結點至少有兩個子樹

2)除根結點外,所有內部結點至少m/2 個子樹,最多m 棵子樹;

3)所有外部結點位於同一層上;

(1). 叉特性

  m 階的B-樹上,每個內部結點可能含有:

n 關鍵字 Ki1inm/2 -1nm-1

n+1 指向子樹的指標 Ai0≤i≤n;

(2). 查詢特性

l內部結點中的多個關鍵字從小到大有序排列,即:K1< K2 < … < Kn;

l A

i-1 所指子樹上所有關鍵字均小於Ki;

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-1As-1 , Ks,  As, Ks+1,… Km, Am

則在原結點中保留:A0K1,。。。, Ks-1As-1);

並建新結點AsKs+1,。。。    ,KmAm);

然後Ks 插入p雙親結點;

4.刪除操作

與插入相反,首先必須找到待刪除關鍵字所在結點,並刪除之。刪除分兩種情況:

1.所刪的

結點下層的內部結點 ;

此時又有三種可能:

1被刪關鍵字所在結點的關鍵字數目大於m/2-1則只需刪除該關鍵字和相應指標;

2刪關鍵字所在結點關鍵字數目等於m/2-1且該結點相鄰的左(右)兄弟結點中的關鍵字大於m/2-1,將其兄弟結點中的最小(最大)的關鍵字上移至雙親結點中,將雙親結點中小於(大於)且緊靠該上移關鍵字的關鍵字下移至被刪關鍵字所在結點中

3)  被刪關鍵字所在結點和其相鄰()兄弟結點中的關鍵字數目均等於m/21則在刪除關鍵字之後,將它所在結點中剩餘的關鍵字,加上雙親結點中的相應關鍵字,合併到左(右)兄弟結點中如果因此使雙親結點中的關鍵字數目小於ém/2ù1 ,則依次作相應處理。

2. 所刪結點不是最下層的內部結點;

     設所刪關鍵字為Ki則以指標Ai所指子樹中的最小關鍵字Y替代Ki ,然後刪除相應結點中的Y

5.查詢效能的分析

問題:含 N 關鍵字m B-樹可能達到的最大深度 H 為多少?

反問: 深度為HmB-樹中,至少含有多少個結點

先推導每一層所含最少結點數:

問題:如果B- 樹中含有 N 個關鍵字,則葉子結點的個數為?N+1

假設 m B-樹的深度為 H+1,由於第 H+1 層為葉子結點,所以深度為 H+1mB-樹的葉子結點至少為2*⌈m/2 ^H-1

 因此: N+1≥2(m/2)H-1

             H-1≤logm/2((N+1)/2)

             H≤logm/2 ((N+1)/2)+1

結論:在含 N 個關鍵字的mB-樹上進行一次查詢,需訪問的結點個數不超過log m/2  ((N+1)/2)+1

疑惑:B-樹中的關鍵字到底指的是什麼?為什麼葉子節點的個數比關鍵字的個數多一?(之後學習會說明我的問題)