有根樹圖

Download Report

Transcript 有根樹圖

第九章 樹圖
9.1 Introduction to Trees
9.2 Applications of Trees
9.3 Tree Traversal
9.4 Spanning Trees
9.5 Minimum Spanning Trees
9.1 樹圖簡介

Definition:
樹圖(tree)指的是一個沒有簡單環道的連通無向圖。



沒有簡單環道(simple circuit)
連通
無向圖
~2~
例:下列圖形中,何者為樹圖?
a
b
c
a
d
d
e
f
b
c
a
b
a
d
c
c
b
d
e
f
e
f
e
f
G1
G2
G3
G4
樹圖
樹圖
非樹圖
非樹圖
~3~
Theorem: 一個無向圖為樹圖若且唯若任意兩個頂
點間都存在唯一的簡單路徑。
 證明:首先假設T為樹圖。
則T是個沒有簡單環道的連通圖。
令x和y為T的兩個頂點。
因為T是連通的,因此在頂點x和y間存在一個唯一
的簡單路徑。若還存在另一個簡單環道,將兩個
路徑(一個由頂點x到頂點y,另一個由頂點y至頂
點x)結合在一起將形成一個環道。
由於可以在T中找到一個簡單環道。
所以,樹圖中任意兩個頂點只存在唯一的簡單路
徑。

~4~

現在假設在圖形T中任意兩個頂點間都存在唯一的
簡單路徑,則T是連通的。
因為任兩頂點間都有路徑連結。
此外,圖形T不能有簡單環道。
假設圖形T中有簡單環道通過頂點x和y,則可將此
環道分成兩個連結x和y的簡單路徑(一個由頂點x
到頂點y,另一個由頂點y至頂點x)。
因此,任意兩個頂點間都存在唯一簡單路徑的圖
形為樹圖。
~5~
森林圖(forests)

任何沒有簡單環道的連通圖皆為樹圖。
沒有簡單環道的非連通圖稱為森林圖,而其任意
連通分支都是個樹圖。
~6~
有根樹圖(rooted tree)

Definition: 一個有根樹圖(rooted tree)為一樹圖,其
中一個頂點被指定為根點,而每個邊的方向皆指
向離開根點的方向。
~7~

Definition: 一個有根樹圖(rooted tree)為一樹圖,其中一個頂
點被指定為根點,而每個邊的方向皆指向離開根點的方向。
f
g
c
a
d
b
b
c
a
d
e
e
f
a
c
樹圖
g
根點為a的
有根樹圖
e
d
b
f
g
根點為c的
有根樹圖
~8~
有根樹圖的術語
假設T為一樹圖。若v為異於根點的頂點,則其親點
(parent)指的是唯一指向v之方向邊的出始點u,而頂點
v稱為頂點u的子點(child)。有相同親點的頂點稱為手
足點(siblings)。
 一個異於根點之頂點v其祖先點(ancestors)指的是由根
點到此頂點之(唯一)路徑上所有不同於v的頂點
(也就是,頂點v的親點、其親點的親點、等等,直
到到達根點為止)。

~9~
頂點v的後代點(descendants)指的是以頂點v為祖先點
的頂點。
 一個樹圖中的頂點如果沒有子點則稱為此樹圖的葉
子點(leaf)。而有子點的頂點稱為內點(internal vertices)。
 若頂點a為樹圖中的一個頂點,一個以a為根點的子樹
圖(subtree)指的是由頂點a、其所有後代點及相接合之
邊所形成的子圖。

~10~
一個有根樹圖T
以b為根點
的子樹圖
a
b
f
h
c
d
a為f,b和g的親點;
j為l和m的親點。
f是a的子點;
g e是c的子點。
f,b和g為手足點;
e和d為手足點。
j
以g為根點
i
的子數點
e
a, b為c的祖先點
d, e, c為b的後代點
k
l
m
葉子點:d, e, f, k, i, l, m
其餘的頂點皆為內點
~11~
Definition:
一個有根樹圖稱為m元樹圖(m-ary tree),若其每個
內點的子點數目皆不大於m。
 一個有根樹圖稱為滿m元樹圖(full m-ary tree),若其
