9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D A B C D A B D 0 1 2 3 4 5 6 X P まずパターンから事前にテーブルを作っておきます。 テーブル生成の詳細は割愛しますが、次のようなテー ブルになります。 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D A B C D A B D 0 1 2 3 4 5 6 X P 先頭から順に照合していきます。 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D A B C D A B D 0 1 2 3 4 5 6 X P 先頭から順に照合していきます。 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D A B C D A B D 0 1 2 3 4 5 6 X P 先頭から順に照合していきます。 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D A B C D A B D 0 1 2 3 4 5 6 ここでX[3] != P[3]になりました。 X P A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D A B C D A B D 0 1 2 3 4 5 6 これまでの文字比較でX[1]〜X[3]の間に’A’がないこと はわかっているので、次に’A’が現れる位置まで一気に 4文字スキップできることがわかります。 X P A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D A B C D A B D 0 1 2 3 4 5 6 また、ここで不一致文字のDに注目して、テーブルを確 認してみるとその値は0となっています。 X P A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D A B C D A B D 0 1 2 3 4 5 6 つまり4文字だけ右にスライドして、次の照合位置は 0文字目から、ということになります。 X P A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D ということで、4文字ずらすとこうなります。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D そしてまたPの0番目から照合を繰り返していきます。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D そしてまたPの0番目から照合を繰り返していきます。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D そしてまたPの0番目から照合を繰り返していきます。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D そしてまたPの0番目から照合を繰り返していきます。 今度はDの位置でも一致しました。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D X P A B C D A B D 0 1 2 3 4 5 6 そしてまたPの0番目から照合を繰り返していきます。 今度はDの位置でも一致しました。まだ先に進みます。 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D X P A B C D A B D 0 1 2 3 4 5 6 そしてまたPの0番目から照合を繰り返していきます。 今度はDの位置でも一致しました。まだ先に進みます。 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D ここでX[10] != P[6]が不一致になりました。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D これまでの文字比較でX[8]に’A’が出てきているので、 そこまで一気にスキップできることがわかります。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D また、ここでも不一致となった文字列Dに注目してテー ブルの値を確認すると2となっています。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D ということで今回も一気に4文字スキップします。かつ 今度は2文字目からのチェックとなります。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D X[10] != P[2] となりました。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D 今までと同じく次にAが出現する位置まで一気に3文字 スキップできることは明らかです。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D また、同じく不一致文字Cに注目してテーブルを確認す ると今度は0です。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D ということで3文字ずらします。そして次は0文字目か らの照合になります。 X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D また0文字目から照合を繰り返します... X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2 また0文字目から照合を繰り返します...
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D X P A B C D A B D 0 1 2 3 4 5 6 A B C D A B D 0 0 0 0 0 1 2 また0文字目から照合を繰り返します...
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D X P A B C D A B D 0 1 2 3 4 5 6 という風にして、全文字が一致するまで繰り返します。 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 A B C A B C D A B A B C D A B C D A B D X P A B C D A B D 0 1 2 3 4 5 6 文字ずらしテーブルの生成方法は割愛しましたが、 テーブル生成方法はインターネットにサンプルがたく さんあるので興味があれば調べてみると面白いかも。 A B C D A B D 0 0 0 0 0 1 2
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P KMP法と同じくBM法でも事前にテーブルを生成しま す。詳細は割愛しますが、この場合は右の様なテーブ ルとなります。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P BM法はパターンの末尾から照合していきます。さっそ く不一致になりました。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 今回は検索対象文字列のgで不一致が起こっているので ここに注目します。テーブルを確認すると値は4です。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P ということで4文字ずらします。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P そしてまた末尾から照合をしていきます。また不一致で す。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 今度は”スペース”で不一致が起こりました。スペースは このテーブルに含まれないためパターン文字列長の7文 字分一気にずらします。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P ということで7文字ずらしました。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 同じように末尾から照合しますが、またgで不一致とな ります。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 前回と同じように4文字ずらします。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 同じように末尾から照合していきます。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 同じように末尾から照合していきます。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 同じように末尾から照合していきます。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 同じように末尾から照合していきます。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P 同じように末尾から照合していきます。あとはもう一致 しそうです。 h i g h w a y 6 5 4 3 2 1 0
9 10 11 12 13 14 15 16 17 18 19 20 21 g r e a t g r e p t h e h i g h w a y h i g h w a y 0 1 2 3 4 5 6 X P KMP法よりBM法の方がスキップできる文字数が大き く、さらに文字列に比較回数も少なくいことがわかり ます。 h i g h w a y 6 5 4 3 2 1 0