Microsoft PowerPoint - ad11-09.pptx

Similar documents
Microsoft PowerPoint - mp13-07.pptx

PowerPoint Presentation

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

Microsoft PowerPoint - mp11-06.pptx

離散数学

memo

離散数学

14.Graph2

Microsoft PowerPoint - DA2_2019.pptx

Microsoft PowerPoint - DA2_2017.pptx

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

Microsoft PowerPoint - DA2_2017.pptx

Microsoft PowerPoint - DA2_2018.pptx

Microsoft PowerPoint - DA2_2018.pptx

Microsoft PowerPoint - 13approx.pptx

Microsoft PowerPoint - mp11-02.pptx

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

オートマトンと言語

memo

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

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

nlp1-04a.key

PowerPoint プレゼンテーション

Microsoft PowerPoint - 05.pptx

計算幾何学入門 Introduction to Computational Geometry

スライド タイトルなし

Microsoft PowerPoint - 06.pptx

A Constructive Approach to Gene Expression Dynamics

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

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

データ構造

Microsoft PowerPoint - ppt-7.pptx

Microsoft PowerPoint - enshu4.ppt [äº™æ‘łã…¢ã…¼ã…›]

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

情報処理Ⅰ

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

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

8. 自由曲線と曲面の概要 陽関数 陰関数 f x f x x y y y f f x y z g x y z パラメータ表現された 次元曲線 パラメータ表現は xyx 毎のパラメータによる陽関数表現 形状普遍性 座標独立性 曲線上の点を直接に計算可能 多価の曲線も表現可能 gx 低次の多項式は 計

模擬試験問題(第1章~第3章)

memo

vecrot

PowerPoint プレゼンテーション

Microsoft Word - no12.doc

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

cp-7. 配列

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

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

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

PowerPoint プレゼンテーション

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

補足 中学で学習したフレミング左手の法則 ( 電 磁 力 ) と関連付けると覚えやすい 電磁力は電流と磁界の外積で表される 力 F 磁 電磁力 F li 右ねじの回転の向き電 li ( l は導線の長さ ) 補足 有向線分とベクトル有向線分 : 矢印の位

memo

Microsoft Word - 13

プログラミングI第10回

memo

論理と計算(2)

Prog1_10th

memo

Microsoft PowerPoint ppt

コンピュータグラフィックス第8回

レッスン15  行列とグラフ

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

コンピュータグラフィックス第6回

グラフの探索 JAVA での実装

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Chap3.key

PowerPoint Template

Microsoft Word - no15.docx

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

Taro-リストⅢ(公開版).jtd

PowerPoint プレゼンテーション

卒論発表

Microsoft Word ã‡»ã…«ã‡ªã…¼ã…‹ã…žã…‹ã…³ã†¨åłºæœ›å•¤(佒芤喋çfl�)

Microsoft PowerPoint - 6.pptx

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

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

人工知能入門

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

同期 - Synchronization

プログラミング基礎

PowerPoint Presentation

Microsoft PowerPoint - 9.pptx

フィルタとは

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

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

kiso2-09.key

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

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

问题集 ITEXAMPASS 1 年で無料進級することに提供する

Microsoft Word - 2.IJCAD Electrical 基本マニュアル.doc

第9回 配列(array)型の変数

デジタル表現論・第4回

Microsoft PowerPoint - kougi9.ppt

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

<4D F736F F F696E74202D2091E6824F82538FCD8CEB82E88C9F8F6F814592F990B382CC8CB4979D82BB82CC82505F D E95848D8682CC90B69

線形代数とは

2-1 / 語問題 項書換え系 4.0. 準備 (3.1. 項 代入 等価性 ) 定義 3.1.1: - シグネチャ (signature): 関数記号の集合 (Σ と書く ) - それぞれの関数記号は アリティ (arity) と呼ばれる自然数が定められている - Σ (n) : アリ

情報処理概論(第二日目)

基礎プログラミング2015

Transcription:

