23
文字列照合アルゴリズム Tatsuhiko Kubo

String Match Algrithm

Embed Size (px)

Citation preview

文字列照合アルゴリズムTatsuhiko Kubo

紹介するアルゴリズム

•KMP法(Knuth-Morris-Pratt)• BM法(Boyer-Moore)• Aho-Carasick法

これらのアルゴリズムの特徴

• 大規模な文字列検索(例えば全文検索)には適さない• 対象文字列を特別な内部表現に変換する必要がない• 対象文字列が更新されてもそのまま対応できる

その前に、

単純な照合(Simple)について

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法

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

Simpleとの比較

•短い文字列の照合ならSimpleの方が速い

BM法

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

Simpleとの比較

•短い文字列の照合ならSimpleの方が速い

KMP法との比較

•照合回数が少ない(例外あり)•照合用文字列が長いほど高速になる

Aho-Carasick法

SimpleやKMP法、BM法では、

SimpleやKMP法、BM法では、

単一のキーワード毎にしか照合できない

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)• 正規表現ライブラリ(鬼車)

これらのアルゴリズムの活用例

参考文献

•情報検索アルゴリズム, 北 研二 津田 和彦 獅々堀正幹 著, 共立出版