離散数学

Similar documents
離散数学

離散数学

alg2015-6r3.ppt

Microsoft PowerPoint - 06graph3.ppt [互換モード]

memo

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

PowerPoint Presentation

Microsoft PowerPoint - 06.pptx

人工知能入門

グラフの探索 JAVA での実装

memo

( ) ( ) 30 ( ) 27 [1] p LIFO(last in first out, ) (push) (pup) 1

Microsoft PowerPoint - DA2_2018.pptx

第2回

Microsoft PowerPoint - ad11-09.pptx

Microsoft PowerPoint - kougi10.ppt

Microsoft PowerPoint - 6.pptx

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - 05.pptx

Microsoft PowerPoint - mp13-07.pptx

プログラム言語及び演習Ⅲ

Microsoft PowerPoint - DA2_2017.pptx

人工知能論 第1回

Taro-2分探索木Ⅰ(公開版).jtd

オートマトンと言語

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft Word - 中間試験 その1_解答例.doc

Microsoft PowerPoint - 5.ppt [互換モード]

COMPUTING THE LARGEST EMPTY RECTANGLE

第2回

Microsoft PowerPoint - algo ppt [互換モード]

Microsoft PowerPoint - DA2_2018.pptx

untitled

Microsoft PowerPoint - 13approx.pptx

PowerPoint Presentation

Microsoft PowerPoint - uninformed.ppt

DA02

Microsoft PowerPoint - DA2_2019.pptx

PowerPoint プレゼンテーション

Microsoft PowerPoint - mp11-06.pptx

フィルタとは

Taro-2分探索木Ⅱ(公開版).jtd

Microsoft Word - NonGenTree.doc

情報処理Ⅰ

LIFO(last in first out, ) 1 FIFO(first in first out, ) 2 2 PUSH POP : 1

Microsoft PowerPoint - 09-search.ppt [互換モード]

データ構造

Taro-再帰関数Ⅱ(公開版).jtd

卒論発表

計算機ソフトウエア

AC-1 procedure AC-1 (G) begin Q = f(i; j) (i; j) 2 arc(g), i 6= jg repeat begin CHANGE = false for each (i; j) 2 Q do CHANGE = REVISE((i; j)) _ CHANGE

Microsoft Word - VBA基礎(3).docx

CプログラミングI

Microsoft PowerPoint - ppt-7.pptx

レポートでのデータのフィルタ

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

PowerPoint プレゼンテーション

Microsoft PowerPoint - DA1_2019.pptx

Taro-スタック(公開版).jtd

PowerPoint プレゼンテーション

自己紹介 ( 専門分野 ) プログラミング言語の研究 特に基礎理論 研究の出発点 : 自分がうまくプログラムが書けないのを言語のせいにする プログラムの間違いを自動発見する仕組みを作る そもそも間違いを犯しにくいプログラミング言語を作る

1 ななちゃんの IT 教室教養講座 : データ構造の巻 第 1 回秘密道具 : マイ コンソール なな : クリじい データ構造 の勉強をするんだけど 便利な秘密道具はない? クリ : あるぞ あるぞ 定番秘密道具の マイ コンソール 他の巻を読んでない読者のために 説明しよう 1 ここに Jav

オートマトンと言語

アルゴリズムとデータ構造

プログラミング入門1

コンピュータ工学Ⅰ

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

Functional Programming

離散数学

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

PowerPoint Presentation

Microsoft PowerPoint - 5Chap15.ppt

ALG2012-A.ppt

プログラミングI第10回

Microsoft PowerPoint - DA2_2017.pptx

コンピュータ工学Ⅰ

2. 幅優先探索のアルゴリズムの考え方ふつう考えるように順次経路をたどっていくということから 発想を転換する それにはまず 区間経路を列挙することから始める AB, AC, BC, CB, BD, DE, CE, EC, DE, ED, DF, EG そして経路探索とは このような区間を記したカード

Microsoft PowerPoint - 7.pptx

…好きです 解説

Microsoft PowerPoint - 09re.ppt [互換モード]

Information Theory

Microsoft PowerPoint - ca ppt [互換モード]

Microsoft PowerPoint - kougi11.ppt

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

