Transcript ch08搜尋

第八章
資料的搜尋(Search)
8-1 搜尋的基本概念
8-2 循序搜尋法(Sequential Search)
8-3 二元搜尋法(Binary Search)
8-4 費氏搜尋法(Fibonacci Search)
8-5 內插搜尋法(Interpolation Search)
written by Wei-ShenLai
1
8-1 搜尋的基本概念
 在資料處理的過程中時, 是否能在最短時間內搜尋到所需要的資
料, 是一個相當值得關心的議題。而影響搜尋時間長短的主要因
素包括有演算法、資料儲存的方式及結構。底下我們就來看看搜尋
的基本分類及常見的搜尋方法。
written by Wei-ShenLai
2
8-1-1 搜尋的分類
 首先我們必須先知道搜尋的定義。從字面上可以很清楚的了解,
如果從資料檔案中, 尋找符合某特定條件的記錄, 這個動作就叫
搜尋。而用來搜尋的條件就稱為「鍵值」, 例如我們在電話簿中
找某人的電話, 那麼這個人的姓名就成為在電話簿中搜尋電話資
料的鍵值。
 和排序法一樣, 若依資料量大小來區分, 搜尋可分為:
內部搜尋:資料量較小的檔案,可以直接全部載入記憶體中進行搜尋。
外部搜尋:資料量大的檔案,無法一次載入記憶體處理,而需使用到
輔助記憶體來分次處理。
 值得一提的是, 如果資料在搜尋前經過排序, 將可大幅的減少搜
尋的時間。底下的章節我們將來認識幾種基本的搜尋技巧, 以及
它們的特性及優缺點。
written by Wei-ShenLai
3
8-1-2 搜尋的技巧
 除了上述的分類方式外, 還能以搜尋過程中被搜尋的表格或資料
是否異動,
區分為靜態搜尋(Static Search)及動態搜尋(Dynamic Search)。
其中靜態搜尋是指資料在搜尋過程中, 該搜尋資料不會有增加、刪除、
或更新等行為, 例如符號表搜尋就屬於一種靜態搜尋。
而動態搜尋則是指所搜尋的資料, 在搜尋過程中會經常性地增加、刪
除、或更新。
written by Wei-ShenLai
4
8-2 循序搜尋法(Sequential Search)
 循序搜尋又稱線性搜尋, 是一種最簡單的搜尋法。它的方法是將
資料一筆一筆的循序搜尋, 這很像在走訪陣列一般的從頭找到尾,
所以不管資料是否經過排序, 都是得從頭到尾走訪過一次。此法
的
優點是檔案在搜尋前不需作任何的處理與排序。O(nlogn)。
缺點為搜尋速度較慢。O(n)
written by Wei-ShenLai
5
循序搜尋法(Sequential Search)
Procedure Sequential(K,data)
 分析
時間複雜度: 如果資料沒有重覆, Begin
for i←1 to Size [
找到資料就可中止搜尋的在最差
if Ki = Data then
狀況是未找到資料,需作n 次比
return found
較,時間複雜度為O ( n ) 。
]
在平均狀況下,假設資料出現的
return not found
機率相等,則需( n + 1 ) /2 次比
End
較。
當資料量很大時, 不適合使用循
序搜尋法。但如果預估所搜尋的
資料在檔案前端則可以減少搜尋
的時間。
written by Wei-ShenLai
6
8-3 二元搜尋法(Binary Search)
 如果要搜尋的資料已經排序好(由小至
大), 則可使用二分法來進行搜尋。二
分法是將資料分割成兩等份, 再比較鍵
值與中間值的大小, 如果鍵值小於中間
值, 可確定要找的資料在前半段的元素,
如此分割數次直到找到為止。
11
1
2
3
4
5
6
7
8
9
2
3
5
8
9
11
12
16
18
11>9
1
2
3
4
5
6
7
8
9
2
3
5
8
9
11
12
16
18
11<12
1
2
3
4
5
6
7
8
9
2
3
5
8
9
11
12
16
18
11=11
written by Wei-ShenLai
Procedure Binary(K,Data)
Begin
Left←1;
Right←Size;
while Left <= Right do
Middle←(Left+Right)/2;
if Data < KMiddle [
Right←Middle-1;
]
esle if[
Left←Middle+1;
]
else[
return Middle;
]
End
return -1;
End
 分析
 時間複雜度: 因為每次的搜尋都會
