【けーえむぴーほう】

KMP法 とは?

💡 失敗からも学ぶ、賢い文字列サーチ
📌 このページのポイント
KMP法:失敗情報を活用した高速検索 テキスト A B A B A B C 素朴法 NG → 1文字ずらして最初からやり直し KMP法 NG AB部分が一致済み! → 2文字分スキップ 失敗関数テーブル(パターン: ABABC) A B A B C 0 0 1 2 0 ← 不一致時にスキップできる文字数
KMP法のイメージ
ひよこ ひよこ

KMP法って普通の文字列検索と何が違うの?

ペンギン先生 ペンギン先生

普通の方法だと不一致が起きたら1文字ずらしてまた最初から比較し直すよね。KMP法は「ここまでは一致していた」という情報を使って、無駄な比較をスキップするんだよ。

ひよこ ひよこ

失敗関数って何のこと?

ペンギン先生 ペンギン先生

パターン文字列を前処理して作るテーブルで、「不一致が起きたとき、パターンのどこまで戻ればいいか」を記録しているんだ。例えば「ABABC」を検索中に4文字目で不一致になったら、2文字目から再開できると教えてくれるよ。

ひよこ ひよこ

それってどれくらい速くなるのかな?

ペンギン先生 ペンギン先生

最悪ケースでもO(n+m)が保証されるのが強みだよ。素朴な方法だと最悪O(nm)になるから、長いテキストで繰り返しの多いパターンを検索するときに圧倒的な差が出るんだ。

ひよこ ひよこ

実際どんなところで使われてるの?

ペンギン先生 ペンギン先生

テキストエディタの検索機能、ネットワークの侵入検知システム、バイオインフォマティクスのDNA配列検索なんかで使われているよ。grepコマンドの内部でもKMPの考え方が活用されているんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
KMP法」って出てきたら「失敗を活かして高速に文字列検索するアルゴリズム」と思えればだいたいOK!
📖 おまけ:英語の意味
「Knuth-Morris-Pratt Algorithm」 = クヌース・モリス・プラット法
💬 3人の研究者Knuth、Morris、Prattの頭文字を取ってKMPと呼ばれるんだよ
← 用語集にもどる