文字数は1~6なので 同じ本数の枝を持つパスで生成される呪文の長さは最大で6 倍の差がある 例えば 上図のようなケースを考える 1サイクル終了した時点では スター節点のところに最強呪文として aaaaaac が求まる しかしながら サイクルを繰り返していくと やがてスター節点のところに aaaaaa

cp-7. 配列

Parametric Polymorphism

alg2015-4r2.ppt

memo

Microsoft Word - 13

Microsoft PowerPoint - 11.pptx

PowerPoint Presentation

Microsoft PowerPoint - 10.ppt [互換モード]

文法と言語 ー文脈自由文法とLR構文解析2ー

レポートのデータへのフィルタの適用

Microsoft PowerPoint - H20第10回最短経路問題-掲示用.ppt

Microsoft PowerPoint - ca ppt [互換モード]

スライド 1

Transcription:

離散数学 グラフ探索アルゴリズム 落合秀也

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 2

連結性の判定問題を考える グラフ G(V,E) が与えられたとき G が連結かどうか を判定したい 小さいグラフなら 紙に書いてみればよい 一般には簡単ではない 大きいグラフの場合 コンピュータに判断させる場合 グラフ G 3

コンピュータに判定させるには 次の方法で判定できそう : ある頂点 s を開始点とし 辺をたどって 動けるだけ動き回る (Traverse する ) すべての頂点に到達 (reach) できれば 連結である 到達可能な範囲をすべて動き回っても まだ到達できていない頂点があれば 連結でない s すべて到達可能 連結である 到達できない頂点が残る 連結でない 4

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 5

幅優先探索 (Breadth-First Search) s L 0 L 1 L 2 L 3 基本的な考え方 頂点 s から開始 L 0 とする L 0 から 外向きに辺をつたい 接続する頂点を取り込む L 1 とする L 1 から 外向きに辺をつたい 接続する頂点を取り込む L 2 とする L 2 から 外向きに辺をつたい 接続する頂点を取り込む L 3 とする 頂点 sから湧き出す水によって引き起こされる洪水 (Flood) が到達可能な頂点すべてに伝搬するイメージ 6

幅優先探索 ( もう少し正確な定義 ) 層 (Layer) L 1,, L n を次のように作成する 開始点 s の近隣の頂点 ( の集合 ) を L 1 とする L 1,, L j がすでに作られているとき L j に辺でつながっていて L 1,, L j に含まれない頂点 ( の集合 ) を L j+1 とする s s から L j の頂点までの道 (path) は存在する L j の頂点は s から j の距離にある L 1 s から頂点 t までの道が存在すれば 頂点 t はいずれかの層に属する L j L j+1 7

幅優先探索によって作られる木 L j+1 を作る実際的な方法 : L j の各頂点に辺で接続する頂点が L j+1 に新たに含まれるか 否かを判定する s L 0 L 1 L 2 L 3 ここで 新たに L j+1 に含まれる場合 の辺で グラフを作っていくと 木になる 右図の場合で 検証してみよう ( コンピュータになった気分で 1 つずつ 試してみよう ) 幅優先探索木と呼ばれる 8

幅優先探索の終了 幅優先探索の終了条件 目的 1 -- 特定の頂点 ( 例 : 頂点 t ) を発見する場合 - 頂点 t が見つかった時点で終了 - 探索可能なすべての頂点を巡回した時点で終了 目的 2 -- グラフが連結かどうかを判定する場合 - 探索可能なすべての頂点を巡回した時点で終了 幅優先探索が終了しないケース 頂点 t が見つからない (or 特定の頂点を探していない ) かつグラフが無限大に大きい 9

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 10

幅優先探索を実現する 幅優先探索を実現するアルゴリズムを設計する 予備知識 1 グラフの隣接リストによる表現 予備知識 2 キュー (Queue) の働きと使い方 11

幅優先探索を実現するグラフを隣接リストで表現する 隣接リスト (adjacency list) 1. ある頂点 vの 近隣の頂点をリストで表現したもの : Adj[v] 2. 全頂点に対して 同様のリストを作る : Adj 配列 1 3 5 着目する頂点 1 2 近隣の頂点 3 4 2 4 2 1 4 Adj の大きさは O(n+m) n: 頂点の数 m: 辺の数 Adj 3 4 5 1 1 3 5 2 4 5 12