每個內點的子點數目皆等於m。
 當m = 2時,稱為二元樹圖(Binary Tree)。

~12~
範例
T1
滿二元樹圖
T2
滿三元樹圖
~13~
T3
滿5元樹圖
T4
一個m元樹圖(m = 3)
但非滿m元樹圖
~14~
排序有根樹圖(ordered rooted tree)
一個排序有根樹圖指的是一個有根樹圖,其每個
內點的子點是有排序的。畫出排序有根樹圖時,
其子點的排序依照慣例是由左向右。
 在有序二元樹圖(一般就簡稱為二元樹圖)中,
第一個子點稱為左子點(left child),而第二個子點稱
為右子點(right child)。

~15~
以其左子點為根之子樹圖稱為此內點的
左子樹圖(left subtree),而以其右子點為根之子樹圖
稱為此內點之右子樹圖(right subtree)。
 在某些二元樹圖的應用中,除了根點外,所有的
頂點都可視為其親點的左子點或是右子點。就算
是某頂點只有一個子點,在有需要時也都會這樣
看待其子點。

~16~
範例
a
頂點c的右子樹圖
b
c
頂點c的左子樹圖
d
e
f
g
i
h
l
j
k
m
二元樹圖T
~17~
樹圖模型
H
H
H
H
C
H
H
H
C
C
H
H
C
H
H
C
C
H
C
H
H
丁烷
H
H
H
H
C
H
H
類丁烷
兩種丁烷的同分異構物
~18~
表現組織架構
~19~
電腦檔案系統
~20~
Theorem: 一個包含n個頂點的樹圖有n  1個邊。
 證明:我們將利用數學歸納法來證明這個定理。
可以注意的是,對所有的樹圖都能任意選取一個
頂點視為有根樹圖的根點。
 基本步驟:當n = 1,只有一個頂點的樹圖是沒有
邊的,所以當n = 1時,此定理成立。

~21~

歸納步驟:


歸納假說為包含k個頂點的樹圖有k  1個邊,其中k為一
正整數。
假設一個樹圖T有k + 1個頂點。
令頂點v為一個葉子點(此頂點一定會存在,因為樹圖
的頂點數目是有限的),而且令w為v之親點。
將頂點v與接合於其上之(唯一的)邊移去,會得到含
有k個頂點的新的樹圖T’。
根據歸納假說T’有k  1個邊。
所以,樹圖T應該有k個邊,因為它比樹圖T’多一個邊。
如此便完成了歸納法的證明。
~22~
Theorem:
一個有i個內點的滿m元樹圖之頂點數目為
n = m·i + 1。
 證明:在樹圖中,除了根點外,其他的頂點都是
某個內點的子點。因為每個內點都有m個子點,
圖形中除了根點外應該有m·i個點。
所以,樹圖中共有n = m·i + 1個頂點。

~23~
範例
T1
一個滿二元樹圖m = 2, i = 3,
所以包含7 = 23 + 1個頂點
T2
一個滿三元樹圖m = 3, i = 4,
所以包含13 = 34 + 1個頂點
~24~
T3
一個滿5元樹圖m = 5, i = 3,
所以包含16 = 53 + 1個頂點
T4
不為m元樹圖
不適用上述定理
~25~

Theorem: 一個滿m元樹圖若有
(i) n個頂點,則有i = (n  1)/m個內點和
l = [(m  1)n + 1]/m個葉子點。
(ii) i個內點,則有n = mi + 1個頂點和
l = (m  1)i + 1個葉子點。
(iii) l 個葉子點,則有n = (ml  1)/(m  1)頂點和
i = (l  1)/(m  1)個內點。
~26~

證明(i):令n表頂點數、i為內點數目,而l為葉子點
的數目。本定理的三個部份都能用n = m·i + 1,以
及等式n = i + l來求得。
我們將在此證明(i) 。
由n = m·i + 1,求得i = (n  1)/m,代入等式n = i + l,
可得
l = n  i = n  (n 1)/m = [(m  1)n + 1]/m。
~27~

