Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Algorithm and Data Structre -Graph Algorithm-
Search
uoo38
October 29, 2019
Programming
180
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Algorithm and Data Structre -Graph Algorithm-
uoo38
October 29, 2019
More Decks by uoo38
See All by uoo38
プログラミング初心者のぼくが陥った落とし穴 / Traps for programming beginner
uoo38
1
250
コンパイラ開発から学ぶ大規模開発 / Large-Scale Development Learned from Compiler Development
uoo38
0
1.3k
Cコンパイラ自作 / Progress of Developing C Compiler
uoo38
0
840
Other Decks in Programming
See All in Programming
Intent as Code
shoppingjaws
2
330
新卒PdEのリアル
ryu1013
1
430
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
690
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.5k
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
340
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
180
AIの中の人になってみる
htkym
0
170
ALB ログから Trace を気合で繋げる技術
fohte
7
880
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
120
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
220
XHTMLが残したもの
yosuke_furukawa
PRO
2
440
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.8k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
202
76k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
650
Designing Experiences People Love
moore
143
24k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
450
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
What's in a price? How to price your products and services
michaelherold
247
13k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
490
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
370
Bash Introduction
62gerente
615
220k
Transcript
アルゴリズムとデータ構造 グラフアルゴリズム編 Twitter: @uoo38
自己紹介 ソーシャルアカウント Twitter: @uoo38 GitHub: uoo38 趣味 ロケットリーグ 車でサッカーするゲーム 是非一緒にプレイしよう
⚠注意⚠ ガチめなコンピュータ・サイエンスの講義をします 割とむずめな内容です そもそも5分で解説できる内容じゃない けど頑張って分かりやすく解説する努力はするよ 全て理解する必要はありません 5分で理解できたら天才 こんな概念があるんだなーくらいに思ってもらえれば十分 興味持ってあとで調べてくれたら最高
題材:トポロジカルソート DAGのノードを順序付けするアルゴリズム どのノードもその出力先のノードより前にくるように並べ替え 身近な利用例 Makefileで指定されたファイルのコンパイル・リンク順序決定 出典:Wikipedia
None
DAGとは 有向非巡回グラフ (directed acyclic graph) 以下の特徴を持つグラフ エッジ(辺)は向きがある(一方通行) 閉路が存在しない DAGの例 DAGじゃない例
DAGをソート? DAGの場合,ノードを横一列に並べたとき,エッジの方向を揃える並べ方が存 在する これをするのがトポロジカルソート トポロジカルソートの結果は一意とは限らない 具体的な実装方法は割愛 あとで質問してくれたら答えるかも(チラッ) 3 1 2
5 4 1 2 3 4 5 ソート前 ソート後
どこで使うの? みなさんMakefile書いたことありますか? なぜmakeがコンパイル順序を決定できるか疑問に思ったこと ありませんか?
makeの仕組み トポロジカルソートを使うとコンパイル順序が決定可能 具体的に順を追って説明するよ
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
なんとなくソートしちゃう DAGをソートしてみる C A B E D E.c A.c A
B C D E A.c E.c ソート前 ソート後
いい感じに順番決まった ソート結果を順番にコンパイルする コンパイル・リンク順序 A.c A B E.c E D C
A B C D E A.c E.c ソート結果
まとめ トポロジカルソートはDAGをソートするアルゴリズム makeはトポロジカルソートによってコンパイル順序を決定 もう少し一般化すると,スケジューリング問題を解決する ときに使われる
One more thing…
トポロジカルソートの実装 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
トポロジカルソートの実装 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
トポロジカルソートの実装 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
トポロジカルソートの実装 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
トポロジカルソートの実装 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
トポロジカルソートの実装 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