幅優先探索を実現するキュー (Queue) の働きと使い方 先入れ先出し装置 : Fast In Fast Out (FIFO) Enqueue ( キューに入れる ) キュー Dequeue ( キューから出す ) 入れた順番に取り出せるメモリ : 3, 1, 2, 8, 6, 5, 4 の順に投入すれば 3, 1, 2, 8, 6, 5, 4 の順に出てくる 13

幅優先探索アルゴリズムの設計 準備するもの グラフ G の隣接リスト配列 : Adj 頂点 v の隣接ノードは Adj[v] s L 0 L 1 L 2 L 3 訪問判別フラグ : F[v] v に訪問済みなら F[v] = true の値を取る v に訪問していなければ F[v] = false の値を取る ( 初期値 ) キュー : Q キューに v を入れる操作 Q.enqueue(v) キューから取り出したものを v とする操作 v := Q.dequeue() 14

幅優先探索アルゴリズム 開始点 s から幅優先探索を行うアルゴリズム F[s] := true Q.enqueue(s) s While Q is not empty c v := Q.dequeue() a b Foreach node u in Adj[v] If F[u] = false Then, d e f F[u] := true Q.enqueue(u) h EndIf i EndFor EndWhile 時間計算量 :O(n+m) (*) 厳密には初期化処理が必要だが省略している j g k 15

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 16

深さ優先探索 (Depth-First Search) d h a e s b f i c j g k 基本的な考え方 開始点 s から 辺をたどって行きつくところ (=dead end) まで行ってみる ( ただし同じ頂点は取らない ) 行き止まり (=dead end) に当たれば 1 つ戻って 別の辺をたどってみる 1 つ戻ってもダメなら 2 つ戻ってみる 2 つ戻ってもダメなら 3 つ戻ってみる 頂点 sから歩き始めた人が すべての行き止まりにあたるまで 隈なく歩いていくイメージ 17

深さ優先探索によって作られる木 出来るだけ深いところまで一気に作る 戻りながら 別に行ける頂点があれば そちらの枝を作る s s c b a b f e g d i f k j h h e j g d i c k a 深さ優先探索木と呼ばれる 18

深さ優先探索の終了 深さ優先探索の終了条件 目的 1 -- 特定の頂点 ( 例 : 頂点 t ) を発見する場合 - 頂点 t が見つかった時点で終了 - 探索可能なすべての頂点を巡回した時点で終了 目的 2 -- グラフが連結かどうかを判定する場合 - 探索可能なすべての頂点を巡回した時点で終了 深さ優先探索が終了しないケース 頂点 t が見つからない (or 特定の頂点を探していない ) かつグラフが無限大に大きい 19

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 20

深さ優先探索を実現する 深さ優先探索を実現するアルゴリズムを設計する 予備知識 1 グラフの隣接リストでの表現 予備知識 2 スタック (Stack) の働きと使い方 21

深さ優先探索を実現するスタック (Stack) を利用する 後入れ先出し装置 : Last In Fast Out (LIFO) Push ( スタックに入れる ) Pop ( スタックから出す ) スタック 入れた順番の逆に取り出せるメモリ : (1) 3, 1, 2 を投入 (2) 2 個取り出す取り出される列は (3) 8, 6 を投入 2, 1, 6, 8, 3, 4, 5 (4) 3 個取り出す (5) 5, 4 を投入となる (6) 2 個取り出す 22

深さ優先探索アルゴリズムの設計 準備するもの グラフ G の隣接リスト配列 : Adj 頂点 v の隣接ノードは Adj[v] d a e s b f c g k 訪問判別フラグ : F[v] v に訪問済みなら F[v] = true の値を取る v に訪問してなければ F[v] = false の値を取る ( 初期値 ) h i j スタック : S スタックに v を入れる操作 S.push(v) スタックから取り出したものを v とする操作 v := S.pop() 23

深さ優先探索アルゴリズム 開始点 s から深さ優先探索を行うアルゴリズム F[s] := true S.push(s) While S is not empty v := S.pop() If F[v] = false Then, F[v] := true Foreach node u in Adj[v] If F[u] = false Then, S.push(u) EndIf EndFor EndIf EndWhile (*) 厳密には初期化処理が必要だが省略している s c a b d e g f k h j i 時間計算量 :O(n+m) 24

