文字列探索

Similar documents
Microsoft PowerPoint - アルデIII 10回目12月09日


情報処理Ⅰ

データ構造

データ構造

人工知能入門

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

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

基礎計算機演習 実習課題No6

ポインタ変数

文字列操作と正規表現

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

Microsoft PowerPoint - 05.pptx

memo

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

Microsoft PowerPoint - 5Chap15.ppt

ポインタ変数

簡単な検索と整列(ソート)

Prog1_6th

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

PowerPoint プレゼンテーション

Java プログラミング Ⅰ 11 回目多次元配列 2 次元配列 2 次元配列配列要素が直線上に並ぶ一次元配列に対して 平面上に並ぶ配列要素をもつ配列 直観的には 2 次元配列の準備配列変数の宣言は型と識別子を指定して次のように行う 型識別子 [ ][ ]; または 型 [ ][ ] 識別子 ; 配

基礎プログラミング2015

Taro-最大値探索法の開発(公開版

PowerPoint Presentation

PG13-6S

intra-mart Accel Platform — IM-共通マスタ スマートフォン拡張プログラミングガイド   初版  

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

intra-mart Accel Platform

第12回 モナドパーサ

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

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

Java講座

Datalink_summary

A Constructive Approach to Gene Expression Dynamics

sinfI2005_VBA.doc

02: 変数と標準入出力

プログラミング実習I

Brekeke PBX - Version 2.1 ARSプラグイン開発ガイド

program7app.ppt

Microsoft PowerPoint - kougi6.ppt

プログラミング入門1

Microsoft PowerPoint - ad11-09.pptx

Prog1_10th

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

02: 変数と標準入出力

JavaプログラミングⅠ

講習No.9

memo

プログラミング基礎

PowerPoint プレゼンテーション

長崎大学大学院生産科学研究科(博士前期課程)

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

スライド 1

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

メソッドのまとめ

Java 基礎問題ドリル ~ メソッドを理解する ~ 次のプログラムコードに 各設問の条件にあうメソッドを追加しなさい その後 そのメソッドが正しく動作することを検証するためのプログラムコードを main メソッドの中に追加しなさい public class Practice { // ここに各設問

Microsoft PowerPoint - lecture02.pptx

Microsoft PowerPoint - w5.pptx

2006年10月5日(木)実施

2002.N.x.h.L g9/20

編集する ファイルを開く マイクロデータの設定を行うファイルまたはファイルを開きます 開かれたファイルは編集画面に表示されて ブラウザ表示した時のプレビューも同時に表示されます HTML ファイルの選択 編集する ファイルを開くためにメインメニューから ファイル 開く を選びます ファイル選択ダイア

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

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

Microsoft Word - Cプログラミング演習(9)

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

[Problem D] ぐらぐら 一般に n 個の物体があり i 番目の物体の重心の x 座標を x i, 重さを w i とすると 全体の n 重心の x 座標と重さ w は x = ( x w ) / w, w = w となる i= 1 i i n i= 1 i 良さそうな方法は思いつかなかった

PowerPoint Presentation

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

2) データの追加 一番下の行までスクロールしていき * のある行をクリックすると 新しいデータを入力できます その他の方法 Access では様々な使い方が用意されています その一例としては 右クリックを使用する方法もあります 画面の左端の部分にマウスを持っていくと が表示されます の上でクリック

Prog1_12th

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

cp-7. 配列

MS-ExcelVBA 基礎 (Visual Basic for Application)

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

Excel データ出力ガイドブック 第 1.0 版平成 30 年 9 月 1 日制定 株式会社中電シーティーアイ

Microsoft PowerPoint - prog03.ppt

アプリケーション インスペクションの特別なアクション(インスペクション ポリシー マップ)

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

フローチャートの書き方

Xperia™ XZ ユーザーガイド

Microsoft PowerPoint - 説柔5_間勊+C_guide5ï¼›2015ã•’2015æŒ°æŁŽæš’å¯¾å¿œç¢ºèª“æ¸‹ã†¿ã•‚.pptx

内容 MD00Manager とは?... MD00Manager をインストールする.... ソフトのインストール... MD00Manager の使い方.... 起動をする... 機能説明...7 機能説明 ( メニューバー )...8 機能説明 ( ステータスバー )...8 機能説明 ( コ

このルールをそのまま正規表現として書くと 下記のようになります ^A[0-9]{2}00[0-9]{3}([0-9]{2})?$ ちょっと難しく見えるかもしれませんが 下記のような対応になっています 最初 固定 年度 固定 通番 ( 枝番 ) 最後 ルール "A" 数字 2 桁 0 を 2 桁 数字

目次 第 1 章楽天 SEO 君について 1-1 主な機能 1-2 利用できる動作環境 1-3 ソフト内容 P4 第 2 章楽天 SEO 君の初期設定と楽天 item のインポート P6 2-1 楽天 SEO 君の起動 2-2 楽天アカウントと店舗名の入力 2-3 カテゴリ別ディレクトリ ID とタ

Microsoft PowerPoint - DA2_2018.pptx

デジタル表現論・第4回


第 3 回情報基礎演習 UNIX / Linux: ファイルシステム シェルを理解しよう! 谷口貴志 Panda に login し 情報基礎演習クラスの VDI から Ubuntu に接続し Linux に login した後, 左 上の Activity 端末のアイオン をクリック 端末 を立ち

Calendar Plus JavaScript API リファレンス ラジカルブリッジ Ver

データ構造

<4D F736F F D208BD98B7D D B838B835A DD92E8834B C52E646F63>

Microsoft PowerPoint - ruby_instruction.ppt

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

Microsoft PowerPoint - ppt-7.pptx

電話機のリセットと再起動

PowerPoint Presentation

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

Javaによるアルゴリズムとデータ構造

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

Transcription:

文字列探索 平成 23 年 12 月 2 日 アルゴリズム論 9 回目

文字列探索 データベース ( 構造化データ ) キーを指定 そのキーを持つレコード検索 テキスト ( 非構造データ ) 検索したい文字の並び (string): パターン探査される文字列を含む情報 : テキスト 腕ずくの方法 KMP(Knuth-Morris-Pratt) 法 BM(Boyer-Moore) 法

腕ずくの方法 Patten a c 照合失敗 Text a b a c d Pattern a c 照合失敗 Text a b a c d Pattern a c 照合成功 Text a b a c d

腕ずくの方法 1 パターンをテキストの先頭に合わせる 2 パターンとテキストを照合一致 探索の成功不一致 パターンを 1 文字ずらす,2 へ 3 上記手順を繰り返し, パターンがテキスト末尾に来れば不一致と判断 探索の失敗

文字列照合の例 text: pattern: M abcabababccbacabcabb ->t[0-19] N ababc ababc -> p[0-4] oox ababc x ababc x ababc oooox ababc x ababc ooooo -> t[5] 照合に成功したらtext 先頭位置を返す

腕ずくの文字列照合フローチャート text から pattern を探索する text, pattern は文字型配列 M:text の文字列長 N :pattern の文字列長出力 ( 戻り値 ) は pattern が含まれる場合 text の先頭位置, 含まれない場合 -1 を返す ( 文字列型配列要素添え字 ) 照合成功時は text と pattern を同時に右へ 1 シフト start i=0 j=0 =/ text[i+j]:pattern[j] = j=j+1 i: 比較している text 文字型配列要素添え字 j: 比較している pattern 文字型配列要素添え N i=i+1 M 照合失敗時は text のみを右へ 1 シフト pattern はリセットして先頭へ戻す < pattern の文字列をすべて調べたか? j:n >= return=i <= i:m-n 探索終了条件 > return=-1 return を返す

腕ずくの方法の計算量 テキスト :aaaa.aaa (100 文字 ) パターン :aaaaab(6 文字 ) 1 の回数 ( 先頭文字に合わせる回数 )? 2 の回数 ( 照合回数 )? よって, 文字比較回数は? 100-6+1=95 6 6x95=570 テキスト 1000 文字,10000 文字の場合は? よってオーダーは? 単純ソートと比較すると?

腕ずくの方法の計算量 テキスト :n 文字, パターン m 文字 最大計算量テキスト :aaaaaaaaaaaaaaaaaaaaaaaaab パターン :aaaab 1 の回数 ( 先頭文字に合わせる回数 ):(n-m+1) 2 の回数 ( 照合回数 ):m よって, 文字比較回数は m(n-m+1) テキスト長 n>> パターン長 m なので, n-m+1 nearly= n O(mn) nearly = O(n)

KMP( クヌース, モーリス, プラット ) 法 腕ずくの方法 照合失敗時に毎回右へ 1 シフト 失敗状況に合わせてジャンプできる筈 失敗関数の導入パターン u-1 番目の文字まで一致, u 番目の文字で不一致が発生した時の移動量 ( パターンを何文字右へ移動すべきか ) を調べて表にしておく

KMP 法, 失敗関数の作成 パターン :tartar, テキスト :????? 4 文字目で失敗 tartar, tarb???? tartar パターンを 4 文字分ずらして, パターンの 1 文字目から比較 5 文字目で失敗 tartar, tart????? パターンを 5 文字分ずらして, パターンの 1 文字目から比較 6 文字目で失敗 tartar, tarta??? パターンを 6 文字分ずらして, パターンの 1 文字目から比較

KMP 法の適用例 text: pattern: abcabababccbacabcabb ->t[0-19] ababc -> p[0-4] 上記を KMP 法により照合せよ. KMP 法は, 文字列前半が一致, 後半が不一致の場合に効果が現れるが, 実際は, 不一致が多く発生しており効果が小さく, 腕ずくの方法より遅いこともあり, 実際にはあまり利用されていない.

BM (Boyer-Moore) 法 テキスト文字列の最後から照合し不一致文字に注目 一致ではなく, 不一致の状況に合わせて, ずらす量を決める ( ケース1:dはパターンにないので3ずらす ) パターン : abc abc テキスト : abdefgh abdefgh ( ケース2:aはパターン1 文字目にあるので2ずらす ) パターン : abc abc テキスト : abaabcd abaabcd

BM 法 (2) ( ケース 3:z はパターンにないので 5 ずらすと駄目. 注目点 z を 5 ずらしてそこを最終文字列とする (3 ずらす )) パターン : abcab abcab テキスト : xyzabcabcde xyzabcabcde ( ケース 4:a は 2 回目出現のパターン 4 文字目にあるので 1 ずらす ) パターン : abcab abcab テキスト : aabcabcabc aabcabcabc

BM 法の改良 テキスト :xabcxabcx xoo パターン :xbacx bはパターンに含まれるので最右のbまで1 文字ずらす. でも末尾 cxで終わらないから,cxのある箇所まで3 文字ずらす.

例題 (1) TOKKYOKYOKAKYOKU ( テキスト ) KYOKU ( パターン ) (Y はパターンに含まれているので そこまで 3 文字ずらす ) TOKKYOKYOKAKYOKU KYOKU (Y はパターンに含まれているので そこまで 3 文字ずらす ) TOKKYOKYOKAKYOKU KYOKU (A はパターンに含まれていないので そこを超えて 5 文字ずらす ) TOKKYOKYOKAKYOKU KYOKU ( 照合成功 )

例題 (2) TOKKYOKYOKAKYOKU ( テキスト ) KYOKU ( パターン ) 移動量 ( パターンの末尾文字の照合時 ) K 1 Y 3 O 2 U 0 Others 5 上記の表は不完全 末尾でなければ補正必要 末尾から 2 文字目で不一致が検出されれば ( 移動量ー 1) が移動量となる

バックトラック

バックトラック DFS であるパスをそれ以上深く辿れない時, 一つ前の状態に戻って別のパスを辿る この操作をバックトラック ( 後戻り ) と呼ぶ 8 クィーン問題チェス盤面で, お互いの利き筋 ( 縦, 横, 斜め ) にのらないように 8 個のクィーンを配置する問題.92 通りの解がある. バックトラックの代表的適用問題. http://web.hc.keio.ac.jp/~fujimura/index.html

Q http://www.kawa.net/works/js/8queens/nqueens.html

Q Q Q Q Q

8 クイーンの出力例 q[0]-q[7] まで DFS でサーチする Put-Q(x): クィーンの置ける位置 =q[x] の値を決める. 初期値 q[x]=0 増分 1 (q[x]=q[x]+1) 終了条件 q[x]<=8 Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q (a) 一次元配列 q[0]-q[7] でクィーンの配置を記述する. 添え字を列に対応させる. 左図は [0,4,7,5,2,6,1,3]. 右図は? (b)

バックトラッキングの様子深さ優先探索 PUT-Q(0) PUT-Q(1) PUT-Q(2) PUT-Q(3) PUT-Q(4) PUT-Q(5) q[x]= 0 1 2 3 4 5 6 7

0 Q 0 1 2 3 4 5 6 7 1 Q x 2 Q 3 Q x 4 Q 5 6 Q 7 Q x q[0]-q[7] まで DFS でサーチする Put-Q(x): クィーンの置ける位置 =q[x] の値を決める. 初期値 q[x]=0 増分 1 (q[x]=q[x]+1) 終了条件 q[x]<=8 Q Q Q Q Q Q Q Q (a) 1 番目の解

変更 左から右へ 上から下へ 置ける場所を探す ある行に置けたら その右の列の上から置ける場所を探す ある列のどこにも置けないと判ったら ひとつ左の列の置ける場所を探す作業を継続する 一番右の列で置ける場所が見つかったら 一丁あがり さらに他の解も探すのであれば ひとつ下の行の続きを探す 一番左の列の置ける位置を全部調べ終わるまで続ける

解が見つかったあとのバックトラッキングの様子強制バックトラックによる全解探査 PUT-Q(6) PUT-Q(7) q[x]= 0 1 2 クイーンの配置を表示 3 4 5 6 7

8 クィーンメインルーチン 開始 PUT-Q(0) 終了

PUT-Q(x) q[x] 0 c CHK-Q(x,q[x]) クィーンの置ける位置 =q[x] の値を決める. false true = PUT-Q(x+1) q[x] q[x]+1 PRT-Q < 戻る (b)

false < PUT-Q(x) q[x] 0 c CHK-Q(x,q[x]) c X:7 q[x] q[x]+1 戻る true PUT-Q(x+1) q[x]:8 = クィーンの置ける位置 =q[x] の値を決める. PRT-Q (b)

CHK-Q(x,y) i 0 i i+1 利き筋のチェック = = = ret false < ret true ret を返す (a)

CHK-Q(x,y) i 0 q[i]:y i i+1 利き筋のチェック = = = ret false < i:x ret true ret を返す (a)

CHK-Q(x,y) i 0 q[i]:y q[i]:y-x+i q[i]:y+x-i i i+1 利き筋のチェック = = = 行が同じ 横チェック 行 - 列が同じ 右下がりチェック 行 + 列が同じ 右上がりチェック ret false < i:x ret true ret を返す (a)

PRT-Q ループ A i の初期値 0 増分 1 i 8 結果表示のサブルーチン ループ B j の初期値 0 増分 1 j 8 q[j]:i = Q を出力. を出力 ループ B 改行を出力 ループ A 戻る (b)