データ構造とアルゴリズム 第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) • しかし・・・以下の箇所はもっと効率よくできる – 最小距離の頂点を見つけるところ • この授業で扱ったデータ構造を使う
© Copyright 2024 Paperzz