例:假設某人開始傳遞連鎖信件。每個接到信的人
都被要求必須將信件轉寄給四個人。有些人會照著
做,而有些人則完全不予理會。如果這個連鎖信件
在100個人收到信而不寄出任何信件後便停止了。
若一個人只接到一次信件,則包括第一個寄信人共
有多少人曾看到信件?而又有多少人寄出了信件?
~28~

解:這種連鎖信件能以4元樹圖來表現。其中內點
代表的是寄出信件的人,葉子點則是沒有寄出信件
的人。因為有100個人沒寄出信,所以l = 100。根據
前述定理的第(iii)部份,所有n = (4100  1)/(4  1) =
133個人看過信件,
而有i = n  l = 133  100 = 33人寄出了信件。
~29~
在有根樹圖中頂點v的水平(level)為由根點到此頂點
之唯一路徑的長度。根點的水平定義為零。
 一個有根樹圖的高度(height)為所有頂點之水平中
最大的數目。換言之,有根樹圖的高度就是由根
點到其他頂點的路徑中最大的長度。
 一個高度為h的有根m元樹圖是平衡的(balanced),
如果其所有葉子點的水平都為h或h  1。

~30~
範例
水平 頂點
0
a
1
b, j, k
2
c, e, f, l
3
d, g, i, m, n
4
h
a
b
k
j
f
c
l
e
d
g
i
m
n
h
此有根樹圖的高度為4。
~31~
範例
T1
平衡的樹圖
T2
非平衡的樹圖
~32~
T3
平衡的樹圖
~33~

Theorem:
在高度為 h 的 m 元樹圖中,至多有 mh 個葉子點數
(l  mh )。

Corollary:
若一個高度為 h 的 m 元樹圖有 l 個葉子點,
則 h ≥ logm l 
若此樹圖為一個平衡的滿 m 元樹圖,
則 h = logm l 
~34~
9.2 樹圖的應用

我們將討論三種能以樹圖加以研究的問題。
 第一個問題為:如何儲存表列中的項目,方能
容易找尋到需要的項目?
 第二個問題:在某些有相同形態的物件中,要
如何做出一系列的決定方能找出具有某些特定
性質的物件?
 第三個問題是:一組符號要如何有效地編碼成
二元字串?
~35~
二元搜尋樹 (binary search tree)
我們主要的目的在,當所有的項目都是完全有序
的時候,提供一個有效的搜尋演算法。
 要完成這個目標,可以透過二元搜尋樹




這是一個二元樹,每個頂點的子點都被指定為左子點
或是右子點。
沒有一個頂點有多過一個左子點或右子點,而且每個
頂點都都被標記成代表某個項目的(有序)線索。
頂點上的線索大於其左子樹圖中的所有頂點,且小於
其右子樹圖中的所有頂點。
~36~

例:利用下面的字生成一個二元搜尋樹圖:mathematics,
physics, geography, zoology, meteorology, geology, psychology和
chemistry(根據英文字母之順序為其大小)。
Mathematics
Physics
Geography
Chemistry
Zoology
Geology Meteorology
Psychology
~37~
決策樹圖
有根樹圖能用來模型化“需要經過一序列的決策
來得到結果”這類的問題。
 二元搜尋樹圖能經過一連串的比較用來定位某個
項目。其中每一次的比較都會告訴我們,找尋之
項目的位置,或是應該向左子樹圖還是右子樹圖
移動。
 當一個有根樹圖中,每個內點都是一個決策,而
每個頂點的其子樹圖表示其決策會出現的結果。
我們稱這種樹圖為決策樹圖(decision tree)。
而可能會出現的結果,則對應於這個有根樹圖中
路徑所到達的葉子點。

~38~


例:假定有七個重量完全一樣的銅板和一個重量稍輕的假銅板。用一
個天平要經過幾次的秤重,才能判斷出八個銅板中哪一個才是假的?
解: 天平每一次秤重都有三種可能:兩邊一樣重、左邊比較重或是右
邊比較重。因此,秤重結果的決策樹圖為一個三元樹圖。樹圖中至少
有八個葉子點,因為總共有八種可能出現的結果。所需秤重最大的次
數應該就是決策樹圖的高度。前一節的系理可知決策樹圖的最小高度
為log3 8 = 2。所以,最少需要做兩次的秤重。
~39~
例:下圖表示的為a, b, c排列的決策樹圖。
Ex: a = 2, b = 8, c = 5
a:b
a<b
a>b
b:c
a:c
a>c
a<c
b:c
c>a>b
b>c
b<c
a>b>c
a>c>b
b>c
a:c
b<c
c>b>a
a>c
a<c
b>a>c
b>c>a
~40~