比上一次少一半的範圍, 最多只需
要比較 log2n +1 或log2(n+1) ,時
間複雜度為O(logn)。
 二分法必須事先經過排序,且資料
量必須能直接在記憶體中執行。
 此法適合用於不需增刪的靜態資料。
7
【範例:8 . 3 . 1 】
 循序搜尋法與二元搜尋法的優缺點比較?
循序搜尋法
優點:這個搜尋方最簡單,資料無需事先排序 。
缺點:搜尋速度較慢,比較沒有效率,除非事先知道所搜尋的資料位置
在前端。
二元搜尋法
優點:和循序搜尋法相較起來,其搜尋速度較快。
缺點:必須事先將資料排序好,且儲存裝置必須能夠直接存取,例如磁
帶就不適合二元搜尋法。
written by Wei-ShenLai
8
【範例:8 . 3 . 2 】
 假設有n 筆資料記錄(data record),而我們要在這個資料記錄中找一個特定鍵
值的資料記錄。
1. 若用循序法(Sequential Search),則平均搜尋長度(Search Length)為多
少?
2. 若用二元搜尋法(Binary Search)則平均搜尋長度為多少?
3. 在何種情況下才能使用二元搜尋法找出一個特定的資料記錄?
4. 若找不到所要的資料記錄,則二元搜尋法中會做多少次比較
(comparison)?
 【解答】
平均搜尋長度(1+2+3+...n)/n=(n+1)/2
n

 log i  1
2
i 1
n
要使用二元搜尋法來找出特定的檔案,必須是已排序好的檔案且必須能夠
直接存取。
共需要 log2(n+1) 或 log2(n+1) -1 次比較,亦即其時間複雜度為O(log2n)。
written by Wei-ShenLai
9
8-4 費氏搜尋法(Fibonacci Search)
 費氏搜尋法又稱費伯那搜尋法,此法和二分法一樣都是以切割範圍
來進行搜尋,不同的是費氏搜尋法不以對半切割而是以費氏級數的
方式切割。
費氏級數F ( n ) 的定義如下:
F0=0 ,F1=1
Fi=Fi-1+Fi-2 , i ≧ 2
費氏級數:0,1,1,2,3,5,8,13,21,34,55,89,...就是除了第0 及第1 個元素
外,每個值都是前兩個值的加總。
費氏搜尋法的好處是只用到加減運算而不需用到乘法及除法,這以電
腦運算的過程來看效率會高於前兩種搜尋法。
written by Wei-ShenLai
10
費氏搜尋樹
 費氏搜尋樹是以費氏級數的特性所建立
的二元樹,其建立的原則如下:
 費氏樹的左右子樹均亦為費氏樹。
 當資料個數n 決定,若想決定費氏
樹的階層k 值為何,我們必須找到
一個最小的k 值,使得費氏級數的
Fib(k+1)≧n+1。
 費氏樹的樹根一定為一費氏數, 且
子節點與父節點的差值絕對值為費
氏數。
 當k ≧ 2 時,
 費氏樹的樹根為Fib(k)
 左子樹為(k-1)階費氏樹(其樹根為
Fib(k-1))
 右子樹為(k-2)階費氏樹(其樹根為
Fib(k)+Fib(k-2))。
K階費式樹
Fib(k)
-Fib(k-2)
+Fib(k-2)
Fib(k)
+Fib(k-2)
Fib(k-1)
-Fib(k-3)
+Fib(k-3)
-Fib(k-4)
+Fib(k-4)
 若n+1 值不為費氏數的值,則可以
找出存在一個m 使用
 Fib(k+1)-m=n+1
 m=Fib(k+1)-(n+1),再依費氏樹的
