アルゴリズム体操その9

プログラミングの宝箱 アルゴリズムとデータ構造 (C magazine)

プログラミングの宝箱 アルゴリズムとデータ構造 (C magazine)

文字列検索、終了。
KMP法で引っかかったが、なかなか面白かった。
KMP法もBM法もどちらも、検索文字列中のある文字で一致しなかった場合に、どれだけ飛ばして検索を再開するかというのがキモだ。
そのためのテーブルを作っておくのだが、KMP法でそのテーブルを作る部分で引っかかってしまった。
あちこちに検索文の文字列へのインデックスや、検索文字列へのインデックスを出力するようにして、どうにか理解できた。
以下の検索例で、先頭についている数字列が、そのテーブルの内容である。

KMP法


a p p l e a p p l e f i g h t
0 0 0 0 0 0 0 1 2 3 4 5 6 0 0 0 0 0
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: l
text: apple apple apple apple apple fight
pattern: e
text: apple apple apple apple apple fight
pattern:
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: l
text: apple apple apple apple apple fight
pattern: e
text: apple apple apple apple apple fight
pattern:
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: l
text: apple apple apple apple apple fight
pattern: e
text: apple apple apple apple apple fight
pattern:
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: l
text: apple apple apple apple apple fight
pattern: e
text: apple apple apple apple apple fight
pattern:
text: apple apple apple apple apple fight
pattern: a
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: p
text: apple apple apple apple apple fight
pattern: l
text: apple apple apple apple apple fight
pattern: e
text: apple apple apple apple apple fight
pattern:
text: apple apple apple apple apple fight
pattern: f
text: apple apple apple apple apple fight
pattern: i
text: apple apple apple apple apple fight
pattern: g
text: apple apple apple apple apple fight
pattern: h
text: apple apple apple apple apple fight
pattern: t
Found
BM法

17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
5 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 10 17 17 17 6 4 2 1 3 17 17 7 17 17 17
8 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17
text: apple apple apple apple apple fight
pattern: apple apple fight
text: apple apple apple apple apple fight
pattern: apple apple fight
text: apple apple apple apple apple fight
pattern: apple apple fight
text: apple apple apple apple apple fight
pattern: apple apple fight
Found

いや、楽しかった。
いよいよ、残り3章だ。