第14回グラフとネットワークのアルゴリズム(3)kida/lecture/alg2019-14.pdf ·...
TRANSCRIPT
講義「アルゴリズムとデータ構造」
第14回 グラフとネットワークのアルゴリズム(3)
大学院情報科学研究科 情報理工学専攻情報知識ネットワーク研究室
喜田拓也
2019/5/21講義資料
今日の内容
最小全域木を求めるクラスカルのアルゴリズム(おさらい)
最小全域木を求めるプリムのアルゴリズム
プリムのアルゴリズムの考え方時間計算量がO 𝑚𝑚 log𝑛𝑛 であることの証明
最短路問題について最短路と最短路木ダイクストラのアルゴリズムダイクストラ・アルゴリズムの直観的理解
2
ネットワーク𝐺𝐺の最小全域木 (おさらい)
定義:
グラフ𝐺𝐺𝐺はネットワーク(重み付きグラフ)𝐺𝐺 = (𝑉𝑉,𝐸𝐸)の最小全域木(最小スパニング木)である
⇕𝐺𝐺𝐺は𝐺𝐺の全域木で含まれる辺の重みの総和が最小のもの
𝐺𝐺の最小スパニング木
432
51
2 7
ネットワーク𝐺𝐺
42
1
2
応用例として,通信網の設計,ガス・水道の配管設計などがある3
[考え方] 解𝑇𝑇を空集合から始めて,重みが小さい辺から選択し,
現在の解𝑇𝑇に加えていく.ただし,選択することにより閉路ができる
場合は選択しない.
クラスカルのアルゴリズム (おさらい)
クラスカルのアルゴリズムの解𝑇𝑇がもつ性質• 𝑇𝑇は閉路を含まない• 𝑇𝑇は,森になっている(必ずしも連結しているとは限らない)
※ グラフ𝐺𝐺が森 ⇔ 𝐺𝐺は閉路のないグラフ
432
51
2 7
432
51
2 7
432
51
2 7
432
51
2 7
432
51
2 7閉路ができる!
4
最小全域木を求めるプリムのアルゴリズム
5
[考え方] 解候補 𝑉𝑉𝑇𝑇 ,𝑇𝑇 をある頂点𝑣𝑣0のみからなる木(𝑣𝑣0からな
る部分グラフに対する最小全域木)から始めて,最小全域木
𝑉𝑉𝑇𝑇 ,𝑇𝑇 の範囲を徐々に広げていく.
432
51
2 7
432
51
2 7
432
51
2 7
432
51
2 7
最小全域木が求まっている範囲 𝑉𝑉𝑇𝑇 ,𝑇𝑇拡張候補辺(赤い辺)
𝑉𝑉𝑇𝑇に属する頂点との間に辺がある𝑉𝑉 − 𝑉𝑉𝑇𝑇に属する頂点(青い頂点)拡張候補辺を選んだとき𝑉𝑉𝑇𝑇に追加される 43
2
51
2 7
𝑣𝑣∗
拡張候補辺のうち,重みが最小のものを選択
その先の頂点を加えたら,拡張候補辺を更新
𝑣𝑣∗
𝑣𝑣∗
𝑣𝑣∗
プリムのアルゴリズム (疑似コード)
6
Procedure MST-Prim(𝐺𝐺 = (𝑉𝑉,𝐸𝐸): グラフ, 𝑤𝑤: 重み, 𝑠𝑠: 起点)1: 𝑣𝑣∗ ← 𝑠𝑠; 𝑇𝑇 ← ∅; 𝑉𝑉𝑇𝑇 ← {𝑠𝑠}; 𝑑𝑑 𝑠𝑠 ← 0;2: for all 𝑣𝑣 ∈ 𝑉𝑉-𝑉𝑉𝑇𝑇 do 𝑑𝑑 𝑣𝑣 = ∞;3: while (𝑉𝑉𝑇𝑇 ≠ 𝑉𝑉) do4: for each (頂点𝑣𝑣∗と隣接する頂点𝑣𝑣 ∈ 𝑉𝑉 − 𝑉𝑉𝑇𝑇) do5: if (𝑤𝑤 𝑣𝑣∗,𝑣𝑣 < 𝑑𝑑 𝑣𝑣 ) then6: 𝑑𝑑(𝑣𝑣) ← 𝑤𝑤(𝑣𝑣∗,𝑣𝑣), 𝑒𝑒(𝑣𝑣) ← 𝑣𝑣∗,𝑣𝑣 ;7: end if8: end for9: 𝑣𝑣∗ ← arg min
𝑣𝑣∈𝑉𝑉−𝑉𝑉𝑇𝑇𝑑𝑑 𝑣𝑣 ;
10: 𝑉𝑉𝑇𝑇 ← 𝑉𝑉𝑇𝑇 ∪ 𝑣𝑣∗ , 𝑇𝑇 ← 𝑇𝑇 ∪ 𝑒𝑒 𝑣𝑣∗ ;11: end while12: 最小全域木𝑇𝑇を出力する;
𝑒𝑒(𝑣𝑣)は𝑣𝑣を端点とする拡張候補辺
𝑑𝑑(𝑣𝑣)は𝑣𝑣を端点とする拡張候補辺の重み
プリムのアルゴリズムの動作例
7
3
22 2
3
1 4 1
43 11 2
3
3
0𝑣𝑣∗
3
2
∞∞
∞
∞∞
∞
∞
0
𝑣𝑣∗
2
2
2
1
∞∞
∞
∞
∞
0
𝑣𝑣∗
2
2
2
1
3
4
∞ ∞∞
2𝑣𝑣∗
0
2
2
1
3
4
4 ∞∞
2𝑣𝑣∗
02
2
1
1
4
3 ∞∞
𝑣𝑣∗0
2
2
2
1
1
4
1 ∞2
𝑣𝑣∗0
2
2
2
1
1
4
1 ∞2
𝑣𝑣∗0
2
2
2
11
1
12
3
𝑣𝑣∗
02
2
2
1
1
1
12
3
𝑣𝑣∗0
2
2
2
1
1
1
12
3
𝑣𝑣∗:追加された頂点赤字:更新された値
:拡張候補辺:解候補
𝑠𝑠
(証明) 1行目は定数時間で,2行目は明らかにO(𝑛𝑛)時間かかる.3行目のwhileのチェックは𝑉𝑉と𝑉𝑉𝑇𝑇のサイズ比較で行えるため,毎
回の実行は定数時間である.4行目のfor eachのループは新たな𝑣𝑣∗毎に実行される.𝑣𝑣∗は結局
はすべての𝑣𝑣 ∈ 𝑉𝑉が一度ずつなるので,for eachループの中身はwhileループ全体で2𝑚𝑚回実行される.for eachループの中身は数
値比較と代入だけなので毎回の実行は定数時間であり,グラフが隣接リストで与えられている場合,全体でO(𝑚𝑚)時間で実行できる.
9行目のarg minの実行は,単純に行うと𝑘𝑘回目のループのときO 𝑛𝑛 − 𝑘𝑘 時間がかかる.しかし,ヒープを使えば1回あたりO(log𝑛𝑛)時間でできる.10行目は明らかに定数時間でできるので,以上から,whileループ全体ではO(𝑚𝑚 + 𝑛𝑛 log𝑛𝑛)時間かかることになる.
グラフの連結性より𝑚𝑚 ≥ 𝑛𝑛 − 1なので,よって全体をO 𝑚𝑚 log𝑛𝑛時間で抑えることができる. 【証明終わり】
最悪時間計算量がO(𝑚𝑚 log𝑛𝑛)の証明
8
札幌から新千歳空港への最安乗り換え?
札幌 新札幌 北広島 恵庭 千歳 南千歳新千歳空港
9
※ JR北海道のウェブサイト,2019年5月21日調べ快速エアポート(自由席)利用の場合
260 260 260 220 170 310
450 450 360 260 350
640 640 450 400
840 640 590
840 880
1070
最短路とは
10
定義:
無向ネットワーク𝐺𝐺 = (𝑉𝑉,𝐸𝐸)において,頂点𝑢𝑢 ∈ 𝑉𝑉から頂点𝑣𝑣 ∈ 𝑉𝑉への最短路(shortest path)とは,𝑢𝑢から𝑣𝑣への路(path)のうち,
辺の重みの総和が最小のものである.
※ 負の重みを許すか否かで問題の難しさが変わる本講義では,重みはすべて非負の値をとると仮定する
3
2
2 2
3
1 4 1
43 1
1 23
3𝑢𝑢
𝑣𝑣
𝑢𝑢から𝑣𝑣への最短路
最短路木とは
11
定義:
辺の重みが非負である連結な無向ネットワーク𝐺𝐺 = (𝑉𝑉,𝐸𝐸) に対し,
グラフ𝐺𝐺′は頂点𝑠𝑠 ∈ 𝑉𝑉からの最短路木(shortest path tree)である
⇕𝐺𝐺′は𝑠𝑠を根とする𝐺𝐺の全域木で,𝑠𝑠から各頂点への路が最短路に
なっているもの
3
2
2 2
3
1 4 1
43 1
1 23
3𝑠𝑠
𝑠𝑠を根とする最短路木
Edsger W. Dijkstra(1930–2002)オランダ1972年チューリング賞
最短路木を求めるダイクストラアルゴリズム
12
[考え方] 解候補 𝑉𝑉𝑇𝑇 ,𝑇𝑇 をある頂点𝑠𝑠のみからなる木
(𝑠𝑠からなる部分グラフに対する最短路木)から始めて,
最短路木 𝑉𝑉𝑇𝑇 ,𝑇𝑇 の範囲を徐々に広げていく.
432
51
2 7
432
5
2 7
𝟏𝟏
432
5
7
𝟏𝟏
𝟐𝟐
𝑠𝑠 = 𝑣𝑣∗𝑣𝑣∗
𝑣𝑣∗𝟒𝟒
32
5𝟏𝟏
𝟐𝟐7
𝑣𝑣∗
最短路木が求まっている範囲拡張候補辺(赤い辺)
𝑉𝑉𝑇𝑇に属する頂点との間に辺がある𝑉𝑉 − 𝑉𝑉𝑇𝑇に属する頂点(青い頂点)拡張候補辺を選んだとき𝑉𝑉𝑇𝑇に追加される
拡張候補辺は,𝑢𝑢 ∈ 𝑉𝑉𝑇𝑇と𝑣𝑣 ∈ 𝑉𝑉 − 𝑉𝑉𝑇𝑇との間の
辺𝑒𝑒 = (𝑢𝑢, 𝑣𝑣)のうち,𝑠𝑠から𝑢𝑢への最短路長𝑑𝑑(𝑢𝑢)と𝑤𝑤(𝑒𝑒)の和が最小のもの
𝟒𝟒3
𝟔𝟔
5𝟏𝟏
𝟐𝟐7
𝑣𝑣∗
ダイクストラアルゴリズム (疑似コード)
13
Procedure SPT-Dijkstra(𝐺𝐺 = (𝑉𝑉,𝐸𝐸): グラフ, 𝑤𝑤: 重み, 𝑠𝑠: 起点)1: 𝑣𝑣∗ ← 𝑠𝑠; 𝑇𝑇 ← ∅; 𝑉𝑉𝑇𝑇 ← {𝑠𝑠}; 𝑑𝑑 𝑠𝑠 ← 0;2: for all 𝑣𝑣 ∈ 𝑉𝑉-𝑉𝑉𝑇𝑇 do 𝑑𝑑 𝑣𝑣 = ∞;3: while (𝑉𝑉𝑇𝑇 ≠ 𝑉𝑉) do4: for each (頂点𝑣𝑣∗と隣接する頂点𝑣𝑣 ∈ 𝑉𝑉 − 𝑉𝑉𝑇𝑇) do5: if (𝑤𝑤 𝑣𝑣∗,𝑣𝑣 + 𝑑𝑑 𝑣𝑣∗ < 𝑑𝑑 𝑣𝑣 ) then6: 𝑑𝑑 𝑣𝑣 ← 𝑤𝑤 𝑣𝑣∗,𝑣𝑣 + 𝑑𝑑 𝑣𝑣∗ , 𝑒𝑒(𝑣𝑣) ← 𝑣𝑣∗,𝑣𝑣 ;7: end if8: end for9: 𝑣𝑣∗ ← arg min
𝑣𝑣∈𝑉𝑉−𝑉𝑉𝑇𝑇𝑑𝑑 𝑣𝑣 ;
10: 𝑉𝑉𝑇𝑇 ← 𝑉𝑉𝑇𝑇 ∪ 𝑣𝑣∗ , 𝑇𝑇 ← 𝑇𝑇 ∪ 𝑒𝑒 𝑣𝑣∗ ;11: end while12: 最短路木𝑇𝑇を出力する;
𝑒𝑒(𝑣𝑣)は𝑣𝑣を端点とする拡張候補辺
𝑑𝑑(𝑣𝑣)は𝑣𝑣を端点とする拡張候補辺の重み
Primのアルゴリズムとの違いは+𝑑𝑑 𝑣𝑣∗ だけ!
時間計算量は同じO 𝑚𝑚 log𝑛𝑛
ダイクストラアルゴリズムの動作例
14
3
22 2
3
1 4 1
43 11 2
3
3
0𝑣𝑣∗
3
2
∞∞
∞
∞∞
∞
∞
0
𝑣𝑣∗
3
2
4
3
∞∞
∞
∞
∞
0 𝑣𝑣∗3
2
4
3
∞
∞
7 ∞∞
03
2
4
3
6
7
7 ∞∞
𝑣𝑣∗
2𝑣𝑣∗
03
4
3
5
7
7 ∞∞
𝑣𝑣∗0
3
2
4
3
5
7
6 ∞7
𝑣𝑣∗0
3
2
4
3
5
7
6 ∞7
𝑣𝑣∗0
3
2
4
35
7
67
10
𝑣𝑣∗
03
2
4
3
5
7
67
10
𝑠𝑠
𝑣𝑣∗
2
03
2
4
3
5
7
67
10
𝑣𝑣∗:追加された頂点赤字:更新された値
:拡張候補辺:解候補
ダイクストラアルゴリズムの直観的理解
15
3
2
2 2
3
1 4 1
43 1
1 23
3𝑠𝑠
𝑠𝑠
辺を細かく分けて,すべての辺の重みが等しく(1に)なるようにする
起点𝑠𝑠から幅優先探索を行い,到達した順に頂点を解に加える
12 3 5 6 7
8 9
10
4
探索の深さ
最短路に関する発展的な話題
辺の重みが非負整数の場合は平均時O(𝑚𝑚)まで改善で
きる(ただし,ランダムアルゴリズムによる)[U. Meyar, Single-source shortest-paths on arbitrary directed graphs in linear average-case time, in ACM-SIAM Symposium. Discrete Algorithms, 2001, pp. 797-806.]
ベルマン-フォード アルゴリズム(Bellman-Ford algorithm)
は正負の重みを扱えるが,最悪時計算量はO(𝑚𝑚𝑛𝑛)
与えられたグラフについて,すべての2頂点間の距離を
求めるワーシャル-フロイド アルゴリズム(Warshall-Floyd algorithm)の最悪時間計算量はO(𝑛𝑛3)
16
札幌から新千歳空港への最安乗り換え!
札幌 新札幌 北広島 恵庭 千歳 南千歳新千歳空港
260 450 640 810 840 1040
17
※ JR北海道のウェブサイト,2019年5月21日調べ快速エアポート(自由席)利用の場合
260 260 260 220 170 310
450 450 360 260 350
640 640 450 400
840 640 590
840 880
1070