深さ優先探索アルゴリズム 2 再帰呼び出しによる方法 深さ優先探索を行うアルゴリズム ( 再帰呼び出し版 ) Function DFS(v) If F[v] = false Then, F[v] := true Foreach node u in Adj[v] If F[u] = false Then, DFS(u) EndIf EndFor EndIf EndFunction 頂点 s から探索を行う場合 : DFS(s) を実行すれば良い 再帰呼び出しは 実際には 裏ではスタックを使って実行される 25

幅優先探索と深さ優先探索の比較 幅優先探索 F[s] := true Q.enqueue(s) While Q is not empty v := Q.dequeue() Foreach node u in Adj[v] If F[u] = false Then, F[u] := true Q.enqueue(u) EndIf EndFor EndWhile 深さ優先探索 F[s] := true S.push(s) While S is not empty v := S.pop() If F[v] = false Then, F[v] := true Foreach node u in Adj[v] If F[u] = false Then, S.push(u) EndIf EndFor EndIf EndWhile 26

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 27

木の構造 根 (root) 枝 (branch) 葉 (leaf) 親 (parent) 子 (child) 先祖 (ancestor) 子孫 (descendant) 深さ (depth, level) 28

木 ( 根付き木 ) の構造 根 (root) 枝 (branch) 葉 (leaf) 根 枝 葉 葉葉葉葉 枝 葉 葉 葉 葉 葉 29

木 ( 根付き木 ) の構造 親 (parent) 子 (child) 先祖 (ancestor) 子孫 (descendant) 先祖 親 ここに着目 子 子 子孫 30

木の深さ (depth, level) 深さ 0 深さ 1 深さ 2 深さ 3 深さ 4 31

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 32

探索木 木の組換えを許すとする このとき 何らかの規則に沿って木を組み換えれば 探索効率を向上できることがある 9 8 14 3 6 1 適当な木 5 7 10 11 13 2 8 15 7 はどこ? - 幅優先探索 - 深さ優先探索などで探す 2 4 1 3 6 5 7 10 9 11 12 14 整理整頓された木 7 はどこ? - 8 よりは小さい - 4 よりは大きい - 6 よりは大きい 13 15 33

二分探索木 二分木 各ノードが高々 2 個の子を持つ ( 根付き ) 木 片方を左 もう片方を右と呼ぶ 二分探索木 ノードの値を n とするとき左枝の各ノードの値 < n 右枝の各ノードの値 > n となるように構成された木 探索したい値を s とするとき以下の方法で発見できる ( 存在すれば ) 3? Function 二分探索 (s,n) s=n 探索終了 s<n 左の子 l に対して二分探索 (s,l) を実行 s>n 右の子 r に対して二分探索 (s,r) を実行 34 6 2 7 1 4 3? 3? 3? 3 5

平衡二分探索木 二分探索木は 深さがアンバランスになることがある 浅いノードを探索した場合は 効率がよいが 最悪の場合 最も深いところまで探索する必要があるつまり最悪の場合 O(n) となる (n は頂点の数 ) 平衡二分探索木は 深さができるだけ等しくなるように構成された木 4 2 6 1 3 5 7 深さは log n なので O( log n ) で処理できる 35

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 36

パトリシア トライ (Patricia Trie) Practical Algorithm to Retrieve Information Coded in Alphanumeric 辞書式順序を定義可能なノード探索のための探索木 例 ) 以下のノードの探索木 a, aa, ab, aba, abb, b, c, ca, cb, cc a b aba? c 例 ) aba を検索する場合 1 文字目 (a) で振り分け 2 文字目 (b) で振り分け 3 文字目 (a) で振り分け aba に到達する 37 aa aba ab abb ca cb cc

DNS の名前体系と探索木 DNS の名前体系 ( 例 : www.u-tokyo.ac.jp など ) は インターネット上にパトリシアを構築して管理されている 根 (root) は. のみで表現される 深さ 1 のノードに.com..jp..net..org. などがある.jp. の子に.co.jp..ac.jp..ne.jp. などがある.ac.jp. の子に.u-tokyo.ac.jp. がある.com..jp..net..co.jp...ac.jp..ac.jp...u-tokyo.ac.jp. www.u-tokyo.ac.jp..ne.jp..ac.jp.? 38

今日の内容 グラフの連結性 の判定 幅優先探索 幅優先探索の実現方法 深さ優先探索 深さ優先探索の実現方法 木の構造 探索木 パトリシア トライ 39