建立原則完成費氏樹的建立, 最後
費氏樹的建立, 最後費氏樹的節點
再減去差值m 即可,並把小於1 的
節點去掉即可。
written by Wei-ShenLai
K-2階費式樹
K-1階費式樹
11
【範例:8 . 4 . 1 】
 求n=33 的費氏樹。
 【解答】
 Fib(8+1)=33+1
 k=8
 Fib(8)=21為樹根
 Fib(7)=13為左子樹樹根
 Fib(8)+Fib(6)=21+8=29為右子樹樹根。
21
-8
+8
13
29
-5
+5
-3
8
18
-3
+3
5
-2
-2
11
+2
3
-1
7
10
26
+2
16
+1
-1
12
15
17
32
-2
20
+1
+3
+2
24
-1
-1
19
23
-1
+1
-1
-1
-1
-1
2
4
6
9
14
22
-1
28
+1
25
-1
27
+1
31
-1
30
33
+1
24
-1
1
written by Wei-ShenLai
12
【範例:8 . 4 . 2 】
13
 求n=18 之費氏樹。
 【解答】
m=Fib(7+1)-(18+1)=21-19=2
k=8
Fib(7)=13-2=11為樹根
Fib(6)=8-2=6為左子樹樹根
Fib(7)+Fib(5)-2=13+5-2=16為
右子樹樹根。
-5
+5
8
18
-3
+3
5
-2
-2
11
+2
3
-1
7
16
+1
10
+2
20
-1
12
+1
15
-1
+1
-1
-1
-1
2
4
6
9
14
-1
17
19
-1
1
11
-5
+5
6
16
-3
+3
3
-2
-2
9
+2
1
-1
5
8
+2
14
+1
-1
10
13
-1
+1
-1
-1
-1
0
2
4
7
12
18
+1
15
-1
17
-1
written by Wei-ShenLai
1
13
費氏搜尋法
 費氏搜尋法是以費氏樹來找尋資料,如果資料的個數為n ,而且n
比某一費氏數小,且滿足如下的運算式:
Fib(k+1)≧ n+1
此時Fib(k)就是這棵費氏樹的樹根,而Fib(k-2)則是與左右子樹開始
的差值,若我們要尋找的鍵值為key ,首先比較陣列索引Fib(k)和鍵
值key ,此時可以有下列三種比較情況:
當key 值比較小,表示所找的鍵值key 落在1 到Fib(k)-1 之間,故繼
續尋找1 到Fib(k)-1 之間的資料。
如果鍵值與陣列索引Fib(k)的值相等,表示成功搜尋到所要的資料。
當key 值比較大,表示所找的鍵值key 落在Fib(k)+1 到Fib(k+1)-1
之間,故繼續尋找Fib(k)+1 到Fib(k+1)-1 之間的資料。
 分析
平均而言, 費氏搜尋法的比較次數會少於二元搜尋法, 但在最壞的
情況下則二元搜尋法較快。其平均時間複雜度為O (log2N ) 。
費氏搜尋演算法較為複雜, 需額外產生費氏樹。
written by Wei-ShenLai
14
費氏搜尋法
 演算法:
Procedure FibonacciSearch(K,Data)
Begin
//Fib(k+1)-m=n+1
i←Fk-1;p←Fk-2;q ←Fk-3
if Data > Ki
i ←i+m;
while i≠0 [
case [
End
]
]
:Data < Ki://往左子樹調整
if q=0[
i ← 0;
]
else[
i ←i-q;
t ←p;
p ←q; //Fibk-3
q ←t-q; //Fibk-4
]
:Data=Ki:
return i;
:Data>Ki://往右子樹調整
if q=0
i ← 0;
else[
i ←i+q;
p ←p-q; //Fibk-4
q ←q-p; //Fibk-5
]
written by Wei-ShenLai
i
q
i=i-q
Fib(k-1)
-Fib(k-3)
+Fib(k-3)
p
i=i+q
Fib(k-1)
+Fib(k-3)
Fib(k-2)
q
q
-Fib(k-4)
p
+Fib(k-4)
-Fib(k-5)
+Fib(k-5)
p
Fib(k-3)
Fib(k-4)
-Fib(k-5)
15
8-5 內插搜尋法(Interpolation Search)
 內插搜尋法又叫做插補搜尋法, 是二元搜尋法的改良版。它是依
