アルゴリズムとデータ構造
第9週 グラフ構造と最短路問題
2013年11月28日 金岡 晃
授業計画
1
第1週 (9/26)
データ構造とアルゴリズムの基 礎
第2週 (10/3)
アルゴリズムの効率、線形構造 第3週
(10/10)
スタックと待ち行列 第4週
(10/17)
文字列照合(KMP法、BM法)
第5週 (10/24)
木構造、木の走査
→文字列照合(BM法)、木構 造
第6週 (10/31)
木の走査、二分木、決定木 第7週
(11/14)
中間試験
第8週 (11/21)
休講 第9週
(11/28)
グラフ構造と最短路問題 第10週
(12/5)
解の探索:Aアルゴリズム 第11週
(12/12)
データ整列:ヒープソート 法
第12週 (12/19)
データ整列:クイックソー ト法
第13週 (1/9)
データ探索:ハッシュ法 第14週
(1/16)
データ探索:木構造探索法 1/22-2/8 期末試験
2013/10/31 アルゴリズムとデータ構造
中間試験:解答と解説
アルゴリズムとデータ構造
2 2013/10/31 アルゴリズムとデータ構造
2013/10/31 アルゴリズムとデータ構造
3
<問1>
𝑎2 + 𝑏2 = 𝑐2を満たす自然数の組 𝑎, 𝑏, 𝑐 をピタゴラス数という。下記のアルゴリズムは与えらえた 2 つの自然 数 𝑎, 𝑏 に対し、𝑎2 + 𝑏2 = 𝑐2を満たす𝑐を探すアルゴリズムである。
【アルゴリズム A】
1) 𝑥 = 𝑎2 + 𝑏2を計算する
2) 𝑖 = 1, … , 𝑥に対し、以下を行う
(ア) 𝑖2が𝑥と等しいか確認する。等しい場合、𝑖を出力してアルゴリズムを終了する 3) 見つからなかった旨のメッセージを出力し、アルゴリズムを終了する
アルゴリズム Aに対し、以下を答えよ。
<問1-1> アルゴリズムA の計算量をオーダ記法で示せ
<問 1-2> アルゴリズム A より効率の良いアルゴリズムを示せ。その際、どの点がアルゴリズム A と比較し て効率が良いかを書くこと。
<問1-3> 問 1-2 で示したアルゴリズムの計算量をオーダ記法で示せ
問
1-1:
𝑂 𝑥または
𝑂 𝑎2 + 𝑏2問
1-2: 省略
問
1-3: 省略
2013/10/31 アルゴリズムとデータ構造
4
<問 2>
𝑛の階乗𝑛!を求める関数を𝑓 𝑛 とした場合、𝑎2 + 𝑏2 = 𝑐2𝑛 = 1のときは𝑓 𝑛 = 1で与えられる。𝑛 ≥ 2のときの 𝑓 𝑛 を再帰的手続きを利用して表せ
問
2:
𝑓 𝑛 = 𝑛 × 𝑓 𝑛 − 12013/10/31 アルゴリズムとデータ構造
5
<問 3>
文字列照合のアルゴリズム KMP 法において、文字(アルファベット)が{A, B, C, D} である場合、パターン
ABCABCAB に対するfailを導出せよ。ただし、解答には求めた failだけではなく、導出過程も記載すること。
問
3:
fail = {0,1,1,0,1,1,0,1}2013/10/31 アルゴリズムとデータ構造
6
<問 4>
12枚のコインがあり、そのうち 1枚だけが偽物である。偽物は外見は違わないが、重さが異なっているので区別 できる。ただし、偽物が本物より重いのか軽いのか不明である。ここで、天秤を 3 回だけ用いて、どのコインが偽 物でかつそれは本物より重いのか軽いのかを知るにはどうすれば良いか、答えよ。
ポイント
• アルゴリズム(手続き)を意識して書くと良い
• パターンすべてが網羅されているか確認すると良い
2013/10/31 アルゴリズムとデータ構造
7
𝑎 + 𝑏 + 𝑐 + 𝑑: 𝑒 + 𝑓 + 𝑔 + ℎ
𝑎 + 𝑏 + 𝑒: 𝑐 + 𝑓 + 𝑥
𝑎 ∶ 𝑏 𝑔 ∶ ℎ 𝑐 ∶ 𝑥
𝑖 + 𝑗 ∶ 𝑘 + 𝑥
𝑖: 𝑗 𝑖: 𝑗
> = <
>
=
< > <
𝑎 + 𝑏 + 𝑒: 𝑐 + 𝑓 + 𝑥
𝑒 ∶ 𝑥 𝑔 ∶ ℎ 𝑎 ∶ 𝑏
>
= <
𝛼: 𝛽 を左に𝛼、右に𝛽を載せて天秤で量る動作を表すものとする。
𝛼 + 𝛽: 𝛾
𝑙: 𝑥
=
での𝛼 + 𝛽は、右に𝛼と𝛽を載せていることを表すものとする。
天秤で量った結果をそれぞれ“>”, “=”, “<”で表し、「左が重い」「釣り合う」「右が重い」
を示すものとする。
12枚のコインを𝑎, 𝑏, 𝑐, 𝑑, 𝑒, 𝑓, 𝑔, ℎ, 𝑖, 𝑗, 𝑘, 𝑙とそれぞれ呼ぶこととし、量った結果に従い次の天秤 での計量を行うことを矢印で表すと、以下の図により3回の計量で偽物の判別と重い・軽いの 判断が可能である。
第 9 週
グラフ構造と最短路問題
アルゴリズムとデータ構造
8 2013/10/31 アルゴリズムとデータ構造
本日の到達目標と概要
•
到達目標
–
グラフの基礎とそのデータ表現、また代表的な問題である最短 路問題を知る
•
概要
–
グラフの基礎
–
グラフのデータ表現
–最短路問題
– Dijkstra
のアルゴリズム
9 2013/10/31 アルゴリズムとデータ構造
グラフの定義(1)
•
グラフ(
Graph)
•
頂点(
Vertex)の有限集合
Vと辺(
Edge, Arc)の有限集合
Eにより定 義
–
節(
Note)、枝(
Branch)とも
•
グラフの図表現
–
集合表現
2013/10/31 アルゴリズムとデータ構造
10
グラフの定義
2013/10/31 アルゴリズムとデータ構造
11
グラフ(Graph)
頂点(Vertex)の有限集合𝑉と辺(Edge, Arc)の有限集合𝐸によって定義され る。
𝐺 = 𝑉, 𝐸
頂点、辺はそれぞれ節(Node)、枝(Branch)とも呼ばれる。
グラフの図表現
:頂点
:辺
𝑎 𝑏
𝑐 𝑑
𝑎 𝑏
𝑐 𝑑
𝐺1 = 𝑉1, 𝐸1 𝑉1 = 𝑎, 𝑏, 𝑐, 𝑑
𝐸1 = 𝑎, 𝑏 , 𝑎, 𝑐 , 𝑏, 𝑐 , 𝑏, 𝑑 , 𝑐, 𝑑
𝐺2 = 𝑉2, 𝐸2 𝑉2 = 𝑎, 𝑏, 𝑐, 𝑑
𝐸2 = 𝑎, 𝑏 , 𝑎, 𝑐 , 𝑐, 𝑎 , 𝑐, 𝑏 , 𝑏, 𝑑 , 𝑐, 𝑑 無向
グラフ𝐺1
有向 グラフ𝐺2
グラフの用語(1)
2013/10/31 アルゴリズムとデータ構造
12
有向グラフ(Directed Graph)
無向グラフ(Undirected Graph)
辺が向きを持つグラフ(例:スライド11の𝐺2)
辺が向きを持たないグラフ(例:スライド11の𝐺1) 隣接(Adjacent)
あるグラフ𝐺 = 𝑉, 𝐸 で𝑒 = 𝑢, 𝑣 で𝑒 ∈ 𝐸のとき、頂点𝑢と𝑣は互いに隣接して いる、と言う
有向グラフの場合、あるグラフ𝐺 = 𝑉, 𝐸 で𝑒 = 𝑢, 𝑣 で𝑒 ∈ 𝐸のとき、頂点𝑢は 𝑣に隣接すると言い、頂点𝑣は𝑢から隣接すると言う。
始点と終点
あるグラフ𝐺 = 𝑉, 𝐸 で𝑒 = 𝑢, 𝑣 で𝑒 ∈ 𝐸のとき、頂点𝑢を辺𝑒の始点、𝑣を辺𝑒 の終点と言う
グラフの用語(2)
2013/10/31 アルゴリズムとデータ構造
13
次数(Degree)
無向グラフにおいて、ある頂点に接続している辺の個数
有向グラフの場合は、ある頂点について、それを始点とする辺の個数をそ の頂点の出次数(Out-degree)、それを終点とする辺の個数をその頂点の 入次数(In-degree)という。
孤立(Isolated)
次数0の頂点を孤立しているという 完全グラフ(Complete Graph)
どの2頂点をとってもそれらが隣接しているようなグラフ。
頂点の個数 𝑉 が𝑛の完全グラフを𝐾𝑛と書く 部分グラフ(Subgraph)
𝐺′ = 𝑉′, 𝐸′ があって、 𝑉′ ⊆ 𝑉かつ𝐸′ ⊆ 𝐸のとき 𝐺′は𝐺の部分グラフという
グラフの用語(3)
2013/10/31 アルゴリズムとデータ構造
14
誘導(生成)部分グラフ(Induced Subgraph)
グラフ𝐺 = 𝑉, 𝐸 に対して、 𝑉の部分集合𝑉′を考える。このとき、 𝐸′ = 𝑢, 𝑣 ∈ 𝐸 | 𝑢, 𝑣 ∈ 𝑉′ を用いて作られる部分グラフ𝐺′ = 𝑉′, 𝐸′ を、グラフ𝐺 の誘導(生成)部分グラフという
クリーク(Clique)
グラフ𝐺の部分グラフで、しかも完全グラフであるものと𝐺のクリークと言 う。
𝐺のクリークのうち最も多くの頂点を含むものを最大クリークと言う。
グラフの用語(4)
2013/10/31 アルゴリズムとデータ構造
15
道(Path、路)
頂点列𝑃 = 𝑣0, 𝑣1, ⋯ , 𝑣𝑘で 𝑣𝑖, 𝑣𝑖+1 ∈ 𝐸 𝑖 = 0, ⋯ , 𝑘 − 1 がなりたつもの 単純(Simple)
道𝑃に現れる頂点がすべて異なるとき、𝑃は単純であるという 閉路(Cycle、Circuit)
𝑣0 = 𝑣𝑘のとき、𝑃を閉路という ループ(Self-loop)
長さ1の閉路
到達可能(Reachable)
2頂点間を結ぶ道が存在するとき、到達可能であるという
グラフの用語(5)
2013/10/31 アルゴリズムとデータ構造
16
最短路(Shortest Path)
到達可能な2頂点間を結ぶ長さ最小のものを最短路という 距離(Distance)
到達可能な2頂点間の最短路の長さを距離という。
到達可能でない2頂点の距離は無限大∞と定義する。
有向路(Directed Path)
有向グラフのとき、 𝑣𝑖, 𝑣𝑖+1 ∈ 𝐸 𝑖 = 0, ⋯ , 𝑘 − 1 を満たすような頂点列 𝑃 = 𝑣0, 𝑣1, ⋯ , 𝑣𝑘があるとき、𝑃を頂点𝑣0から𝑣𝑘へ至る有向路といい、𝑣_0か ら𝑣_𝑘へ到達可能という
演習
1:グラフの描画
2013/10/31 アルゴリズムとデータ構造
17
𝐾6を描画せよ
演習
2:部分グラフ
2013/10/31 アルゴリズムとデータ構造
18
下のグラフに対し、 𝑉′ = 𝑎, 𝑏, 𝑒 をつかった誘導グラフ を図示と集合の双方で示せ
𝑎 𝑏
𝑐 𝑑
𝑒
𝑓
𝑔 ℎ
グラフの物理表現:順配置表現
2013/10/31 アルゴリズムとデータ構造
19
𝐴1 =
0 1 1 0 1 0 1 1 1 1 0 1 0 1 1 0
𝐴2 =
0 1 1 0 0 0 0 1 1 1 0 1 0 0 0 0 隣接行列(Adjacency Matrix)
行列𝐴の各行と各列を頂点に対応させ、行列の要素𝐴 𝑖, 𝑗 が、
無向グラフの場合 𝑖, 𝑗 ∈ 𝐸あるいは 𝑗, 𝑖 ∈ 𝐸ならば1、そうでないなら0と なっている行列。
有向グラフの場合 𝑖, 𝑗 ∈ 𝐸ならば1、そうでないなら0となっている行列。
𝑎 𝑏
𝑐 𝑑
𝑎 𝑏
𝑐 𝑑
無向 グラフ𝐺1
有向 グラフ𝐺2
隣接行列
隣接行列
グラフの物理表現:リンク配置表現(1)
2013/10/31 アルゴリズムとデータ構造
20
直交リスト
𝐴2 =
0 1 1 0
0 0 0 1
1 1 0 1
0 0 0 0
𝑎 𝑏
𝑐 𝑑
有向 グラフ𝐺2
• 最も左の1列と最も上の1行 はそれぞれ始点、終点とし ての頂点を表したレコード
• それ以外のレコードは辺を 表す
グラフの物理表現:リンク配置表現(2)
2013/10/31 アルゴリズムとデータ構造
21
隣接リスト
𝑎 𝑏
𝑐 𝑑
𝑎 𝑏
𝑐 𝑑
無向 グラフ𝐺1
有向 グラフ𝐺2
• 最も左のレコード群が頂点を表 し、その頂点が隣接する頂点を リストとして持っている
グラフのアルゴリズム:最短路問題
2013/10/31 アルゴリズムとデータ構造
22
重み付グラフ(Weighted Graph)
辺に距離などのコストが付いたグラフ
𝑆 𝐷
𝐴 𝐵
𝐻 𝐼
𝐸 𝐽
𝐶 𝐹 𝐾 𝐺
4
3
1
1
2
2 2
1 1
2
3
1 3
𝑆 からスタートして 𝐺 に至る道で、
コストの総和が最小になる道を見 つけるにはどうしたらよいか
最短路問題
Dijkstra
のアルゴリズム
2013/10/31 アルゴリズムとデータ構造
23
• 開始点からの集積コス トの増加が最も少ない 頂点を最優先する、と いう原則に従い、新た な頂点を1つずつ取り 込んでいく手法。
• グラフと始点とが与え られると、他の頂点ま での最短経路とコスト が求められる
Dijkstra
アルゴリズムを用いた事例
2013/10/31 アルゴリズムとデータ構造
24
𝑆 𝐷
𝐴 𝐵
𝐻 𝐼
𝐸 𝐽
𝐶 𝐹 𝐾 𝐺
4 3
1
1 2
2 2
1 1 2
3 1 3
𝑉 = {𝐴, 𝐵, 𝐶, 𝐷, 𝐸, 𝐹, 𝐺, 𝐻, 𝐼, 𝐽,𝐾,𝑆}
Floyd
のアルゴリズム
2013/10/31 アルゴリズムとデータ構造
25
• グラフが与えられると、
2頂点間の最短経路と コストが求められる
演習
32013/10/31 アルゴリズムとデータ構造
26
下のグラフに対し、Floydのアルゴリズムを適用した場合、
最終的に出力される配列costの情報を示せ
𝑆 𝐷
𝐴 𝐵 𝐸
𝐶
4 3
1
1 2 2
𝑉 = {𝐴, 𝐵, 𝐶, 𝐷, 𝐸, 𝑆}
S A B C D E
S 0 3 ∞ ∞ 4 ∞
A 3 0 1 1 ∞ ∞
B ∞ 1 0 ∞ ∞ 2
C ∞ 1 ∞ 0 ∞ ∞
D 4 ∞ ∞ ∞ 0 2
E ∞ ∞ 2 ∞ 2 0
配列costの初期状態
本日の到達目標と概要
•
到達目標
–
グラフの基礎とそのデータ表現、また代表的な問題である最短 路問題を知る
•
概要
–
グラフの基礎
–
グラフのデータ表現
–最短路問題
– Dijkstra
のアルゴリズム
27 2013/10/31 アルゴリズムとデータ構造