文字列照合アルゴリズムTatsuhiko Kubo
紹介するアルゴリズム
•KMP法(Knuth-Morris-Pratt)• BM法(Boyer-Moore)• Aho-Carasick法
これらのアルゴリズムの特徴
• 大規模な文字列検索(例えば全文検索)には適さない• 対象文字列を特別な内部表現に変換する必要がない• 対象文字列が更新されてもそのまま対応できる
int simple_match(char *s, char *pattern){ // 単純な照合 char *p; char *s_start; char *pattern_start; int idx = 0; s_start = s; pattern_start = pattern; for(p=s;*p!='\0';++p){ if(*p != *pattern++){ ++idx; p = s_start + idx; pattern = pattern_start; } else { if(*pattern == '\0'){ return 1; } } } return 0;}
KMP法
•Knuth-Morris-Pratt法•先頭から照合する•照合の際、途中まで一致した情報を元に次の照合を開始する
a b c a b c a b c o k l a b c a b e s t u v x y z
a b c a b ea b c a b e
a b c a b ea b c a b ea b c a b ea b c a b ea b c a b ea b c a b e
BM法• 文字列を先頭からではなく、末尾から比較する• 照合文字列中の各文字がの末尾から何文字目にあるかを元にシフトする
k l a n o
4 3 2 1 0
a b c d o k a n q o k l a n o p q r s t u v x y z
k l a n× o
k l a n o×
k l a n o×
k l a n o
KMP法との比較
•照合回数が少ない(例外あり)•照合用文字列が長いほど高速になる
Aho-Carasick法
•複数の文字列を効率的に照合できる•照合する複数の文字列からオートマトン(ACマシン)を構築
ACマシンの構築
•失敗した後の遷移先を記録•照合完了地点を保持する
0 1 2 8 9 10
3 4
5 6
7
a b c d e
d
bc
ab
{ab, bc, bab, d, abcde}s f(s)1 0
2 3
3 0
4 0
5 1
6 2
7 0
8 4
9 7
10 0
s o(s)
2 ab
4 bc
6 bab, ab
7 d
8 bc
9 d
10 abcde
[^abd]
•テキストエディタの検索機能(Emacs)• 正規表現ライブラリ(鬼車)
これらのアルゴリズムの活用例
参考文献
•情報検索アルゴリズム, 北 研二 津田 和彦 獅々堀正幹 著, 共立出版