アルゴリズム   ダウンロード   ニュース   サービス
リンク
検索のヒント
mstr.jpとは

KMP法(一方向逐次検索 単一パターン)
2005.12.23 :
 KMPは考案者 Knuth、Morris、Pratt 3氏の頭文字を表す。

 この方法でも、テキストを先頭から1文字づつ見ていくという点では単純な方法と変わらない。キモとなる点は、不一致が起きた時点で得ている情報によりシフト幅を変えるという点だ。単純な方法では1文字づつしかずらすことができなかったが、このKMP法では最大で不一致が起きた時点で比較した長さ分だけずらすことができる。



 具体的に図を見てみよう。テキストとパターンがある文字数だけ一致した後、不一致を検出したとしよう。単純な方法ではまさしく単純に1文字だけずらしてまた同じことを繰り返した。しかし、ここまでは一致しているという情報を持っているのだから、それを何とかうまく使って1文字より多くずらす(シフトさせる)ことができる。その方法は、一致した部分から先頭1文字を削った文字列のSuffix(接尾辞)とパターンのPrefix(接頭辞)で一致する最長のものをそろえることだ。

 先頭1文字を削るのは、シフト幅を1以上にするためだ。また、検出もれをなくす為に最長のものを選んでいる。

 次の表は、abbabbababに対するシフト幅を示したものだ。


不一致の時に読み込んでいる文字列シフト幅備考
ε1-
a1-
ab2一致なし
abb3一致なし
abba3aが一致
abbab3abが一致
abbabb3abbが一致
abbabba3abbaが一致
abbabbab3abbabが一致
abbabbaba8aが一致
abbabbabab8abが一致


Satoru Miyamoto(ミヤモト@stringer.jp)