照資料位置的分佈, 利用公式預測資料的所在位置, 再以二分法
的方式漸漸逼近。使用內插法是假設資料平均分佈在陣列中, 而
每一筆資料的差距是相當接近或有一定的距離比例。其內插法的公
式為:
Mid=low + (( key - data[low] ) / ( data[high] - data[low] ))* ( high
- low )
 其中key 是要尋找的鍵, data[high]、data[low]是剩餘待尋找記
錄中的最大值及最小值,對資料筆數為n ,其插補搜尋法的步驟如
下:
1.將記錄由小到大的順序給予1,2,3...n 的編號
2.令low=1 , high=n
3.當low<high 時,重複執行步驟4及步驟5
4.令Mid=low + (( key - data[low] ) / ( data[high] data[low] ))*( high - low )
5.若key<keyMid 且high ≠ Mid-1 則令high=Mid-1
6.若key = keyMid 表示成功搜尋到鍵值的位置
7.若key>keyMid 且low ≠ Mid+1 則令low=Mid+1
written by Wei-ShenLai
16
內插搜尋法
 演算法:
Procedure InterpolationSearch(K,Data)
Begin
Left←1;Right←Size;
while Left <= Right do[
Middle←(Data-KLeft)/(KRight-KLeft)*(Right-Left)+Left;
if Middle < Left or Middle > Right then retirn -1;
case [
:Data < KMiddle:Right←Middle-1;
:Data = KMiddle:return Middle;
:Data > KMiddle:Left←Middle+1;
]
]
return -1;
End
 分析
一般而言,內插搜尋法優於循序搜尋法,而如果資料的分佈愈平均,
則搜尋速度愈快,甚至可能第一次就找到資料。此法的時間複雜度取
決於資料分佈的情況而定,平均而言優於O(log n)。
使用內插搜尋法資料需先經過排序。
written by Wei-ShenLai
17
【練習:內插搜尋法】
1
2
3
4
5
6
7
8
9
11 10
11
12
13
14
15
16
17
18
(11-10)/(18-10)*(9-1)+1=2
11=11
1
2
3
4
5
6
7
8
9
15 10
11
12
13
14
15
16
17
18
(15-10)/(18-10)*(9-1)+1=6
15=15
1
2
3
4
5
6
7
8
9
29 10
13
14
15
21
23
29
31
55
(29-10)/(55-10)*(9-1)+1=4
29>15
1
2
3
4
5
6
7
8
9
10
13
14
15
21
23
29
31
55
(29-21)/(55-21)*(9-5)+5=5
29>21
1
2
3
4
5
6
7
8
9
10
13
14
15
21
23
29
31
55
(29-23)/(55-23)*(9-6)+6=6
29>23
1
2
3
4
5
6
7
8
9
10
13
14
15
21
23
29
31
55
(29-29)/(55-29)*(9-7)+7=7
29=23
1
2
3
4
5
6
7
8
9
16 10
13
14
15
21
23
29
31
55
(16-10)/(55-10)*(9-1)+1=2
16>13
1
2
3
4
5
6
7
8
9
10
13
14
15
21
23
29
31
55
(16-14)/(55-14)*(9-3)+3=3
16>14
1
2
3
4
5
6
7
8
9
10
13
14
15
21
23
29
31
55
(16-15)/(55-15)*(9-4)+4=4
16>15
written by Wei-ShenLai
1
2
3
4
5
6
7
8
9
10
13
14
15
21
23
29
31
55
(16-21)/(55-21)*(9-5)+5=4
18
補充資料
AVL樹
引用自碁峰資料結構使用C
written by Wei-ShenLai
19
【補充:AVL-Tree】
 高度平衡二元樹(height balanced binary tree)在1962年由AdelsonVelskii和Landis所提出,因此又稱AVL-Tree。
 定義:
