Date post: | 04-Jul-2015 |
Category: |
Technology |
Upload: | takashi-someda |
View: | 1,578 times |
Download: | 1 times |
株式会社チョイスタジオ 〒606-8225 京都府京都市左京区田中門前町46 京美華ビル3階 TEL : 075-724-4400 Email : info@choistudio.jp
アルゴリズムイントロダクション 23 章
最小全域木 minimum‐spanning‐tree Problem
2009/06/08 id:tksmd
自己紹介
• 染田貴志 (id:tksmd) – チョイスタジオ@百万遍で、もそもそしています。 – i戦士(isenshi.com) という開発チームの一員です。
– Seasar FoundaCon で開発しています。 – 融点というバンドでオルガンを弾いてます。
• Related Works – Choistudy (hHp://www.choistudy.jp/) – Tuigwaa/escafeWeb (hHp://www.escafe.org/) – Cubby (hHp://cubby.seasar.org/) – 融点 on MySpace (hHp://www.myspace.com/u10asia90)
一番最近のは。。。。
23章のお題
• 構成 – 導入 (最小全域木とは)
– 成長法による最小全域木の構成 – クラスカルとプリムのアルゴリズム
• クラスカルのアルゴリズム
• プリムのアルゴリズム
最小全域木を求める問題 (Minimum Spanning Tree Problem)
を解くアルゴリズム
全域木
• 全域木 (Spanning Tree) – 無向連結グラフが与えられたとき、全ての点を結合する閉路を含まない辺の集合
最小全域木
• 最小全域木 (Minimum Spanning Tree) – 各辺に重みが与えられた時に、その重みの総和が最小であるような全域木
– 与えられたグラフによっては、複数存在しうる
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
€
w(T) = w(u,v) =(u,v )∈T∑ 37
最小全域木
• これも同一グラフに対する最小全域木
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
€
w(T) = w(u,v) =(u,v )∈T∑ 37
最小全域木
• 辺の重みが全て異なる場合はこれだけ
a
b
h g
e
d
f
c
i 11
3
8
9
1
12
7
6
2
13 14
10
4
€
w(T) = w(u,v) =(u,v )∈T∑ 37
5
余談
• STP (Spanning Tree Protocol) – LANにおいてループ構成(=閉路)を回避するための通信プロトコル
– 冗長性の確保
– 各スイッチがルートブリッジに向けて最小のパスコストで到達出来るルートを選択する
最短経路木を求める問題
記号の定義
€
€
G = (V ,E) (u,v)∈ E
w(T) = w(u,v)(u,v )∈T∑ (T ⊂ E)
A ⊆ T
• 無向グラフ • 目的関数
• 部分集合
成長法による最小全域木の構成
• 基本的な考え方 – 全域木を構成していく、ある段階での辺の部分集合に着目する
– その部分集合にある辺を一つ加えて、全域木を成長させる
– その辺の選択で「貪欲」な戦略をとる
成長法による最小全域木の構成
€
GENERIC - MST(G,w)1 A←∅
2 while A ≠MST3 do find safe edge (u,v) for A4 A← A∪{(u,v)}5 return A
成長法による最小全域木の構成
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
€
T = {(a,b),(b,c),(c,d),(c, f ),(c,i),(d,e),( f ,g),(g,h)}
€
A = {(c,i),( f ,g),(g,h)}
€
A = {(c,i),(c, f ),( f ,g),(g,h)}
成長法による最小全域木の構成
• 維持する条件
ループ直前において A はある最小全域木の部分集合
ループ内では、それを加える事によって
上記を満たすような「安全な辺」を探し、 これまでの部分集合に加える
成長法による最小全域木の構成
• 「安全な辺」の求め方 – 定理 23.1 より
– A を侵害しない、G の任意のカット (S,V-S) を設定
– (S,V-S) と交差する任意の軽い辺を (u,v) とすると、これが安全な辺
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4 €
A = {(c,i),( f ,g),(g,h)}
S↑
V-S↓
成長法による最小全域木の構成
• 「安全な辺」の求め方 (続) – 系 23.2
– 森 GA = (V,A) の任意の連結成分を C = (VC,EC) – C と GA を連結する辺 (u,v) が軽い辺ならば、
(u,v) は A に対して安全
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4 €
A = {(c,i),( f ,g),(g,h)}
成長法による最小全域木の構成
• ポイント – 「安全な辺」を部分集合に加えるという選択を繰り返し最小全域木を得る
– 「安全な辺」は、その時点での部分集合に、それを侵害しない任意のカットに対する軽い辺を選べばよい
クラスカルとプリムのアルゴリズム
• 代表的なアルゴリズム – クラスカルのアルゴリズム
– プリムのアルゴリズム
• 各アルゴリズムの味噌 – 育て方の基本戦略
– 利用するデータ構造 – 計算量
クラスカルのアルゴリズム
• 基本戦略 – 最初に重みにより辺集合をソートする – 森を連結していき、最終的に木となる
€
MST −KRUSKAL(G,w)1 A←∅
2 for each v ∈ V[G] 3 do MAKE - SET(v)4 sort E with weight w ascending order5 for each (u,v)∈ E (with sorting order)6 do if FIND - SET(u) ≠ FIND - SET(v)7 then A← A∪{(u,v)}8 UNION(u,v)9 return A
クラスカルのアルゴリズム
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
1. 最小の辺からスタート
2. 辺の重みの昇順に処理
クラスカルのアルゴリズム
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
3. 閉路を構成する場合は たとえ重み最小でも処理 しない
4. 最小全域木を構成したら 終了
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
クラスカルのアルゴリズム
• 雰囲気 – 重み最小の辺の周辺から、森の成長がはじまり、それがのそのそとくっついていく
• データ構造 – 互いに疎な集合の森 (disjoint‐set forest) で、ノード集合を管理 • m 回の MAKE‐SET と n 回の MAKE‐SET/UNION/FIND‐SET の計算量が O(mα(n))
クラスカルのアルゴリズム
• 計算量 – 初期化 O(V) – ソート O(E lg E) – ループ • O((V+E)α(V)) (|E|>=|V|-1) • = O(Eα(V)) (α(|V|)=O(lg V)=O(lg E)) • = O(E lg E) (|E|<|V|2)
• = O(E lg V)
プリムのアルゴリズム
• 基本戦略 – 指定されたノードから、最も重みの少ない頂点への辺を加え木を育てて行く
€
MST − PRIM(G,w,r) 1 for each u∈ V[G] 2 do key[u]←∞
3 π[u]← NIL 4 key[r] = 0 5 Q←V[G] 6 while Q ≠∅
7 do u← EXTRACT - MIN(Q) 8 for each v ∈ Adj[u] 9 do if v ∈ Q and w(u,v) < key[v]10 then π[v]← u11 key[v]← w(u,v)
€
A = {(v,π (v)) : v ∈ V −{r}}
プリムのアルゴリズム
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
1. 指定ノードからスタート
2. 最小の重みに進む
プリムのアルゴリズム
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
3. 既に追加されているノードへ は処理対象にはならない
4. 最小全域木を構成したら 終了
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
プリムのアルゴリズム
• 雰囲気 – 指定ノードからぞわぞわ木が育っていく – 直感的に最小全域木が作られてるっぽい
• データ構造 – 二分ヒープ • BUILD‐MIN‐HEAP O(n) • EXTRACT‐MIN O(lg n) • DECREASE‐KEY O(lg n)
プリムのアルゴリズム
• 計算量 – 初期化 O(V) – 全 EXTRACT‐MIN 操作 O(V lg V) – 隣接点の処理 O(E lg V) – よって O(V lg V + E lg V)
プリムのアルゴリズム
• フィボナッチヒープの場合 – 初期化 O(V) – 全 EXTRACT‐MIN 操作 O(V lg V) – 隣接点の処理 O(E) – よって O(V lg V + E)
疎な場合の前処理 (23-2)
a
b
h g
e
d
f
c
i 11
4
8
9
1
7
7
2
8
2
6 14
10
4
ab
fgh
cdei
8 4
8
1. 各ノードの最小重み の辺をピックアップ
2. 縮約したグラフに MST‐PRIM
その他のアルゴリズム
• ブルーフカ法 – 重みが全て異なるグラフを前提
– O(E lg V)
• Reverse‐DeleCon 法 – クラスカル法の逆 – 最初に全ての辺を含むグラフからはじめ、重みの大きい辺から削除していく
– O(E lg E (lg lg E)3)
まとめ
• 最小全域木問題 – 貪欲戦略で最適解を得ることが出来る – クラスカル法 • 森を育てて最終的に MST を得る
• O(E lg V) – プリム法 • ノードを指定し、枝をのばし最終的に MST を得る
• O(E lg V) • ただしフィボナッチヒープを用いて、ならし解析すると O(E+V lg V)