第 12回 - Wikispaces

データ構造とアルゴリズム
第12回
正田 備也
[email protected]
http://tmasada.wikispaces.com/
最短経路探索
• 重み付き有向グラフで、ある頂点から出発し
て他の各頂点まで行く最短経路を求める
– カーナビに必須の機能
• というか地図サービスに必須の機能
• ダイクストラ法が有名
• その前に「重み付き有向グラフ」の説明
有向グラフ
• ざっくり言えば「丸を矢印でつないだもの」
• 正式には・・・
– 頂点集合 V と有向枝の集合 E の組 G=(V, E)
– 有向枝は、二つの頂点 u, v ∈ V の順序付きペア
(u, v)
有向グラフの例
有向グラフの別の例
2
1
3
5
4
現実にある有向グラフの例
• 道路網
– 一方通行があるため
• Webのリンク
– GoogleはWebリンク解析で会社を興したようなもの
• ツイッターのフォロー関係
重み付き有向グラフ
• 有向枝に数値が与えられている
• この数値を枝の「重み」という
• 重みが何を表すかは、応用から決まる
– 道路網なら二地点間の距離
重み付き有向グラフの例(p.269)
2
6
1
5
3
2
2
1
3
2
4
5
1
2
4
重みの表現方法
• 行列を使う
 0 6 5 3 


 0 2  2 
 1 0 2 4 


  1 0 
   2 0 


ダイクストラ法の流れ図
• 重要な配列(配列の大きさは頂点数)
– 距離: 出発点から各頂点までの、最短距離
• より近い経路が見つかり後から更新されることもある
– 通過点:各頂点をすでに通過したかどうか
• 1ならすでに通過した。0ならまだ
– 最短経路:最短経路上での各頂点の直前の頂点
• これを逆にたどると最短経路になる
はじめ
初期設定
番号 = 1,頂点数
最大値 → 距離(番号)
0 → 通過点(番号)
0 → 最短経路(番号)
初期設定
0 → 距離(1)
探索
番号 = 1,頂点数
最大値 → 最小距離
最小距離調査
点 = 1,頂点数
No
通過点(点) = 0
かつ
距離(点)<最小距離
Yes
距離(点) → 最小距離
点 → 最小点
最小距離調査
1 → 通過点(最小点)
距離設定
点 = 1,頂点数
距離(最小点) + 行列(最小点,点)
< 距離(点)
Yes
距離(最小点) + 行列(最小点,点)
→ 距離(点)
最小点 → 最短経路(点)
距離設定
探索
最短経路表示
おわり
No
1
距離
2
3
4
5
∞ ∞ ∞ ∞ ∞
通過点
0
0
0
0
0
最短経路
0
0
0
0
0
実行例
2
6
1
0
5
3
2
2
1
3
2
4
5
1
2
4
1
2
3
4
5
距離
0
∞ ∞ ∞ ∞
通過点
1
0
0
0
0
最短経路
0
0
0
0
0
実行例
2
6
1
0
5
3
6
2
2
3
2
5
1
4
5
1
4
3
2
実行例
2
6
1
0
5
3
2
2
1
4
3
2
5
1
4
3
2
1
2
3
4
5
距離
0
6
5
3
∞
通過点
1
0
0
1
0
最短経路
0
0
0
1
0
実行例
2
6
1
0
5
3
2
2
3
2
4
1
4
5
1
4
3
2
実行例
2
6
1
0
5
3
2
2
3
2
4
1
4
5
1
4
3
2
1
2
3
4
5
距離
0
6
4
3
∞
通過点
1
0
1
1
0
最短経路
0
0
4
1
0
実行例
2
6
1
0
5
3
5
2
2
3
2
4
1
4
5
1
4
3
2
8
実行例
2
6
1
0
5
3
5
2
2
3
2
4
1
4
5
1
4
3
2
1
2
3
4
5
距離
0
5
4
3
8
通過点
1
1
1
1
0
最短経路
0
3
4
1
0
実行例
2
6
1
0
5
3
5
2
2
3
2
4
1
4
5
1
4
3
2
7
実行例
2
6
1
0
5
3
5
2
2
3
2
4
1
4
5
1
4
3
2
7
1
2
3
4
5
距離
0
5
4
3
7
通過点
1
1
1
1
1
最短経路
0
3
4
1
2
計算量
– 外側のループは頂点の数だけまわる
– 内側のループも頂点の数だけまわる
• ということは・・・O(N2)
• しかし・・・以下の箇所はもっと効率よくできる
– 最小距離の頂点を見つけるところ
• この授業で扱ったデータ構造を使う