290 likes | 446 Views
第八章 深入探討樹狀結構. 目次. 8.1 m-way 搜尋樹 8.2 B-tree 8.3 動動腦時間 8.4 練習題解答. 8.1 m-way 搜尋樹. 何謂 m-way 搜尋樹? 一棵 m-way 搜尋樹,所有節點的分支度均小於或等於 m 可以是空樹 倘若 T 不是空樹,則必須具備下列的性質: 節點的型態是 n, A 0 , (K 1 , A 1 ), (K 2 , A 2 ),…, (K n , A n ) ,其中 A i 是子樹的指標 0≦i≦n< m ; n 為節點上的鍵值數, K i 是鍵值 1≦i≦n< m
E N D
目次 8.1 m-way 搜尋樹 8.2 B-tree 8.3 動動腦時間 8.4 練習題解答
8.1 m-way 搜尋樹 • 何謂m-way 搜尋樹? • 一棵m-way搜尋樹,所有節點的分支度均小於或等於 m • 可以是空樹 • 倘若T不是空樹,則必須具備下列的性質: • 節點的型態是 n, A0, (K1, A1), (K2, A2),…, (Kn, An),其中 Ai 是子樹的指標 0≦i≦n< m;n 為節點上的鍵值數,Ki 是鍵值1≦i≦n< m • 節點中的鍵值是由小至大排列的,因此Ki < Ki+1, 1≦i< n。 • 子樹Ai的所有鍵值均小於鍵值Ki+1,0<i< n。 • 子樹An的所有鍵值均大於Kn,而且A0的所有鍵值均小於K1。 • Ai指到的子樹,0≦i≦n亦是m-way搜尋樹。
a 23, 48 d b c 55, 60 12, 17 28, 32 g f e 25 70 38 , 45 8.1 m-way 搜尋樹 (con.t) • Ex:下圖為 3-way 搜尋樹,共有12個鍵值
8.1 m-way 搜尋樹 (con.t) • 下圖為上圖中每個節點之 3-way搜尋表示法 • 由於3-way搜尋樹,每個節點的型態是 n, A0, (K1, A1), (K2, A2),…,(Kn, An),因此 a 節點的格式為 2, b, (23, c), (48, d)
5 , 7 12 , x 8.1 m-way 搜尋樹 (con.t) 8.1.1 m-way搜尋樹的加入 • 以 3-way 搜尋樹為例,依序將 5,7,12,6,8,4,3,10加入到搜尋樹,其中 x 表示目前無鍵值存在 (1) 加入5 (2) 加入7 (3) 加入12 5 , x 5 , 7
5 , 7 6 , x 4 , x 8 , 12 5 , 7 6 , x 12 , x 5 , 7 6 , x 8 , 12 8.1 m-way 搜尋樹 (con.t) (4) 加入6 (5) 加入8 (6) 加入4
5 , 7 6 , x 3 , 4 8 , 12 5 , 7 3 , 4 8 , 12 6 , x 10 , x 8.1 m-way 搜尋樹 (con.t) (7) 加入3 (8) 加入10
5 , 7 6 , x 3 , 4 8 , 12 10 , x 8.1 m-way 搜尋樹 (con.t) 8.1.2 m-way 搜尋樹的刪除 • 刪除方法與二元搜尋樹相同 • 樹葉節點:直接刪除 • 非樹葉節點:以左子樹中最大鍵值或右子樹中最小鍵值 取代之 • 假設有一棵3-way搜尋樹如下:
5 , 7 6 , x 4 , x 10,12 5 , 7 6 , x 4 , x 8 , 12 10 , x 8.1 m-way 搜尋樹 (con.t) • 刪除 3,則直接刪除 • 刪除 8
5 , 7 6 , x 4 , x 10 , x 5 , 10 6 , x 4 , x 5 , 6 4 , x 8.1 m-way 搜尋樹 (con.t) • 刪除 12 • 刪除 7 • 刪除 10
8.2 B-tree • 何謂 B-tree? • 一棵 order 為 m 的 B-tree 是一 m-way搜尋樹 • 可以是空樹 • 假若高度≧1必需滿足以下的特性: • 樹根至少有二個子節點,亦即節點內至少有一鍵值 • 除了樹根外,所有非失敗節點(即內部節點)至少有 個子節點,至多有m個子節點。此表示至少應有 –1個鍵值,至多有m–1個鍵值( 表示大於m/2的最小正整數) • 所有的樹葉節點皆在同一階層
a a 30 10,30 c b b d 500 8,10 c 6,8 50,70 20 d h g e f e 6 20 15,17 70 40 40 8.2 B-tree (con.t) • 3-way搜尋樹 vs. order 為 3 的 B-tree • 左圖不屬於B-tree of order 3,主要是因為樹葉節點不在同一階層上
K P P' 8.2 B-tree (con.t) • B-tree的加入方法 • 從 B-tree 中開始搜尋,假使加入的鍵值 X 在 B-tree 中找不到,則加入 B-tree 中。假設加入到 P 節點,若 • 該節點少於 m–1 個鍵值,則直接加入 • 該節點的鍵值已等於 m–1,則將此節點分為二,因為一棵order為m的B-tree,最多只能有m–1個鍵值 節點P: –1, A0, (K1, A1), …, (K –1, A –1) 節點P’:m– , A , (K +1, A +1), …, (Km, Am) 並且將K 和P'節點組成(K , P')加入其父節點。如下圖所示:
a 50 b c 20 , 40 60 , 70 , 80 d f e g j h i 5,10 25,30 62,67 45,48 53,54 72,76 85,90,95 8.2 B-tree (con.t) • Ex:此處的 B-tree 為 order 5,表示最多鍵值數為 4
a 50 b c 20 , 40 60 , 70 , 80 d f i e g j h 5,10 25,30 62,67 45,48 53,54 72,76 85,88,90,95 8.2 B-tree (con.t) • 加入88由於 j 節點的鍵值少於m–1即4個,則直接加入即可
a 50 b c 20 , 40 60 , 70 , 80 , 90 d e f g h i j k 5,10 25,30 45,48 85,88 95,98 62,67 53,54 72,76 8.2 B-tree (con.t) • 加入98,由於 j 節點已有m–1個鍵值(即4個),因此必須將 j 節點劃分為二,j、k,然後選出K = K3 = 90,並組成(90,k)加入c節點
a 50 b c 20 , 40 60 , 70 , 80 , 90 d e f g h i j k 5,10 25,30 45,48 85,88 62,67 53,54 72,76 91,95,98 a 50 b c 20 , 40 60 , 70 , 80 , 90 d e f g h i j k 5,10 25,30 45,48 85,88 62,67 53,54 72,76 91,93,95,98 8.2 B-tree (con.t) • 加入91 • 加入93
a 50 , 80 m b c 90 , 95 20 , 40 60 , 70 d e f g i h j l k 5,10 25,30 45,48 85,88 62,67 53,54 72,76 91,93 98,99 8.2 B-tree (con.t) • 加入99,以同樣的方法將 k 劃分為 k,l 並組成(95, l)加入 c 節點,由於 c 節點已有 m–1個鍵值,若再加入一鍵值勢必也要劃分 c 節點為二,其為 c、m,並將(80, m)加入其父節點 a
50 20 , 30 60 , 80 10,15 25,26 35,40,45 55,59 65,70,75 85,90 8.2 B-tree (con.t) 8.2.2 B-tree的刪除方法 • 一為刪除的節點是樹葉節點 • 二為刪除的節點為非樹葉節點 • 我們以 B-tree of order 5 如下圖來說明。假設已找到相關的節點 P
50 20 , 30 60 , 80 10,15 25,26 35,40,45 55,59 65,75 85,90 8.2 B-tree (con.t) • 刪除的節點是樹葉節點 • 刪除鍵值 X 後,若 P 節點還有大於或等於–1個鍵值,則刪除完畢,因為尚符合B-tree的定義,此處的m為5。如將下圖的鍵值 70 刪除,結果為下圖所示:
50 Pf 20 , 35 60 , 80 P P' 10,15 25,30 40,45 55,59 65,70,75 85,90 8.2 B-tree (con.t) • 刪除鍵值 X 後,若P節點的鍵值小於 –1個,其不符合B-tree的定義,因此必須調整。我們分四種情況說明: (1) 找右邊最近的兄弟節點p’,若p’尚有大於或等於 個鍵值,則將取出 P 的父節點 Pf 中最大的鍵值放入 P,然後從 p’ 節點取出最小的鍵值放入 P 的父節點Pf,如將下圖的鍵值 26 刪除
Pf 50 20 , 35 60 , 75 q' P 10,15 25,30 40,45 55,59 65,70 80,90 8.2 B-tree (con.t) (2) 若在 P 節點右邊找不到有一節點含有大於或等於 個鍵值時,則找其左邊的兄弟節點,若有一左兄弟節點q‘,則從 P 的父節點 Pf 取出最小鍵值放入 P,然後從 q‘ 中取出最大的鍵值放入 P 的父節點Pf。若欲刪除85,情形如下圖所示:
50 b c 20 , 30 60 , 80 e f h d g i 10,15 25,26 35,40,45 52,55,59 65,70,75 85,90 8.2 B-tree (con.t) • 刪除的節點為非樹葉節點 • 假若 P 節點的型態為 n,A0,(K1,A1), (K2,A2),…,(Kn,An),其中Ki = x,1≦i≦n。刪除 k 時找尋其右子樹中的最左邊的樹葉節點 P’,在 P’ 中找一個最小值 y,將 y 代替Ki值,如下圖,注意!也可以找尋其左子樹中最右邊的樹葉節點 P’,在 P’中找一最大值 y,將 y 代替Ki值
a 52 b c 20 , 30 60 , 80 e f h d g i 10,15 25,26 35,40,45 55,59 65,70,75 85,90 8.2 B-tree (con.t) • 若刪除 50,找到 P’ 節點為 g,從中取出最小值52,並代替50
55 b c 20 , 30 65 , 80 a e f h d g i 10,15 25,26 35,40,45 59,60 70,75 85,90 8.2 B-tree (con.t) • 若此時再刪除 52,由於從 P‘ 節點(即g)找到鍵值55代替52後,其鍵值數小於 –1個鍵值,此時就好比刪除樹葉節點g的情形,可向其右兄弟節點h借一鍵值65(因為在節點的鍵值個數大於 –1),其結果如下所示:
a 59 b c 20 , 30 80 e f d g' i 10,15 25,26 35,40,45 60,65,70,75 85,90 8.2 B-tree (con.t) • 若繼續刪除55,找到 P‘ 節點為 g,將最小值59代替55,由於其鍵值數小於 –1個鍵值,且其兄弟節點h也沒有大於 –1的鍵值,故將g、h與c的鍵值65合併於g'節點,結果如下圖所示:
a' 20 , 30 , 59 , 80 d e i g f 10,15 25,26 35,40,45 60,65,70,75 85,90 8.2 B-tree (con.t) • 此時c節點的鍵值數小於 –1,且其兄弟節點的鍵值數不大於 –1,故將b、c與a節點合併為a',結果如下: