SlideShare a Scribd company logo
中学3年生向けのプログラミング
ワークショップ用スライド
「文字列照合」
(45分を2回想定)
(Scratchを既習で、プログラミングへの多少の素養ありを想定)
はじめに
「このスライドは,東京⼤学⼯学部電⼦情報⼯学科・電気電⼦⼯
学科の授業である,
アルゴ リズム(https://iis-lab.org/algorithms2020)
の期末レポート課題として制作されたものを ⼀般に公開したも
のになります.本スライドの内容に関して,お気づきの点やさら
に良くす るためのコメントがございましたら,ぜひ本スライド
の制作者にご共有ください.」
文字列照合とは
あるテキスト(文字列)において、探したい文字列が現れる場所
を探し出す。
例
「”ヒカキンセイキンキンヒカセイキン”から”キンキン”の場所を
探す”」
文字列検索、文字列探索などともいう。
力任せ法(しらみつぶしに調べる)
最初から順番に⼀致するテキストか確認していくという、単純で
強引な方法。
テキストがマッチしなかったら、照合する場所を後ろにずらして
いく。
マッチする場所が見つかるか、見つからずに最後までいってし
まった場合は終了。
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
上(照合対象)から下(照合文字列)を探す
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
照合対象の1文字目からマッチ開始
メモ:(照合対象の1文字目から)
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
1文字目がマッチしないので、照合対象の2文字目に移
動する。
メモ:(照合対象の1文字目から)
今まで1文字目からを調べていたがマッチしない
ことが分かったので、次は2文字目に移動する!
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
2文字目からマッチング開始
メモ:(照合対象の2文字目から)
今後ここが変わっていく!
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
1文字目がマッチしないので、照合対象の3文字目に移
動する。
メモ:(照合対象の2文字目から)
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
3文字目からマッチング開始
メモ:(照合対象の3文字目から)
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
1文字目がマッチする。
続いて2文字目がマッチするかを調べる。
メモ:(照合対象の3文字目から)
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
2文字目がマッチする。
続いて3文字目がマッチするかを調べる。
メモ:(照合対象の3文字目から)
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
3文字目がマッチしないので、照合対象の4文字目に移
動する。
メモ:(照合対象の3文字目から)
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
1文字目からマッチング開始。
メモ:(照合対象の4文字目から)
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
この作業を以降進めていくと・・・
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
照合文字列が照合対象の中に存在するなら、いつか見つ
かる。見つかった場合には、その場所を記録する(例え
ば、先頭が7文字目であるなど)
力任せ法をプログラミングする
ここから実際に、力任せ法をプログラミングしていきま
す。
力任せ法をプログラミングする
照合対象と照合文字列が何文字であるかを調べる。
ヒカキンセイキンキンヒカセイキン →16
キンキン →4
力任せ法をプログラミングする
Scratchだと・・・
力任せ法をプログラミングする
照合対象の文字数を調べたことで・・・
「何文字目まで照合する場所をずらして調べればいいの
か」
が分かります。
照合文字列の文字数を調べたことで・・・
「何回連続で文字列がマッチングすればいいのか」
が分かります。
力任せ法をプログラミングする
例えば今回の例では、、、
ヒカキンセイキンキンヒカセイキン →16
キンキン →4
力任せ法をプログラミングする
「16文字目まで照合する場所をずらしたら終わり」
もしくは
「4文字連続でマッチングしたら終わり」
ということがわかります。
力任せ法をプログラミングする
照合対象の何文字目から調べているのかを記録する変数
を作ります。
先ほどのスライドだと・・・
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
1文字目がマッチしないので、照合対象の3文字目に移
動する。
メモ:(照合対象の2文字目から)
ここの部分を記録する変数です!
力任せ法をプログラミングする
照合文字列の何文字目を調べているかを記録する変数を
作ります。
先ほどのスライドだと・・・
力任せ法の例
ヒカキンセイキンキンヒカセイキン
キンキン
1文字目がマッチする。
続いて2文字目がマッチするかを調べる。
メモ:(照合対象の3文字目から)
ここの部分を記録する変数です!
力任せ法をプログラミングする
これらの変数を記録しておくことで、マッチングしな
かった際に、次は照合対象の何文字目からマッチングを
開始すればいいのかが分かります。
また、マッチングした場合に次にマッチングするか調べ
るべき文字がどれかが分かります。
力任せ法をプログラミングする
Scratchだと・・・
最初は両方とも1文字目なので1をいれておきます。
力任せ法をプログラミングする
今ある変数はこの四つです!
力任せ法をプログラミングする
ここから、この四つの変数を用いて、
1.実際にマッチングを調べる部分
2.「マッチングを継続する」もしくは「マッチングして
終了 orマッチングできず最後まで調べて終了」
の二つの要素をコーディングしていきます。
力任せ法をプログラミングする
1.実際にマッチングを調べる部分
を考えていきます。
力任せ法をプログラミングする
行う動作は
①文字が⼀致するのか調べる
②(⼀致した場合)調べ始める文字数目を変えずに、調
べる文字をずらす
②’(⼀致しなかった場合)調べ始める文字数目を変えて、
1文字目から調べる
力任せ法をプログラミングする
①文字が⼀致するのか調べる
“ヒカキンセイキンキンヒカセイキン”の「照合対象何文
字目」と、“キンキン”の「照合文字列何文字目」
が⼀致するかを調べる。
力任せ法をプログラミングする
①文字が⼀致するのか調べる
Scratchだと・・・
力任せ法をプログラミングする
②(⼀致した場合)調べ始める文字数目を変えずに、調
べる文字をずらす
調べる文字をずらすために、
照合対象何文字目と照合文字列何文字目にそれぞれ+1
をする
力任せ法をプログラミングする
②(⼀致した場合)調べ始める文字数目を変えずに、調
べる文字をずらす
Scratchだと・・・
力任せ法をプログラミングする
②’(⼀致しなかった場合)調べ始める文字数目を変えて、
1文字目から調べる
調べ始める文字数目を変えるために、
照合対象何文字目から照合文字列何文字目を引き+1
1文字目から調べるために、
照合文字列何文字目を1に変える
力任せ法をプログラミングする
②’(⼀致しなかった場合)調べ始める文字数目を変えて、
⼀文字目から調べる
Scratchだと・・・
力任せ法をプログラミングする
以上①②②’を組み合わせて、
1.実際にマッチングを調べる部分
が作られます。
力任せ法をプログラミングする
力任せ法をプログラミングする
1.実際にマッチングを調べる部分
2.「マッチングを継続する」もしくは「マッチングして
終了 orマッチングできず最後まで調べて終了」
力任せ法をプログラミングする
2.「マッチングを継続する」もしくは「マッチングして
終了 orマッチングできず最後まで調べて終了」
の要素をコーディングしていきます。
力任せ法をプログラミングする
2.「マッチングを継続する」もしくは「マッチングして
終了 orマッチングできず最後まで調べて終了」
「マッチングを継続する」ための条件を考える前に、
「マッチングして終了orマッチングできず最後まで調べ
て終了」のための条件を考えてみます。
力任せ法をプログラミングする
「マッチングして終了orマッチングできず最後まで調べ
て終了」
・「マッチングして終了」
照合文字列の最後の文字までマッチングが成立
・「マッチングできず最後まで調べて終了」
照合対象の最後までいってしまいマッチングが不成立
力任せ法をプログラミングする
・「マッチングして終了」
照合文字列の最後の文字までマッチングが成立。
→照合文字列何文字目>照合文字列の長さ
・「マッチングできず最後まで調べて終了」
照合対象の最後までいってしまいマッチングが不成立。
→照合対象何文字目>照合対象の長さ
力任せ法をプログラミングする
よって、以下の条件を満たしたらプログラミングは終了
する。
照合文字列何文字目>照合文字列の長さ
or
照合対象何文字目>照合対象の長さ
力任せ法をプログラミングする
2.「マッチングを継続する」もしくは「マッチングして
終了 orマッチングできず最後まで調べて終了」
「マッチングを継続する」ための条件は、言い換えると
「マッチングを終了しない」ための条件。
マッチングを終了しない限り、”1.実際にマッチングを
調べる部分“を実行するようにコーディングすればいいこ
とになります。
力任せ法をプログラミングする
照合文字列何文字目>照合文字列の長さ
or 照合対象何文字目>照合対象の長さ
Scratchだと・・・
力任せ法をプログラミングする
1.実際にマッチングを調べる部分
2.「マッチングを継続する」もしくは「マッチングして
終了 orマッチングできず最後まで調べて終了」
よって、1と2を繋げると以下のようになります。
力任せ法をプログラミングする
力任せ法をプログラミングする
「マッチングして終了 orマッチングできず最後まで調べ
て終了」
最終的にはプログラムは上記二つのパターンのどちらか
で終了します。
では、どちらのパターンなのかをどのように判定すれば
よいでしょうか?
力任せ法をプログラミングする
マッチングして終了の時
マッチングが最後まで行われているので、最終的に照合
文字列何文字目が照合文字列の長さ+1、つまり5(4
+1)になっています。
よって、照合文字列何文字目の最終的な値を調べること
によって見つかったか見つかっていないのかを判定する
ことができます。
力任せ法をプログラミングする
Scratchだと・・・
力任せ法をプログラミングする
すべて合わせると・・・
力任せ法をプログラミングする
計算量という考え方
何かしらコンピューターによる計算をする際には、
「計算量」という考え方が⼤切になります。
「計算量」とは、計算がどのくらいの時間・メモリを必
要とするかの目安で、⼤雑把な見積もりのようなもので
す。
計算量という考え方
では、なぜ「計算量」が⼤事なのでしょうか?
コンピューターに何かを計算させる際、コンピューター
がするべき計算の量が膨⼤な事があります。ここでいう
計算の量とは、何回計算するかという事だと考えてくだ
さい。
そもそもコンピューターは人間には行えないような量の
計算を行うことができるという点に利点があるのです。
計算量という考え方
また、問題の解き方は⼀つではありません。複数の解き
方が存在します。
そのうちどの方法(=アルゴリズム)をとれば、より短
時間で計算することができるのか、より少ないメモリ量
で計算することができるのかを、知ることができるのが
「計算量」という考えなのです。
(メモリは計算の際に使うデータを保管しておく倉庫の
ようなものだとイメージしてください。あまりにも⼤き
な倉庫は作れません)
計算量という考え方
つまり、「計算量」という考え方によって、様々な方法
(アルゴリズム)を評価し、選択することが可能になる
のです。
計算量という考え方
「計算量」は、具体的な時間やメモリ量を表すものでは
なく、あくまで指標を示します。
O(n)や、O(n×a)という形で表します。
O(n)は「オーダーn」という風に読み、ビックオー記
法と呼ばれます。
力任せ法の計算量
では、力任せ法の計算量を考えてみましょう。
最も計算に時間がかかる場合はどのような場合でしょう
か?また、その時の計算量はどの程度になるでしょう
か?
力任せ法の計算量
最も計算に時間がかかる場合はどのような場合でしょう
か?
→単純に考えて、マッチングしなかった場合は最悪。
なぜ?
→マッチングが分かった場合計算は終了できるのに、
マッチングしない場合は⼀番最後まで計算しないといけ
ない
力任せ法の計算量
マッチングしなかった場合は最悪。
でもそれだけでしょうか?
→中途半端に何度もマッチングした場合が最悪
なぜ?
→中途半端にマッチングすると、マッチングしてるかど
うかの確認の計算が増えてしまう。
力任せ法の計算量
最悪の例は次のような時。
照合対象 :AAAAAAAAAAAAAAAAAAAAAAAAA
照合文字列:AAAAB
力任せ法の計算量
照合対象 :AAAAAAAAAAAAAAAAAAAAAAAAA
照合文字列:AAAAB
パット見で分かるようにこれらはマッチングしない。
よって、マッチングしないという点で最悪であるが、そ
れだけではない。
中途半端に何度もマッチングしてしまうという点でも最
悪である。
力任せ法の計算量
照合対象 :AAAAAAAAAAAAAAAAAAAAAAAAA
照合文字列:AAAAB
中途半端に照合文字列4文字目までマッチングしてしま
うので、何度も5文字分のマッチングを調べることにな
る!(毎回5文字目でマッチングしないことが判明す
る)
力任せ法の計算量
最悪の場合を想定し、照合対象の長さがn、照合文字列
の長さがaとして、nがもの凄く長いとすると、、、
(例)
照合対象:AAAAA…………………………………………A
照合文字列:AAAAB
力任せ法の計算量
最悪の場合を想定し、照合対象の長さがn、照合文字列
の長さがaとすると、、、
計算量は、O(n×a)となる!
力任せ法の計算量
え、n×aじゃなくない?と思った人は、鋭いです。正確
にはn×aよりももう少しだけ小さな値になります。
なぜならn回も繰り返して照合することはなく、n-a+1
回だけになるからです。
正確には、(n-a+1) × a になります。
力任せ法の計算量
しかし、(n-a+1) × a という数字は、計算量で考えると
やはり、 O(n×a)なのです。
なぜなら、計算量はあくまで概算だからです。計算量は
膨⼤な量の計算を行うときに、必要な計算の量の概算を
考えるためのものでした。
これは、nをどんどん⼤きくしていくとわかりやすいで
す。
力任せ法の計算量
aは仮に5とします。
この時、X= n×a、Y= (n-a+1) × a とすると、
XとYの差の割合はどんどん小さくなっていく!
n 10 100 1000 10000
X 50 500 5000 50000
Y 34 480 4980 49980
力任せ法の計算量
よって、力任せ法が最悪の場合の時の計算量は、
O(n×a)と表す!
力任せ法の計算量
ですが、実際にはそれほど悪くないことも多いです。
このような文字列同士のマッチングはめずらしく、⼤抵
の場合、照合文字列の初めの方の文字でマッチングが失
敗します。
処理が単純なので、比較的高速に動きます。
KMP法
前から順に照合していくという点で力任せ法と⼀緒です
が、KMP法では、照合が失敗した時点の状況に応じて、
次の照合位置を変更します。
どういうことか・・・
KMP法
例)
照合対象 :ABABABCABAB
照合文字列:ABABC
まず、力任せ法と同様にマッチングの確認をしていきま
す。
この例だと、最初の4文字はマッチングします。
KMP法
例)
照合対象 :ABABABCABAB
照合文字列:ABABC
5文字目がマッチングしませんでした!
この後の動作が力任せ法とKMP法では違いがあります。
力任せ法だと
例)
照合対象 :ABABABCABAB
照合文字列: ABABC
力任せ法だと、照合対象の方を1文字ずらしたとこから
またマッチングを確認します。また、照合文字列の1文
字目からマッチングを開始します。
マッチング失敗した位置から戻っ
て次のマッチング
照合文字列の1文字目から
KMP法だと
例)
照合対象 :ABABABCABAB
照合文字列: ABABC
KMP法では、マッチングを失敗した地点の文字からマッ
チングを確認します。また、照合文字列の3文字目から
マッチングを開始します。
マッチング失敗した位置から動か
ず次のマッチング
照合文字列の3文字目から
比較すると
・力任せ法
照合対象 :ABABABCABAB
照合文字列: ABABC
・KMP法
照合対象 :ABABABCABAB
照合文字列: ABABC
二つの違い
マッチングが成立しなかったあとの動作に2つの違いが
ありました。これにより、効率的に計算ができます!
照合対象の文
字の位置
照合文字列の
文字の位置
力任せ法 ⼀つずれ 1つ目
KMP法 失敗地点 3つ目
なぜそんなことができるのか?
KMP法だと計算量が少なくなりそうな事が分かりました。
でもそんなことしていいの?根拠は?
先ほどの例で5文字目でマッチング不成立となった場合
の状況は以下のようなものでした。
5文字目でマッチング不成立
例)
照合対象 :ABABABCABAB
照合文字列:ABABC
5文字目でマッチング不成立とはこのような状況でした。
ここで、分かりやすく考えるため照合対象も照合文字列
も全貌を把握できないくらい長い状況を考えます。
5文字目でマッチング不成立
例)
照合対象 :……ABAB?………………
照合文字列: ABABC
4文字目までマッチングしたことで、照合対象は現在の
マッチング開始位置からABABと並んでいることが分か
ります。5文字目はCではないことのみ分かります。
マッチング開始位置
5文字目でマッチング不成立
例)
照合対象 :……ABAB?………………
照合文字列: ABABC
では、この状況で照合対象側を1文字ずらしてマッチングの
確認を始める必要はあるでしょうか?
→1文字ずらしたところはBなので、絶対にマッチングが成
立しません。なので、意味がないことが分かります!
さっきまでのマッチング開始位置
5文字目でマッチング不成立
例)
照合対象 :……ABAB?………………
照合文字列: ABABC
2文字ずらした場合を考えます。照合文字列1文字目か
らマッチングを確認する必要があるでしょうか?
→2文字ずらしたところからABと続くことが判明してい
ます。つまり最初の2文字はマッチングしています!
さっきまでのマッチング開始位置
5文字目でマッチング不成立
例)
照合対象 :……ABAB?………………
照合文字列: ABABC
よって、照合文字列の3文字めからマッチングを開始す
ればいいことが分かります!
3文字目からマッチング!
5文字目でマッチング不成立
例)
照合対象 :……ABAB?………………
照合文字列: ABABC
この時、結果的に照合対象の方は2つずれた地点からに
なりました。マッチング失敗地点に照合文字列の3文字
目を合わせたためです。
2つずらす
3文字目からマッチング!
KMP法
マッチングが途中まで成立し、後に失敗した場合、マッ
チングが成立している間の文字がなんであるのかは判明
します。
判明している文字に対して、改めてマッチングを確認す
る手間を省き、計算量を抑えるのがKMP法です。
なぜそんなことができるのか?
照合文字列の中に重複な並びが存在していたために、こ
のような方法が成立しました。
これは、照合対象のどこのマッチングを確認していたと
しても成立します。なぜなら、照合文字列は変化しない
からです。
なぜそんなことができるのか?
次にどこからマッチングを行えばいいのかという情報は、
マッチングが不成立だった文字数目によって決まります。
そしてこの情報は変化しません。
そこで、あらかじめこの情報を記録した表を作っておき、
プログラム中では表を参照します。
この表のことをスキップテーブルと呼びます。
スキップテーブルの作り方
スキップテーブルの作り方、すなわち次のマッチング位
置の決め方はどのように調べればいいのでしょうか?
照合文字列同士を照合開始位置をずらしながら、照合文
字列の内に部分⼀致するような場所がないかを確認する
ことで求めることができます。
具体的な方法を見ていきましょう。
スキップテーブルの作り方
照合文字列のa文字目で失敗した場合、表の下の段のa番
目の値を見て、次のマッチング開始位置を決めます。
「照合文字列:ABABA」とすると、5文字なのでaが5
まで考えます。表の下の段を埋めていきます。
a 1 2 3 4 5
マッチング
開始位置
? ? ? ? ?
スキップテーブルの作り方
例としてスキップテーブルの使い方を説明します。表の
3の下が仮にXだとします。
この時「3文字目でマッチングが不成立なら、次のマッ
チング開始位置はXずらす」というように用います。
a 1 2 3 4 5
マッチング
開始位置
? ? X ? ?
スキップテーブルの作り方
初めにa=1の場合に関して、1文字目でマッチングが不
成立の場合、
照合対象 :………?………………………
照合文字列: ABABA
a 1 2 3 4 5
マッチング
開始位置
? ? ? ? ?
スキップテーブルの作り方
1文字目からマッチングをまた開始する必要があること
が分かります。よって表に1と書きます。
照合対象 :………?………………………
照合文字列: ABABA
a 1 2 3 4 5
マッチング
開始位置
1 ? ? ? ?
スキップテーブルの作り方
また、a=2の場合に関して、2文字目でマッチングが不
成立の場合、
照合対象 :………A?………………………
照合文字列: ABABA
a 1 2 3 4 5
マッチング
開始位置
1 ? ? ? ?
スキップテーブルの作り方
1文字目からマッチングをまた開始する必要があること
が分かります。よって表に1と書きます。
照合対象 :………A?……………………
照合文字列: ABABA
a 1 2 3 4 5
マッチング
開始位置
1 1 ? ? ?
スキップテーブルの作り方
ここまでは、単純に考えることで分かります。どのよう
な照合文字列であっても常に成立します。
a 1 2 3 4 5
マッチング
開始位置
1 1 ? ? ?
スキップテーブルの作り方
ここからは、照合文字列同士を照合開始位置をずらしな
がら、照合文字列の中に部分⼀致するような場所がない
かを確認していくことでスキップテーブルを完成させて
いきます。
a 1 2 3 4 5
マッチング
開始位置
1 1 ? ? ?
スキップテーブルの作り方
a 1 2 3 4 5
マッチング
開始位置
1 1 ? ? ?
A B A B C
A B A B C
2文字目にずらして照合文字列同士のマッチングを確認
します。
スキップテーブルの作り方
a 1 2 3 4 5
マッチング
開始位置
1 1 1 ? ?
A B A B C
A B A B C
2文字目からのマッチングでは最初から⼀致しないので、
表に1と書き入れます。
スキップテーブルの作り方
a 1 2 3 4 5
マッチング
開始位置
1 1 1 ? ?
A B A B C
A B A B C
3文字目にずらして照合文字列同士のマッチングを確認
します。
スキップテーブルの作り方
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
A B A B C
A B A B C
3文字目からの照合では、AとBがマッチングするので、
表に2と3を書き入れます。
スキップテーブルの作り方
これでスキップテーブルは完成です。
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
スキップテーブルの作り方
実際にa=3以降を確認してみましょう。
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
スキップテーブルの作り方
a=3の時、3文字目でマッチング失敗しているので、以
下のような状況であることが分かります。
照合対象 :………AB?………
照合文字列: ABABC
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
スキップテーブルの作り方
スキップテーブルに従い、1文字目から文字列をマッチ
ングします。マッチング失敗地点から行います。
照合対象 :………AB?………
照合文字列: ABABC
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
スキップテーブルの作り方
仮に力任せ法で行う場合、このように1つずらした地点
からマッチングを行いますが、マッチングしません。
照合対象 :………AB?………
照合文字列: ABABC
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
スキップテーブルの作り方
この事は、その前のマッチングが3文字目で終わった
(=ABと並んでいる)ことにより既に判明しています!
照合対象 :………AB?………
照合文字列: ABABC
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
スキップテーブルの作り方
a=3の時のスキップテーブルを確認できました。
4、5も確かめてみるとわかりますが、この表に従う事
でKMP法を行う事ができます。
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
スキップテーブルの作り方
スキップテーブルとはいったいどういう事なのでしょう
か?
a 1 2 3 4 5
マッチング
開始位置
1 1 1 2 3
スキップテーブルの作り方
照合対象 :………ABABABCAB………
照合文字列: ABABC
仮に、マッチング失敗地点に照合文字列1文字目を合わ
せて、マッチングを行っていくことを考えます。
青で囲った地点でマッチングが失敗したことを想定しま
す。
スキップテーブルの作り方
照合対象 :………ABABABCAB………
照合文字列: ABABC
すると、この地点から再度マッチングを開始することに
なりますが、やはりマッチングしません。この後もマッ
チングする地点を探してプログラムは進みます。
スキップテーブルの作り方
照合対象 :………ABABABCAB………
照合文字列: ABABC
しかし!このプログラムには問題点があります!
スキップテーブルの作り方
照合対象 :………ABABABCAB………
照合文字列: ABABC
この地点でのマッチングを見落としているのです。
マッチング失敗地点からマッチングを開始する、すなわ
ち何地点か飛ばすことによってこの問題点は起きていま
す。
スキップテーブルの作り方
照合対象 :………ABABABCAB………
照合文字列: ABABC
この問題点を解決するのが、KMP法のスキップテーブル
です。
スキップテーブルの作り方
照合対象 :………ABABABCAB………
照合文字列: ABABC
マッチング開始地点に照合文字列の途中の地点を合わせ
る、すなわち照合文字列をいくつか左にずらします。こ
のずらす数がスキップテーブルによってわかるのです。
左にいくつかずらす
KMP法をプログラミングする
ここからKMP法をプログラミングしていきます。KMP
法はこの二つの要素で作られます。
A:スキップテーブルの作成
B:実際にマッチングを行う
KMP法をプログラミングする
A:スキップテーブルの作成
B:実際にマッチングを行う
このうちBの方は、力任せ法とほぼ同じです。スキップ
テーブルを用いて変数を変化させるという点のみ違いが
あります。
今回の授業では、時間の関係上割愛します。
KMP法をプログラミングする
A:スキップテーブルの作成
ので、A:スキップテーブルの作成の方を説明します。
以下の二つを行います。
1.変数の作成
2.照合文字列同士のマッチングによりスキップ
テーブル作成
照合文字列は仮に“ABABC”として説明を行います
KMP法をプログラミングする
1.変数の作成
照合文字列の長さ = “ABABC”の長さ(5)
照合位置a = 1
照合位置b = 1
KMP法をプログラミングする
Scratchだと・・・
KMP法をプログラミングする
2.照合文字列同士のマッチングによりスキップ
テーブル作成
スキップテーブルの作成手法自体は先ほど説明した通り
です。照合文字列同士をずらしていくことで作成します。
しかし、先ほどのような表を作成して、コンピューター
がそれを読むわけではありません。コンピューターが読
むことができる形で表を作成する必要があります。
KMP法をプログラミングする
2.照合文字列同士のマッチングによりスキップ
テーブル作成
ここで、「リスト」というデータ構造について説明した
いと思います。データ構造というのは、データを入れる
容器のことです。容器によって特性がありますが、今回
はリストというものについてお話しします。「リスト」
によってコンピューターが読める”表”を作成します。
KMP法をプログラミングする
2.照合文字列同士のマッチングによりスキップ
テーブル作成
今回は、「リスト」を出席番号がついている下駄箱のよ
うなものだと考えてください。
「リスト」にデータを収納するときも、「リスト」から
データを取り出すときも、番号を指定することで、指定
の下駄箱にてデータを扱う事ができます。
KMP法をプログラミングする
リストは、指定した⼤きさのものを作れます。そこで、
照合文字列の長さ(5)と同じ長さのリストを作成しま
す。
(実は⼤きすぎるリストは作れません。計算量の際に出
てきたメモリを抑えるというのは、⼤きすぎないリスト
でプログラムの処理を行うという話だったりします。)
番号 1 2 3 4 5
データ ? ? ? ? ?
これを作成
KMP法をプログラミングする
{「リスト」を作成、長さは5}というような内容をコ
ンピューターが読める言語(プログラミング言語)で書
くことでコンピューターはリストを作成します。
KMP法をプログラミングする
リストを作成したのちは、先ほど説明した要領でスキッ
プテーブルに入れるべき値を導きだし、番号を指定する
ことでデータを指定の下駄箱に収納していきます。
番号 1 2 3 4 5
データ ? ? ? ? ?
導いた値を該当する番号のところに収納する
KMP法をプログラミングする
{「リスト」の5番、3を収納}というような内容をコ
ンピューターが読める言語(プログラミング言語)で書
くことでコンピューターはリストの5番の位置の下駄箱
に3というデータを収納します。
KMP法をプログラミングする
こうしてAのスキップテーブルの作成をした後は、Aを利
用してマッチングを行うようにBをプログラムすれば
KMP法は完成です。
A:スキップテーブルの作成
B:実際にマッチングを行う
KMP法の計算量
では最後に、KMP法の計算量について考えてみましょう。
力任せ法と違って、KMP法では照合位置が後戻りするこ
とはないというのが⼤きな特徴になります。
照合対象の長さをn、照合文字列の長さをaとすると、
Aスキップテーブルの作成:O(a)
Bマッチング部分 :最悪でもO(n)
となります。AとBはばらばらなので計O(a+n)です。
KMP法の計算量
Aスキップテーブルの作成:O(a)
データ(数字)を導き出し、そのデータを該当するリス
トに収納するという作業を、照合文字列の長さと同じ回
数行うので、AはO(a)となります。
KMP法の計算量
Bマッチング部分 :最悪でもO(n)
照合位置が戻ることはなく⼀つずつ進んでいくだけなの
で、マッチング部分の計算量が最も多くなる最悪のケー
スは最後までマッチングが見つからないケースです。
この時、照合対象の長さnと同じ回数のマッチングが行
われるので、計算量はO(n)となります。
KMP法の計算量
Aスキップテーブルの作成:O(a)
Bマッチング部分 :最悪でもO(n)
まずAを行った後、Bを行うのでAとBの計算量の合計は
単純な足し算によって導かれます。
よって、KMP法の計算量はO(a+n)となります。
最後に
ここまで、力任せ法とKMP法の2つのやり方を見てきま
したが、いかがだったでしょうか?
実はこの2つのやり方にはどちらも頭から比較を行って
いくという共通点があり、比較的似ている手法です。文
字列照合にはほかにもBM法と言って後ろから比較した
り、「索引」を作って処理するSuffix Arrayという方法な
どもあります。興味をもったら調べてみてください。
最後に
以上で授業を終わりたいと思います。
ありがとうございました。

More Related Content

What's hot

ELBO型VAEのダメなところ
ELBO型VAEのダメなところELBO型VAEのダメなところ
ELBO型VAEのダメなところ
KCS Keio Computer Society
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門Yosuke Onoue
 
BigQueryでJOINを極める!
BigQueryでJOINを極める!BigQueryでJOINを極める!
BigQueryでJOINを極める!
Miki Katsuragi
 
[DL輪読会]近年のエネルギーベースモデルの進展
[DL輪読会]近年のエネルギーベースモデルの進展[DL輪読会]近年のエネルギーベースモデルの進展
[DL輪読会]近年のエネルギーベースモデルの進展
Deep Learning JP
 
[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models
Deep Learning JP
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
y_taka_23
 
大学院進学が切り拓く情報系学生のキャリア
大学院進学が切り拓く情報系学生のキャリア大学院進学が切り拓く情報系学生のキャリア
大学院進学が切り拓く情報系学生のキャリア
Takayuki Itoh
 
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Preferred Networks
 
0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)
MasanoriSuganuma
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
Ken'ichi Matsui
 
Mixed Precision Training
Mixed Precision TrainingMixed Precision Training
Mixed Precision Training
Masao Taketani
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
【DL輪読会】Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Mo...
【DL輪読会】Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Mo...【DL輪読会】Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Mo...
【DL輪読会】Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Mo...
Deep Learning JP
 
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画までShunji Umetani
 
Hoare論理
Hoare論理Hoare論理
Hoare論理
Tetsuro Nagae
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
mlm_kansai
 
PHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったことPHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったこと
Kentaro Matsui
 
グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題
joisino
 
工学系大学4年生のための論文の読み方
工学系大学4年生のための論文の読み方工学系大学4年生のための論文の読み方
工学系大学4年生のための論文の読み方
ychtanaka
 

What's hot (20)

ELBO型VAEのダメなところ
ELBO型VAEのダメなところELBO型VAEのダメなところ
ELBO型VAEのダメなところ
 
PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門PyOpenCLによるGPGPU入門
PyOpenCLによるGPGPU入門
 
線形計画法入門
線形計画法入門線形計画法入門
線形計画法入門
 
BigQueryでJOINを極める!
BigQueryでJOINを極める!BigQueryでJOINを極める!
BigQueryでJOINを極める!
 
[DL輪読会]近年のエネルギーベースモデルの進展
[DL輪読会]近年のエネルギーベースモデルの進展[DL輪読会]近年のエネルギーベースモデルの進展
[DL輪読会]近年のエネルギーベースモデルの進展
 
[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models[DL輪読会]Flow-based Deep Generative Models
[DL輪読会]Flow-based Deep Generative Models
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
 
大学院進学が切り拓く情報系学生のキャリア
大学院進学が切り拓く情報系学生のキャリア大学院進学が切り拓く情報系学生のキャリア
大学院進学が切り拓く情報系学生のキャリア
 
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
 
0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
Mixed Precision Training
Mixed Precision TrainingMixed Precision Training
Mixed Precision Training
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
【DL輪読会】Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Mo...
【DL輪読会】Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Mo...【DL輪読会】Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Mo...
【DL輪読会】Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Mo...
 
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
 
Hoare論理
Hoare論理Hoare論理
Hoare論理
 
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
最近のKaggleに学ぶテーブルデータの特徴量エンジニアリング
 
PHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったことPHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったこと
 
グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題グラフニューラルネットワークとグラフ組合せ問題
グラフニューラルネットワークとグラフ組合せ問題
 
工学系大学4年生のための論文の読み方
工学系大学4年生のための論文の読み方工学系大学4年生のための論文の読み方
工学系大学4年生のための論文の読み方
 

文字列照合アルゴリズム(中学3年生向け)