無向グラフと有向グラフ 無向グラフ G=(V, E) 頂点集合 V 頂点の対を表す枝の集合 E e=(u,v) 頂点 u, v は枝 e の端点 f c 0 a 1 e b d 有向グラフ G=(V, E) 頂点集合 V 頂点の順序対を表す枝の集合 E e=(u,v) 頂点 uは枝 eの始点頂点 vは枝 eの終点 f c 0 a 1 e b d

グラフのデータ構造 グラフ G=(V, E) を表現するデータ構造 接続行列 --- 領域計算量 O(mn) 隣接行列 --- 領域計算量 O(n ) 次元配列を使う 実現は簡単 疎なグラフに対して無駄が多い 隣接リスト --- 領域計算量 O(m+n) 複数の連結リストを使う 実現は少し複雑 どのグラフに対しても無駄がない m: 枝の数 n: 頂点の数

無向グラフの接続行列 行列の行 頂点集合, 列 枝集合 頂点 u は枝 e の 端点である (u, e) の要素 =1 端点ではない (u, e) の要素 =0 a b c d e f 0 1 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 0 0 1 行列の各列に 1 はちょうど 個 に対応 f c a 0 1 e b d 領域計算量 = 行列の大きさ =O(mn)

有向グラフの接続行列 行列の行 頂点集合, 列 枝集合 頂点 u は枝 e の 始点である (u, e) の要素 =1 終点である (u, e) の要素 = ー 1 端点ではない (u, e) の要素 =0 a b c d e f 0 1-1 1 0 0 0 1-1 0 0 1 0 0 0 1 0-1 -1 0 0 0-1 0 1 1 0 0 0 0 0-1 に対応 f c a 0 1 e b d 領域計算量 = 行列の大きさ =O(mn)

無向グラフの隣接行列 行列の 行, 列 頂点集合に対応 頂点 u, v の間に枝が 存在している (u, v) の要素 =1 存在していない (u, v) の要素 =0 0 1 0 0 1 1 1 0 1 1 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 の数 =m 個 f c a 0 1 e b d 領域計算量 = 行列の大きさ =O(n )

有向グラフの隣接行列 行列の 行, 列 頂点集合に対応 頂点 u から v に向かう枝が 存在している (u, v) の要素 =1 存在していない (u, v) の要素 =0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 の数 =m 個 f c a 0 1 e b d 領域計算量 = 行列の大きさ =O(n )

各頂点に対し, 接続する枝を連結リストで表現 ( 双方向リストを使ってもよい ) 0 1 無向グラフの隣接リスト (0,1) (0,) (0,) null (1,0) (1,) null (,0) (,1) (,) null (,0) (,) (,) null (,) null セルの数 =m 個 f c a 0 1 領域計算量 =O( リストの数 )+O( リストのセルの数 ) =O(m+n) 最適な領域計算量 e b d

有向グラフの隣接リスト 各頂点に対し, その頂点から出る枝を連結リストで表現 ( 双方向リストを使ってもよい ) 0 1 null (0,1) (0,) null (1,) null (,0) null (,) (,) null セルの数 =m 個 a 0 1 領域計算量 =O( リストの数 )+O( リストのセルの数 ) =O(m+n) 最適な領域計算量 f c e b d

最小木問題 (p.) minimum spanning tree problem 入力 : 無向グラフ G=(V,E), 各枝の長さ d(e) (e E) 5 1

最小木問題 (p.) 入力 : 無向グラフ G=(V,E), 各枝の長さ d(e) (e E) 出力 :Gの最小木(Gの全域木で, 枝の長さの和が最小のもの ) 1 5 全域木ではない! 閉路が存在

最小木問題 (p.) 入力 : 無向グラフ G=(V,E), 各枝の長さ d(e) (e E) 出力 :Gの最小木(Gの全域木で, 枝の長さの和が最小のもの ) 5 1 全域木ではない! 連結でない ( グラフがつながっていない )