根據二元比較的排序方式,其複雜度是以比較的
次數來度量之。

排序n個元素中所需最多的比較次數,也就是這個
演算法中的最壞情況。

而最多的比較次數,也會相等於其決策樹圖中最
長路徑的長度。

換句話說,排序n個元素中所需最多的比較次數等於其
決策樹圖的高度。

因為其高度至少為log n!,所以排序n個元素至少需要
做log n!次的比較。
~41~

Theorem:
利用二元比較的排序演算法至少需要做
log n!次的比較。
~42~
前置編碼 (Prefix codes)
某種能確定區分不同之兩個字元的編碼,必然不
會出現其中一者是另一者前段的狀況。有這種條
件的編碼方法稱為前置編碼(prefix codes)。
 例如,e為0,a為10,t為11即為前置編碼。
任何一個字都對應於唯一的位元字串。

~43~
前置編碼

字串10110為ate的編碼。
 沒有字元的編碼為1,而有字元a編碼為01,因
此a應該為字的第一個字元。
 沒有字元的編碼為1,而有字元t編碼為11,因
此t應該為字的第二個字元。
 最後一個位元0則代表e。
~44~
例:一個前置編碼能以二元樹圖來表現。
e  0
a  10
t  110
n  1110
s  1111
1
0
e
0
1
a
0
1
11111011100
t
0
n
1
 sane
s
~45~
霍夫曼編碼 (Huffman coding) (1951)
輸入字串中符號的頻率,產生一個使用最少位元
的前置編碼。
 這個演算法稱為霍夫曼編碼(Huffman coding)。
 由大衛.霍夫曼於1951年在麻省理工學院當研究
生時,於期末報告時提出。
 此演算法是資料壓縮(data compression;減少資料
傳輸量的學問)中的基本演算法,它廣泛的被應
用於壓縮表現文章的位元字串。在壓縮聲音與圖
像的檔案中也扮演著重要的角色。

~46~
例:將下列賦予出現頻率的符號做霍夫曼編碼:A: 0.08,B:
0.10,C: 0.12,D: 0.15,E: 0.20,F: 0.35。
何為編碼一個字元的平均位元數目?
0.08

A
0.10

B
0.12

C
D
0.08+0.10=0.18
0.12

C
0.18
0.15

D
B
0.12+0.15=0.27
0.18
B
0.20

E
0.35

F
0.38
0.35

F
C
E
B
A
0.27 + 0.35 = 0.62
A
0.27
0.20

E
A
0.27
0.15 0.20 0.35



D
E
F
D
0.35

F
C
0.18+0.20=0.38
~47~
(接續上頁範例)
0.27
D
0.38
0.35

F
C
E
B
0.27 + 0.35 = 0.62
0.38
A
1.00
0.62
0
0
E
1
1
1
0
F
F
B
A
D
0
1
E
0
1
C
D
C
B
A
0.38 + 0.62 = 1.00
A: 111 B: 110
D: 010 E: 10
C: 011
F: 00
前序編碼
~48~
(接續上頁範例)
A: 111 B: 110 C: 011 D: 010
E: 10
F: 00
編碼一個字元的平均位元數目為
30.08 + 30.10 + 30.12 + 30.15 + 20.20 + 20.35 = 2.45.
解碼: 0111110010 
CAFE
~49~
賽局樹圖
樹圖也能用來分析許多不同的遊戲,如:井字遊
戲、nim、西洋跳棋和西洋棋等等。
 在這些遊戲中,兩個參賽者都輪流行動,也非常
清楚對手先前的步驟,除了兩個參賽者外沒有其
他的因素會影響遊戲的結果。
 我們將使用賽局樹圖(game trees)來模型化這些遊戲。
