1 アルゴリズム と データ構造 基本情報技術概論 I ( 第 12 回 ) 埼玉大学 理工学研究科 堀山 貴史
2 午後の問題への対応 長文にメゲない 読み飛ばしは、思いこみ違いの原因 色々なアルゴリズムを知っておく 暗記ではなく、アイデアを把握 アイデアを実現する手順を考える
文字列処理 3 暗記ではなく、考え方の練 習
文字列探索 ABCDXYEFXYZGHIJ R [ ] S [ ] …M 配列の サイズ M N XYZXYZ i = 1 比較開始位置 i = M – N + 1 XYZ 検索文字列 S を、 文字列 R から検 索 i > ( M – N + 1) 処理 ※ テキストでは、 終了条件を記載 for ( i = 1 ; i ≦ M – N + 1 ; ++ i ) { } 処理 4
5 文字列探索 ABC DXYEFXYZGHIJ R [ ] S [ ] 配列の サイズ M N XYZ j = 1 … N 比較位置 検索文字列 S を、 文字列 R から検 索 for ( i = 1 ; i ≦ M – N + 1 ; ++ i ) { } 処理 for ( j = 1 ; j ≦ N ; ++ j ) { if ( R[ i + j – 1 ] ≠ S[ j ] ) { break ; } } if ( j > N ) { P ← i ; break ; } // 見つけた i
6 参考: 文字列検索アルゴリズ ム 力まかせ法 (p. 4, 5 の方法 ) O( n m ) KMP 法 (Knuth-Morris-Pratt) O( n + m ) BM 法 (Boyer-Moore) O( n + m ) n : テキストの長さ m : 検索文字列の長 さ ( p. 4, 5 では M ) ( 〃 N )
空白除去 7 ABCDEFXYZ R [ ] …N 配列の サイズ N N ABCDEFXYZ S [ ] i j j = 1 for ( i = 1 ; i ≦ N ; ++ i ) { } if ( R[ i ] ≠ “ 空白 ” ) { S[ j ] = R[ i ] ; // S[ ] にコピー ++ j ; } ※ テキストより簡 単
文字列挿入 8 ABCDEFGH R [ ] 1234P…M ABCDEFGH 挿入後 1…N 文字列 R の P の位置に、 文字列 S を挿入 (1)R [ ] の P 以降を ずら す (2)S [ ] を 挿入 S [ ] for ( i = M ; i ≧ P ; -- i ) { } R [ i + N ] = R [ i ] ; // 後ろからずら す for ( j = 1 ; j ≦ N ; ++ j ) { } R [ P + j - 1 ] = S [ j ] ; XYZ
9 文字列処理 ( その他 ) 文字列連結 R [ ] , S [ ] の順に、文字列を T [ ] にコ ピー 文字列置換 R [ P ] , R [ P + 1 ] , … に、 文字列 S [ ] をコピー R [ ] S [ ] T [ ] R [ ] S [ ]
最短経路問題 10 応用: 列車の乗り換え検索 カーナビのルート検索
11 最短経路問題 ( 入力 ) 有向グラフ G = ( V, E ) , 辺の距離 c : E → N 始点 s , 終点 t 始点 1 , 終点 5
12 s に近い順に、節点への距離を確定させていく 始点 1 , 終点 5 Dijkstra のアルゴリズム ( アイデ ア ) ダイクストラ
13 Dijkstra のアルゴリズ ム 1.( 初期化 ) s から節点 v への距離 D [ s ] ← 0 D [ v ] ← ∞ (s 以外の節点 ) 始点 1 , 終点 5 ∞ ∞ ∞ ∞ 0
14 2.u ← 未確定の節点で、 s からの距離が最小の も の (s からの距離 D [ u ] が確定 ) 始点 1 , 終点 5 ∞ ∞ ∞ Dijkstra のアルゴリズ ム ∞ 0 ※ 最初は、全節点が未確 定
15 3.u に隣接するすべての節点 v に対し、 D [ v ] を更 新 D [ v ] ← min { D [ v ] , D [ u ] + c ( ( u, v ) ) } 始点 1 , 終点 5 ∞ ∞ ∞ s … → u → v Dijkstra のアルゴリズ ム 0 ∞
16 1.( 初期化 ) s から節点 v への距離 D [ s ] ← 0 D [ v ] ← ∞ (s 以外の節点 ) 2.u ← 未確定の節点で、 s からの距離が最小の も の (s からの距離 D [ u ] が確定 ) 3.u に隣接するすべての節点 v に対し、 D [ v ] を更 新 D [ v ] ← min { D [ v ] , D [ u ] + c ( ( u, v ) ) } 4. すべての節点が確定するまで、 2 , 3 を繰り返 す Dijkstra のアルゴリズム ( まと め ) 他の初期化 方法もある 更新時に、 u を覚えると、最短経路を求めら れる
17 続きを、自分でやってみてください Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
18 2.u ← 未確定の節点で、 s からの距離が最小の も の (s からの距離 D [ u ] が確定 ) Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
19 3.u に隣接するすべての節点 v に対し、 D [ v ] を更 新 D [ v ] ← min { D [ v ] , D [ u ] + c ( ( u, v ) ) } Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
20 2.u ← 未確定の節点で、 s からの距離が最小の も の (s からの距離 D [ u ] が確定 ) Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
21 3.u に隣接するすべての節点 v に対し、 D [ v ] を更 新 D [ v ] ← min { D [ v ] , D [ u ] + c ( ( u, v ) ) } Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
22 2.u ← 未確定の節点で、 s からの距離が最小の も の (s からの距離 D [ u ] が確定 ) Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
23 3.u に隣接するすべての節点 v に対し、 D [ v ] を更 新 D [ v ] ← min { D [ v ] , D [ u ] + c ( ( u, v ) ) } Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
24 2.u ← 未確定の節点で、 s からの距離が最小の も の (s からの距離 D [ u ] が確定 ) Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
25 3.u に隣接するすべての節点 v に対し、 D [ v ] を更 新 D [ v ] ← min { D [ v ] , D [ u ] + c ( ( u, v ) ) } Dijkstra のアルゴリズ ム 始点 1 , 終点 5 ∞ ∞ ∞ 0 ∞
26
27
この教材のご利用について この教材は、以下に示す利用条件の下で、著作権者にわざわざ許 諾を求めることなく、無償で自由にご利用いただけます。講義、 自主学習はもちろん、翻訳、改変、再配布等を含めて自由にご利 用ください。 非商業利用に限定 この教材は、翻訳や改変等を加えたものも含めて、著作権者 の許諾を受けずに商業目的で利用することは、許可されてい ません。 著作権の帰属 この教材および教材中の図の著作権は、次ページ以降に示す 著作者に帰属します。この教材、または翻訳や改変等を加え たものを公開される場合には、「本教材 (or 本資料 ) は saitama-u.ac.jp/horiyama/OCW/ の教材です (or 教材を改変したものです」 との旨の著作権表示を明確に 実施してください。なお、この教材に改変等を加えたものの 著作権は、次ページ以降に示す著作者および改変等を加えた 方に帰属します。 同一条件での頒布・再頒布 この教材、または翻訳や改変等を加えたものを頒布・再頒布 する場合には、頒布・再頒布の形態を問わず、このページの 利用条件に準拠して無償で自由に利用できるようにしてくだ さい。 28 この文面は、 TOKYO TECH OCW の利用 条件を参考にしまし た
配布場所 この powerpoint ファイルの著作者 堀山 貴史 改変等を加えられた場合は、お名前等を追加してください 図の著作者 p. 4 ~ 25 堀山 貴史 29 この教材のご利用について