最小木問題 (p.) 入力 : 無向グラフ G=(V,E), 各枝の長さ d(e) (e E) 出力 :Gの最小木(Gの全域木で, 枝の長さの和が最小のもの ) 5 1 全域木であるが, 最小木でない ( 長さの和 =19)

最小木問題 (p.) 入力 : 無向グラフ G=(V,E), 各枝の長さ d(e) (e E) 出力 :Gの最小木(Gの全域木で, 枝の長さの和が最小のもの ) 5 1 全域木であり, 最小木である ( 長さの和 =1)

最小木を求めるアルゴリズム クラスカルのアルゴリズム 長さの短い順に枝を加える 閉路が出来ないようにするため, 同じ連結成分を結ぶ枝は除外 プリムのアルゴリズム ( 次回の講義 ) 適当な頂点 s を決める 頂点 s を含む連結成分 P と,P に含まれない頂点を結ぶ枝の中で長さ最小のものを繰り返し加える

グラフの連結成分 グラフの連結成分 = 枝で結ばれている頂点の集合 連結成分

グラフの連結成分 グラフの連結成分 = 枝で結ばれている頂点の集合 同じ連結成分に含まれる頂点を枝で結ぶ 閉路が出来る

グラフの連結成分 グラフの連結成分 = 枝で結ばれている頂点の集合 異なる連結成分に含まれる頂点を枝で結ぶ 閉路は出来ない 異なる連結成分を結ぶ枝を繰り返し加えていく 全域木が得られる

クラスカルのアルゴリズム (p.11) 長さの短い順に枝を加える ただし, 同じ連結成分を結ぶ枝は除外 入力の無向グラフ アルゴリズムの動き T= 空集合 からスタート 7 1 9 7 1 9 17 15 16 8 17 15 16 8

クラスカルのアルゴリズム (p.11) 長さの短い順に枝を加える ただし, 同じ連結成分を結ぶ枝は除外 入力の無向グラフ アルゴリズムの動き 長さの短い枝を順に加える 7 1 9 7 1 9 17 15 16 8 17 15 16 8

クラスカルのアルゴリズム (p.11) 長さの短い順に枝を加える ただし, 同じ連結成分を結ぶ枝は除外 入力の無向グラフ アルゴリズムの動き 長さの短い枝を順に加える 7 1 9 7 1 9 17 15 16 8 17 15 16 8

クラスカルのアルゴリズム (p.11) 長さの短い順に枝を加える ただし, 同じ連結成分を結ぶ枝は除外 入力の無向グラフ アルゴリズムの動き 長さの短い枝を順に加える 7 1 9 7 1 9 17 15 16 8 17 15 16 8

クラスカルのアルゴリズム (p.11) 長さの短い順に枝を加える ただし, 同じ連結成分を結ぶ枝は除外 入力の無向グラフ 7 1 9 アルゴリズムの動き 7 1 同じ連結成分を結ぶ枝は除外 9 17 15 16 8 17 15 16 8

クラスカルのアルゴリズム (p.11) 長さの短い順に枝を加える ただし, 同じ連結成分を結ぶ枝は除外 入力の無向グラフ アルゴリズムの動き 長さの短い枝を順に加える 7 1 9 7 1 9 17 15 16 8 17 15 16 8

クラスカルのアルゴリズム (p.11) 長さの短い順に枝を加える ただし, 同じ連結成分を結ぶ枝は除外 入力の無向グラフ 7 1 9 アルゴリズムの動き 7 1 同じ連結成分を結ぶ枝は除外 9 17 15 16 8 17 15 16 8

クラスカルのアルゴリズム (p.11) 長さの短い順に枝を加える ただし, 同じ連結成分を結ぶ枝は除外 入力の無向グラフ 7 1 9 アルゴリズムの動き 7 9 アルゴリズム終了最小木が得られた 17 15 16 8 15 8