樹圖的頂點表示遊戲中可能發生的情況,而頂點
下的邊則表示各種可採行的步驟。

~50~

例:捻(nim) 這個遊戲一開始有些石頭分成好幾堆。遊戲
者能自某堆石頭中移去一個或多個石頭,但是不能拿走所
有石頭中最後一個石頭。無法再移動石頭的人便算輸。下
圖中表現的是在一開始有分別為2、2、1個的三堆石頭。
~51~
井字遊戲
(a)賽局樹圖開始的一部分
(b)賽局樹圖終結時的某一部分
~52~
9.3 樹圖搜尋

有序根樹圖經常用來儲存資料。因此,需要找出
一種方法能夠搜尋樹圖中所有的頂點,並取出儲
存的資料。本節中將介紹幾種重要的演算法,能
夠拜訪有序根樹圖內所有的頂點。
~53~
普遍性位址標示系統
(Universal address system)


將根點標記為0。
然後其k個子點(位於水平1上)由左至右
標記為1,2,…,k。
每個位於水平n中的頂點v,若被標記為A,
則其kv個子點,由左至右,
分別標記為A.1, A.2, …, A.kv。
~54~
Universal address system: 範例
0
1
1.1
1.2
2
3
4
5.1
3.1
1.3
5
3.2
5.2 5.3
4.1
3.12
3.11
3.121
3.13
3.122 3.123
5.11
3.124
~55~
搜尋演算法
有系統的拜訪有序根樹圖中每一個頂點的方法稱
為搜尋演算法(traversal algorithm)。
 前序搜索(preorder traversal)-DLR
 中序搜索(inorder traversal)-LDR
 後序搜索(postorder traversal) -LRD
 每種演算法皆能以遞迴方式定義之。

~56~
Preorder

Definition: 令T為一個有序根樹圖,根點為r。
若T只包含頂點r,則r即為T之前序搜索。
否則,
假設T1, T2, …, Tn為r由左至右的子樹圖。
T之前序搜索
由拜訪r開始,
接著依前序來搜索T1,然後依前序來搜索T2,依此
類推,直至搜索完Tn為止。
~57~
前序搜索
a
a
d
b
c
e
j
f
e
g
h
k
n o
b
i
c
f
j k
nop
d
g
hi
lm
l m
p
前序式:a b e j k n o p f c d g l m h i
~58~
Inorder

Definition: 令T為一個有序根樹圖,根點為r。
若T只包含頂點r,則r即為T之中序搜索。
否則,
假設T1, T2, …, Tn為r由左至右的子樹圖。
T之中序搜索
由依前序來搜索T1開始,
接著拜訪根點r,
然後依中序來搜索T2,依中序來搜索T3,依此類推,
直至搜索完Tn為止。
~59~
中序搜索
a
d
b
e
j
c
f
h
k
n o
g
i
j
e
n
k
op
b
f
a
c
l d
g h i
m
l m
p
中序式: j e n k o p b f a c l g m d h i
~60~
Postorder

Definition: 令T為一個有序根樹圖,根點為r。
若T只包含頂點r,則r即為T之後序搜索。
否則,
假設T1, T2, …, Tn為r由左至右的子樹圖。
T之後序搜索
由依後序來搜索T1開始,
接著依後序來搜索T2,依後序來搜索T3,依此類推,
直至搜索完Tn,
最後則拜訪根點r。
~61~
後序搜索
j
nop
k
a
d
b
e
j
c
f
n o
c lm
g
h i
d
a
g
h
k
e
f
b
i
l m
p
後序式: j n o p k e f b c l m g h i d a
~62~
中序式、前序式、後序式

建構表現算式的二元樹圖 ((x + y)2) + ((x  4)/3).
+

+
x
/

2
y
x
3
4
~63~
Ex: ((x + y)2) + ((x  4)/3)的前序式為何?
+

+
x
/

2
y
x
3
前序式可由左邊二元樹圖之
前序搜索而得
前序式寫出來的算式也稱為
波蘭記號(Polish notation),
用來紀念波蘭邏輯學家盧卡西維
茨
4
此算式的前序式為: +  + x y 2 /  x 4 3.
~64~