一棵空樹是AVL Tree。
若T不為空的二元樹,TL和TR分別為其左、右子樹,必須符合下列條件:
1.TL和TR亦是AVL Tree。
2.|Htl-Htr|≦1。Htl和Htr分別為TL與TR的高度。
 名詞定義:
平衡因子(balanced factor):BF(P):節點P的平衡因子,BF(P)= HtlHtr。
8
Q
4,5,6,7,8
7
BF=-2
BF=1
M
6
S
BF=1
BF=0
P
R
5
BF=0
4
written by Wei-ShenLai
N
20
新節點N加入AVL Tree
 1.以二元搜尋樹的加入方式加入新節點。
 2.調整二元樹以符合AVL Tree的規定。(LL、LR、RL、RR四型)
假設距離N最近且BF為2或-2的節點為P。
LL:N加入P節點左子樹的左子樹。
LR:N加入P節點左子樹的右子樹。
RL:N加入P節點右子樹的左子樹。
RR:N加入P節點右子樹的右子樹。
written by Wei-ShenLai
21
新增節點:LL型旋轉
P
P
Q
1
2
Q
0
Q
0
PR
P
1
PR
h
QL
QR
h
h
QL
h
QL
QR
h+1
0
h+1
N
h
QR
PR
h
h
N
加入30
2
50
1
40
40
1
50
1
30
40
加入20
1
40
0
30
written by Wei-ShenLai
60
50
30
2
50
45
1
1
30
50
40
40
60
45
30
20
50
45
60
20
22
新增:LR型旋轉
P
P
C
1
2
Q
Q
0
PR
Q
-1
PR
h
QL
QR
h
h
QL
b
40
2
50
-1 40
1
50
1
40
h+1
CR
45
written by Wei-ShenLai
h
CL
CR
h-1 or h
h-1 or h
加入42
N
PR
h-1 or h h
N
2
50
40
60
1
50
30
0
-1/0
N
45
1
1/0
QL
h
N
P
h
C
h-1 or h CL
加入45
0
45
30
50
40
1
42
50
60
45
40
30
60
45
42
23
新增:RL型旋轉
P
P
-1
Q
-2
0
Q
PL
Q
0
PL
h
P
1
0
QR
h
QL
QR
h
h
h
QL
QR
h+1
PL
h
QL
h
h+1
N
50
2
50
56
N
1
加入52
加入56
60
60
1 50
1
60
1
50
60
40
56
56
written by Wei-ShenLai
50
-2
40
56
60
70
56
1
1
70
50
40
60
52
70
0
52
24
新增:RR型旋轉
P
P
-1
C
-2
0
Q
PL
Q
0
PL
h
P
-1
1/0
h
QL
QR
h
h
QL
b
h
PL
h+1
N
加入70
50
60
-2
60
60
-1 50
70
written by Wei-ShenLai
1
0
-1/0
C
CL
h
h-1 or h CL
50
Q
CR
h-1 or h h-1 or h
h-1 or h N
50
1
QL
h
N
N
1
70
CR
50
40
加入80
60
55
-2
40
70
60
60
55
-1
70
50
-1
40
70
55
60
80
25
刪除AVL Tree中的節點
 1.調整二元樹以符合AVL Tree的規定。(R0、R1、R-1、L0、L1、
L-1六型)
假設距離N最近且BF為2或-2的節點為P。
LL:N加入P節點左子樹的左子樹。
LR:N加入P節點左子樹的右子樹。
RL:N加入P節點右子樹的左子樹。
RR:N加入P節點右子樹的右子樹。
written by Wei-ShenLai
26
刪除:R0旋轉
P
P
Q
1
2
Q
-1
Q
0
P
PR
0
h
QL
QR
h
h
QL
N
PR
QL
h-1
h
1
QR
h
QR
h
PR
h
2
50
h-1
-1
50
40
0
40
60
1
40
2
42
45
2
2
38
written by Wei-ShenLai
43
55
42
0
2
38
60
42
1
2
50
45
2
38
45
60
2
1
43
43
27
刪除:R1旋轉(單旋轉)
P
P
1
Q
2
Q
0
Q
1
PR
P
1
h
QL
QR
h
h-1
N
QL
QR
h
h-1
PR
QL
h-1
h
0
2
QR
PR
h-1
h-1
0
50
50
40
1
40
70
0
40
2
32
35
45
2
1
written by Wei-ShenLai
55
32
35
45
2
1
70
35
50
1
2
2
32
45
70
1
1
28
刪除:R-1旋轉(雙旋轉)
P
P
C
1
2
Q
0
Q
-1
PR
QL
N
h-1
h-1
b
h-1
CR
P
PR
C
b
CL
-1
h
C
QL
Q
CL
CR
h-1
or
h-2
h-1
or
h-2
50
QL
CL
CR
PR
h-1
h-1 h-1
or or
h-2 h-2
h-1
2
50
40
-1
30
60
30
60
2
20
40
55
1
written by Wei-ShenLai
43
50
1
20
40
20
1
35
30
1
35
43
35
43
60
1
29
刪除:L0旋轉
P
P
-1
Q
-2
1
Q
PL
Q
0
PL
h
P
0
-1
QR
h-1
h
QL
QR
QL
QR
h
h
h
h
N
PL
QL
h-1
h
-2
50
1
50
60
0
40
60
40
2
-1
60
50
62
1
45
2
55
62
55
62
2
2
2
2
58
written by Wei-ShenLai
64
58
40
55
1
2
64
64
58
30
刪除:L-1旋轉(單旋轉)
P
P
-1
Q
-2
0
Q
PL
Q
-1
PL
h
P
-1
0
QR
h-1
N
h
QL
QR
QL
QR
h-1
h
h-1
h
PL
QL
h-1
h-1
-2
50
0
50
60
-1
40
60
40
2
0
60
1
45
55
65
55
65
1
2
1
2
written by Wei-ShenLai
68
40
68
50
65
2
2
55
68
1
1
31
刪除:L1旋轉(單旋轉)
P
P
-1
C
-2
0
Q
PL
Q
1
h
PL
b
C
QR
N
b
h-1
CL
CR
CL
CR
h-1
or
h-2
h-1
or
h-2
50
60
40
2
QR
PL
CL
CR
QR
h-1
h-1
h-1 h-1
or or
h-2 h-2
h-1
2
50
40
Q
1
h-1
C
P
0
55
60
-1
50
60
0
1
45
55
65
55
1
54
written by Wei-ShenLai
58
54
58
65
40
1
1
54
58
65
1
32
補充資料
2-3樹
引用自碁峰資料結構使用C
written by Wei-ShenLai
33
【補充: 2-3 Tree】引用自碁峰資料結構使用C
 何謂2-3 Tree?