クラスカルのアルゴリズムの計算時間 アルゴリズムの実装方法 枝を長さの短い順にソート --- O(m log m) = O(m log n) 1 7 17 7 1 1 15 16 9 5 8 5 8 1 5 9 5 1 5 15 16 17

クラスカルのアルゴリズムの計算時間 アルゴリズムの実装方法 17 枝を長さの短い順にソート --- O(m log m) = O(m log n) 各枝の両端の節点が同じ連結成分に含まれるか否かチェック. 同じ連結成分 枝を除去 異なる連結成分 枝を加える 7 1 1 15 16 9 5 8 {1}, {}, {}, {5}, {} {1, }, {}, {5}, {} {1, }, {, 5}, {} {1,,, 5}, {} {1,,, 5}, {} {1,,, 5, } {1,,, 5, } 1 7 5 8 1 5 9 5 1 5 15 16 17

クラスカルのアルゴリズムの計算時間 アルゴリズムの実装方法 17 枝を長さの短い順にソート --- O(m log m) = O(m log n) 各枝の両端の節点が同じ連結成分に含まれるか否かチェック. 同じ連結成分 枝を除去 異なる連結成分 枝を加える 7 1 1 15 16 9 5 8 注意! 枝を加える度に連結成分は変化する 集合族の併合のためのデータ構造を利用する 1 7 5 8 1 5 9 5 1 5 15 16 17

集合族の併合のためのデータ構造 互いに素な複数の集合を繰り返し併合 (merge) するプロセスを考える {1}, {}, {}, {5}, {} {1, }, {}, {5}, {} {1, }, {, 5}, {} {1,,, 5}, {} {1,,, 5, }

集合族の併合 集合族 S 1, S,, S t に対する つの操作 MERGE(S i, S k ): 集合 S i と S k を併合, 名前を S i もしくは S k とする FIND(x): 要素 x を含む集合の名前を返す MERGE(S 1, S ) {S 1 : 1}, {S : }, {S : }, {S 5 : 5}, {S : } FIND(5)=S 5 MERGE(S, S 5 ) {S 1 : 1, }, {S : }, {S 5 : 5}, {S : } MERGE(S 1, S ) {S 1 : 1, }, {S :, 5}, {S : } FIND(5)=S 5 MERGE(S 1, S ) {S 1 : 1,,, 5}, {S : } {S 1 : 1,,, 5, } FIND(5)=S FIND(5)=S 1

集合族の併合 : クラスカルのアルゴリ ズムの場合 集合族 S 1, S,, S t に対する つの操作 MERGE(S i, S k ): 集合 S i と S k を併合, 名前を S i もしくは S k とする FIND(x): 要素 x を含む集合の名前を返す クラスカルのアルゴリズムでは... MERGE(S i, S k ): 枝を追加 連結成分を併合 n-1 回繰り返す (n = グラフの節点数 ) FIND(x): 現在の枝 (u, v) に対し, 両端点が同じ連結成分に含まれる FIND(u) = FIND(v) m 回繰り返す (m= グラフの枝数 )

集合族の併合のデータ構造 : 配列に よる簡単な実現 全要素数 N の大きさの配列 set_name を使う 要素 j に対し set_name[j] = (j を含む集合の名前 ) と定義要素名 1 5 {S 1 : 1, }, {S : }, {S 5 : 5}, {S : } set_name 1 1 5 MERGE(S, S 5 ) {S 1 : 1, }, {S :, 5}, {S : } MERGE のとき,set_name の全ての値を調べる必要あり 1 回の MERGE につき O(N) 時間 1 回の FIND は O(1) 時間 要素名 1 5 set_name 1 1 set_name[j]=5 ならば set_name[j]= と置き換える

クラスカルのアルゴリズムの計算時間 ( その 1) アルゴリズムの実装方法 枝を長さの短い順にソート --- O(m log m) = O(m log n) 各枝の両端の節点が同じ連結成分に含まれるか否かチェック. 同じ連結成分 枝を除去 異なる連結成分 枝を加える集合族の併合のデータ構造として配列を使用 : FIND の回数 :m 回 --- O(m) 時間 MERGE の回数 : n-1 回 --- O(n ) 時間 クラスカルのアルゴリズムの計算時間 = O(m log n+ m + n ) = O(m log n + n ) 集合族の併合のデータ構造を改良すると, 計算時間を改善できる 来週