例:前序算式 +  * 2 3 5 /  2 3 4的值為何 ?

解: +  * 2 3 5 /  2 3 4
6
1
8
2
3
~65~
例:算式((x + y) 2) + ((x  4)/3)的後序式為何?
+

+
x
/

2
y
後序式可由左邊二元樹圖之
後序搜索而得
後序式寫出來的算式也稱為
逆波蘭記號(reverse Polish notation)。
x
3
4
此算式的後序式為: x y + 2  x 4  3 / +.
~66~

例:後序算式7 2 3   4  9 3 / +的值為何?

解: 7 2 3 *  4  9 3 / +
6
1
3
1
4
~67~
例:找出一個有序根樹圖來表現複合命題
((p  q))  (p  q)。然後利用這個有根樹圖
找出這個式子的前序式、後序式與中序式。
 解: 


前序式:   p q   p  q



後序式:p q   p  q   
p q p
q

中序式: p  q  p  q
~68~
9.4 生成樹圖

Definition: 令G為一個簡單圖。
其生成樹圖(spanning tree)為G的子圖,此樹圖包含
G中所有的頂點。

一個圖形的生成樹圖並不唯一。
~69~


例:找出右圖所示之簡單
圖的生成樹圖。
解:產生生成樹圖的步驟
如下圖所示。
~70~
Theorem:
簡單圖是連通的,若且唯若此圖形有個生成樹圖。
 證明:






首先,假設簡單圖G有個生成樹圖T。
T包含G中所有的頂點。
而且,任兩個頂點間都有條路徑相連。
因為T是G的子圖,即,圖形G中任兩個頂點間都有條路
徑相連。
所以,G是連通的。
~71~

現在假設G是連通的。若G不是個樹圖,則必然包含
一個簡單環道。移去簡單環道中的一個邊,所得的
子圖將會少一個邊,但是依然含有所有的頂點,而
且也還是連通的。因為,若兩個頂點間的路徑需要
通過被移去的邊時,可以利用經過此邊之簡單環道
的其他邊,來找出另一條連接這兩個頂點的路徑。
所以說,移去邊後的子圖是連通的。若此子圖不是
樹圖,則必有一個簡單環道。依相同的方法,刪去
簡單環道中的一個邊,得到一個連通且包含所有頂
點的子圖。重複這個步驟,直到得到一個連通的子
樹圖為止。這個子樹圖即為圖形G的生成樹圖。
~72~
深度優先搜尋 (Depth-First Search, DFS)
d
a
f
c
b




i
e
h
g
f
j
k
g
d
e
c
h
i
k
j
a
b
任意選擇一個頂點為有根樹圖的根點。
陸續加入連結於存在於樹圖中頂點之新的邊與連結於此邊
而尚未出現在樹圖中之新的頂點。繼續這樣的過程,使得
產生的路徑儘可能的延長。
若此路徑已經包含所有的頂點,生成樹圖便完成了。
否則,由此路徑的終點回溯至前面先加入的頂點,直至頂
點連結於尚未加入的頂點。
深度優先搜尋是一種回溯法(backtracking),因為演算法會
返回先前拜訪過的頂點。
~73~
廣度優先搜尋
a
d
e
h
i
m



b
c
l
g
f
j
k
f
c
b
a
e
d
h
g
j
i
k
l
m
任意選擇一個頂點為有根樹圖的根點
將連結於此頂點的邊通通加入樹圖中。然後,在水平1中
將所有鄰接的頂點依任意的次序加入樹圖。
接下來根據頂點排序,在不形成環道的前提下,依次加入
其鄰邊與尚未出現於樹圖中的鄰接頂點。這個步驟將找出
所有水平2的頂點。繼續這種過程直至將所有的頂點加入
樹圖為止。
~74~
回溯法(backtracking)應用


