Slide 1

Slide 1 text

アルゴリズムとデータ構造 グラフアルゴリズム編 Twitter: @uoo38

Slide 2

Slide 2 text

自己紹介 ソーシャルアカウント Twitter: @uoo38 GitHub: uoo38 趣味 ロケットリーグ 車でサッカーするゲーム 是非一緒にプレイしよう

Slide 3

Slide 3 text

⚠注意⚠ ガチめなコンピュータ・サイエンスの講義をします 割とむずめな内容です そもそも5分で解説できる内容じゃない けど頑張って分かりやすく解説する努力はするよ 全て理解する必要はありません 5分で理解できたら天才 こんな概念があるんだなーくらいに思ってもらえれば十分 興味持ってあとで調べてくれたら最高

Slide 4

Slide 4 text

題材:トポロジカルソート DAGのノードを順序付けするアルゴリズム どのノードもその出力先のノードより前にくるように並べ替え 身近な利用例 Makefileで指定されたファイルのコンパイル・リンク順序決定 出典:Wikipedia

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

DAGとは 有向非巡回グラフ (directed acyclic graph) 以下の特徴を持つグラフ エッジ(辺)は向きがある(一方通行) 閉路が存在しない DAGの例 DAGじゃない例

Slide 7

Slide 7 text

DAGをソート? DAGの場合,ノードを横一列に並べたとき,エッジの方向を揃える並べ方が存 在する これをするのがトポロジカルソート トポロジカルソートの結果は一意とは限らない 具体的な実装方法は割愛 あとで質問してくれたら答えるかも(チラッ) 3 1 2 5 4 1 2 3 4 5 ソート前 ソート後

Slide 8

Slide 8 text

どこで使うの? みなさんMakefile書いたことありますか? なぜmakeがコンパイル順序を決定できるか疑問に思ったこと ありませんか?

Slide 9

Slide 9 text

makeの仕組み トポロジカルソートを使うとコンパイル順序が決定可能 具体的に順を追って説明するよ

Slide 10

Slide 10 text

Makefileは実質DAG MakefileをDAGで表現してみる A: A.c … B: A … C: A B … D: E … E: E.c … C A B E D E.c A.c Makefile DAG

Slide 11

Slide 11 text

なんとなくソートしちゃう DAGをソートしてみる C A B E D E.c A.c A B C D E A.c E.c ソート前 ソート後

Slide 12

Slide 12 text

いい感じに順番決まった ソート結果を順番にコンパイルする コンパイル・リンク順序 A.c A B E.c E D C A B C D E A.c E.c ソート結果

Slide 13

Slide 13 text

まとめ トポロジカルソートはDAGをソートするアルゴリズム makeはトポロジカルソートによってコンパイル順序を決定 もう少し一般化すると,スケジューリング問題を解決する
 ときに使われる

Slide 14

Slide 14 text

One more thing…

Slide 15

Slide 15 text

トポロジカルソートの実装 L ← トポロジカルソートされた結果の入る空の連結リスト for each ノード n do visit(n) function visit(Node n) if n をまだ訪れていなければ then n を訪問済みとして印を付ける for each n の出力辺 e とその先のノード m do visit(m) n を L の先頭に追加 3 1 2 5 4 L 擬似コード出典:Wikipedia

Slide 16

Slide 16 text

トポロジカルソートの実装 L ← トポロジカルソートされた結果の入る空の連結リスト for each ノード n do visit(n) function visit(Node n) if n をまだ訪れていなければ then n を訪問済みとして印を付ける for each n の出力辺 e とその先のノード m do visit(m) n を L の先頭に追加 3 1 2 5 4 L 擬似コード出典:Wikipedia

Slide 17

Slide 17 text

トポロジカルソートの実装 L ← トポロジカルソートされた結果の入る空の連結リスト for each ノード n do visit(n) function visit(Node n) if n をまだ訪れていなければ then n を訪問済みとして印を付ける for each n の出力辺 e とその先のノード m do visit(m) n を L の先頭に追加 3 1 2 5 4 L 擬似コード出典:Wikipedia

Slide 18

Slide 18 text

トポロジカルソートの実装 L ← トポロジカルソートされた結果の入る空の連結リスト for each ノード n do visit(n) function visit(Node n) if n をまだ訪れていなければ then n を訪問済みとして印を付ける for each n の出力辺 e とその先のノード m do visit(m) n を L の先頭に追加 3 1 2 5 4 L 擬似コード出典:Wikipedia

Slide 19

Slide 19 text

トポロジカルソートの実装 L ← トポロジカルソートされた結果の入る空の連結リスト for each ノード n do visit(n) function visit(Node n) if n をまだ訪れていなければ then n を訪問済みとして印を付ける for each n の出力辺 e とその先のノード m do visit(m) n を L の先頭に追加 3 1 2 5 4 L 擬似コード出典:Wikipedia

Slide 20

Slide 20 text

トポロジカルソートの実装 L ← トポロジカルソートされた結果の入る空の連結リスト for each ノード n do visit(n) function visit(Node n) if n をまだ訪れていなければ then n を訪問済みとして印を付ける for each n の出力辺 e とその先のノード m do visit(m) n を L の先頭に追加 3 1 2 5 4 L 擬似コード出典:Wikipedia