集合族の併合のデータ構造 : 配列 + リストによる実現 配列 set_name に加え, 各集合をリストで表現 {S 0 : 0,,, 5}, {S 1 : 1}, {S :, 6} 要素名 0 1 5 6 set_name 0 1 0 0 0 集合の名前 集合の大きさ 先頭要素へのポインタ S 0 S 1 1 S 0 NULL S 5 0 1 6

集合族の併合のデータ構造 : 配列 + リストによる実現 S 1 と S を併合し, 名前を S とするときの実行例 {S 0 : 0,,, 5}, {S 1 : 1}, {S :, 6} 1S 1 の各要素の set_name を変更, S 1, S の大きさを変更計算時間 : O( S 1 ) 集合の名前 集合の大きさ 要素名 0 1 5 6 set_name 0 1 0 0 0 先頭要素へのポインタ S 0 S 1 1 0 S 0 NULL S 5 0 1 6

集合族の併合のデータ構造 : 配列 + リストによる実現 S 1 と S を併合し, 名前を S とするときの実行例 {S 0 : 0,,, 5}, {S 1 : 1}, {S :, 6} S 1, S のポインタの付け替え計算時間 : O( S 1 ) 集合の名前 集合の大きさ 要素名 0 1 5 6 set_name 0 0 0 0 先頭要素へのポインタ S 0 S 1 0 NULL S 0 NULL S (1) S1 の最後の要素から S の先頭へポインタを張る () S1 の先頭要素を S の先頭にする 5 0 1 6

集合族の併合のデータ構造 : 配列 + リストによる実現 併合 1 回の計算時間 =O( 併合される集合の大きさ ) 何も工夫しないと,N 回の併合では最悪 O(N ) 時間 FIND は1 回あたりO(1) 時間 併合の工夫 : 常に大きい集合に小さい集合を併合 N 回の併合で O(N log N) 時間 {S 0 : 0,,, 5}, {S :, 6} {S 0 : 0,,, 5,, 6} {S : 0,,, 5,, 6}

クラスカルのアルゴリズムの計算時間 アルゴリズムの実装方法 枝を長さの短い順にソート --- O(m log m) = O(m log n) 各枝の両端の節点が同じ連結成分に含まれるか否かチェック. 同じ連結成分 枝を除去 異なる連結成分 枝を加える FINDの回数 :m 回 --- O(m) 時間 MERGEの回数 : n-1 回 --- O(n log n) 時間 クラスカルのアルゴリズムの計算時間 =O(m log n)

レポート問題 問 1: 左下の行列はある無向グラフの隣接行列を表す. (1) この隣接行列が表す無向グラフを書きなさい. () この無向グラフに対する接続行列, および隣接リストを書きなさい. () このグラフの最小木をクラスカルのアルゴリズムによって求めなさい. 計算の過程についても省略せずに書くこと. なお, 各枝の重みは右下の行列によって与えられる. 0 1 5 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 0 0 1 1 0 1 0 0 1 5 0 1 1 1 1 0 0 1 5 0 5 9 1 7 1 8 6 10 1 5

レポート問題 (1) 無向グラフの 頂点 u, v が与えられたとき, 枝 (u,v) が存在するか否かを判定したい. 接続行列, 隣接行列, 隣接リスト ( 連結リストの場合 ) のそれぞれを使った場合のアルゴリズムと時間計算量と説明せよ. () 頂点 u が与えられたとき,u に接続する枝をすべて求めたい. 接続行列, 隣接行列, 隣接リスト ( 連結リストの場合 ) のそれぞれを使った場合のアルゴリズムと時間計算量と説明せよ.