圖形著色考慮以三個顏色來為
左邊的圖形著色。樹圖則描述
如何以回溯法建構一個3著色。
在程序中,先使用紅色,其次
藍色,最後是綠色。這個簡單
的圖形不需要回溯法。然而,
是說明回溯法很好的例子。
a紅色
在著色的樹圖中,路徑的始點
為根點(假設為頂點a),所以
a紅色 b藍色
指定根點a為紅色。接下來,指
定b為藍色,c為紅色,而d為綠
色。此時,無法用任何顏色來
a紅色 b藍色
a紅色 b藍色 c綠色
c紅色
為頂點e著色,回溯至前一個頂
點d。然而,頂點d的顏色無法 a紅色 b藍色
a紅色 b藍色 c綠色
更改。故繼續回溯至頂點c,改
d紅色
c紅色 d綠色
變其顏色為綠色。如此一來,
我們邊達到著色的目標,d為藍
a紅色 b藍色c綠色
色,而e為綠色。
d紅色 e綠色
~75~
例:子集合之和



給定一組正整數x1, x2, …, xn的集合。找出一
組子集合,使子集合內所有正
整數之和為M。回溯法如何用來
解決這個問題?
解:我們由一個空集合開始。
只要集合中數字的和保持小於
或等於M,便將數字一個個加
入集合中。一旦加入任何尚未
加入的數都會使和大於M,便
拿去最後加入的數字,即回溯
至前面的階段,然後重複加入數字的方式。
右圖即為在集合{31, 27, 15, 11, 7, 5}中,
找出和為39之子集合。
~76~
有向圖之深度優先搜尋
a
b
c
f
e
i
j
d
g
h
k
l
d
a
b
c
g
有向圖之深度優先搜尋的結果
不是一個樹圖,而是個生成森林圖。
i

h
f
l
k
e
j
~77~
9.5 最小生成樹圖

試圖找出一個生成樹圖,使得所有樹圖之邊上權
數的總和最低。這樣的生成樹圖,稱為
最小生成樹圖(minimum spanning tree)。
~78~
Prime’s Algorithm (頂點)

作法:



Let G=(V, E),Let U及V-U為頂點Set,
其中U初值假設為{a, b}, (a, b)為E中最小成本的邊。
Step:




① 挑出least cost edge (u, v),其中uU,v  V-U
② 將(u, v)邊加入Spanning Tree,
自V-U set中delete v,並將v加到U set
③ repeat 1~2 until U=V or無邊可挑
④ if (邊數<n-1) then "No Spanning Tree"
~79~
範例
芝加哥 $1000
紐約
舊金山
丹佛
700 (芝加哥,亞特蘭大)
800 (亞特蘭大,紐約)
1200 (舊金山,芝加哥)
900 (丹佛,舊金山)
總金額 = $3600
芝加哥
亞特蘭大
亞特蘭大 舊金山
紐約
丹佛
~80~
範例
a
4
4
c
1
2
f
3
2
3
i
3
1
3
e
b
2
g
j
1 (c, d)
2 (c, g)
3 (b, c)
1 (b, f)
2 (a, b)
2 (f, j)
3 (a, e)
3 (i, j)
3 (g, h)
3 (h, l)
1 (k, l)
5
3
4
3
d
h
3
1
k
l
總權數 = 24
~81~
Kruskal’s Algorithm (Edge)

Step: 假設G=(V , E)




① 自E中取出最小成本的邊。
② 若此邊未在Spanning Tree中形成cycle,
則加入此邊到Spanning Tree,否則放棄此Edge。
③ repeat 1~2 until E中無邊可挑,或已挑出(n-1)個邊
④ if (邊數<n-1) then "No Spanning Tree"
~82~
範例
芝加哥 $1000
紐約
舊金山
丹佛
700 (芝加哥,亞特蘭大)
800 (亞特蘭大,紐約)
900 (丹佛,舊金山)
1200 (舊金山,芝加哥)
亞特蘭大
總金額 = $3600
~83~
Example
a
4
4
c
1
2
f
3
2
3
i
3
1
3
e
b
2
g
j
5
3
4
3
d
h
3
1
k
l
1 (c, d)
1 (b, f)
1 (k, l)
2 (a, b)
2 (c, g)
2 (f, j)
3 (b, c)
3 (g, h)
3 (a, e)
3 (h, l)
3 (i, j)
總權數 = 24
~84~