空樹
不為空樹必須符合下列條件:
2-3 Tree中的節點可以存放一筆或兩筆資料。
若節點中存放了一筆資料Ldata,其必須存在兩的子節點(左、中子節點)
 左子節點小於Ldata
 中子節點大於Ldata。
樹葉節點必須在同一階度
L
小於L
written by Wei-ShenLai
大於L
且
小於R
R
大於R
34
【新增:2-3 Tree】
 加入節點的調整規則:
1.該節點僅有一筆資料,直接加入。
2.該節點目前有兩筆資料,分割節點:
L
L
L
R
R
L
L
written by Wei-ShenLai
R
L
R
L
R
35
【練習:新增:2-3 Tree】
加入60
45
30
10
20
70
40
50
written by Wei-ShenLai
60
80
85
36
【練習:新增:2-3 Tree】
加入90
45
30
10
20
70
40
50
60
80
85
90
45
30
10
20
70
40
50
written by Wei-ShenLai
85
60
80
90
37
【練習:新增:2-3 Tree】
加入55
45
30
10
20
70
85
40
50
55
60
80
90
45
30
10
20
55
70
40
50
60
45
30
10
written by Wei-ShenLai
20
85
40
80
90
70
55
50
85
60
80
90
38
【練習:新增:2-3 Tree】
加入15
45
30
10
15
20
70
55
40
50
60
45
15
10
30
20
written by Wei-ShenLai
20
85
50
30
60
80
50
90
70
55
40
90
70
45
10
80
55
40
15
85
85
60
80
90
39
【練習:新增:2-3 Tree】
加入25
45
15
10
30
20
70
55
40
50
60
45
10
written by Wei-ShenLai
15
30
20
25
85
80
70
55
40
50
90
85
60
80
90
40
【練習:新增:2-3 Tree】
加入17
45
15
10
17
30
20
70
55
25
40
50
60
45
15
10
20
17
30
25
55
40
60
written by Wei-ShenLai
80
30
25
50
90
70
55
15
90
85
50
20
17
80
70
45
10
85
85
60
80
90
40
41
【刪除2-3 Tree樹葉節點】
 如果節點會被刪除,尋求存在兩個
鍵值的左或右兄弟節點P。
80
70
75
90
85
80
70
75
80
95
75
85
95
70
96
70
90
85
70
96
85
80
95
80
95
96
85
96
80
96
70
90
85
96
90
90
80
70
90
75
80
written by Wei-ShenLai
70
90
80
 如果節點會被刪除,左或右兄弟節
點均不存在兩的鍵值。
96
95
90
96
85
95
80
96
70
42
【刪除2-3 Tree非樹葉節點】
 如果節點會被刪除,右子樹最小值或左子樹的最大值取代。
 被選取的節點執行樹葉節點刪除處理方法。
60
60
35
15
80
50
70
90
85
20
95
96
17
18
30
70
25
35
70
90
50
written by Wei-ShenLai
75
35
35
15
65
80
85
20
95
96
17
18
70
25
30
65
75
43
補充資料
m-way樹
引用自碁峰資料結構使用C
written by Wei-ShenLai
44
【補充: m-way Tree】
 何謂m-way Tree?
空樹
若不為空樹,必須符合下列條件:
節點型態為n,A0,(K1,A1) ,(K2,A2).. ,(Kn,An),Ai為子樹,Ki為鍵值。允許Ai為
空樹。且K1...Kn由小至大排序。
written by Wei-ShenLai
45
新增節點
 當節點鍵值個數不足m-1時,直接加入。
 當節點鍵值個數m-1時,建立子節點以存放資料。
加入5
加入18
5
5
7
加入7
6
5
18
12
18
7
加入14
加入12
5
12
7
5
12
6
7
加入6
5
6
written by Wei-ShenLai
7
14
12
46
刪除資料
 樹葉節點直接刪除。
 非樹葉節點由右子樹選最小值或左子數選最大值取代之。
刪除8
5
4
7
5
6
8
12
4
7
6
10
12
10
刪除7
5
4
written by Wei-ShenLai
6
7
5
10
4
10
6
47
補充資料
B樹
引用自碁峰資料結構使用C
written by Wei-ShenLai
48
B樹定義
 何謂B樹?
為m-way樹
且滿足下列條件:
1.樹根節點至少有一鍵值。
2.所有樹葉節點皆在同一階層。
 加入資料的方法:假設資料加入節點P
1.P節點少於m-1個鍵值,則直接加入。
2.P節點的鍵值等於m-1個,則將節點一分為二,將中間鍵值移往上
一層。(2-3樹)
written by Wei-ShenLai
49
新增B樹資料
加入98
5
10
50
20
40
25
30
60
45
48
54
53
62
80
70
76
72
67
85
88
85
88
90
95
98
95
98
50
5
10
20
40
25
30
written by Wei-ShenLai
60
45
48
53
54
62
67
90
80
70
72
76
50
新增B樹資料
加入99
5
10
50
20
40
25
30
60
45
48
53
54
62
70
67
80
72
90
76
85
88
91
93
95
98
99
50
5
5
10
10
20
40
25
30
20
40
25
30
written by Wei-ShenLai
60
45
45
48
48
53
53
54
54
62
67
50
80
60
70
62
67
70
80
72
90
76
95
85
88
90
72
76
85
88
98
99
98
99
95
51