ボイヤー-ムーア文字列検索アルゴリズム
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/10 16:30 UTC 版)
ナビゲーションに移動 検索に移動このアルゴリズムでは検索文字列(パターン)の前処理を行い、検索対象テキストの前処理は行わない。したがって、テキストについて何度も検索を行わない場合に適している(他のアルゴリズムではテキスト側に前処理を施し、繰り返し検索を行うことで前処理のコストを償却する)。テキスト上の全文字をチェックする必要はなく、前処理で得た情報を活用してスキップしながら処理していく。一般にパターン文字列が長いほど検索が高速化される。検索文字列とテキストの間での不一致が発生するたびに、不一致であったという情報を最大限に利用して照合しなくてもいい位置を可能な限り排除することで、効率を向上させている。
記号の定義
A | N | P | A | N | M | A | N | - |
P | A | N | - | - | - | - | - | - |
- | P | A | N | - | - | - | - | - |
- | - | P | A | N | - | - | - | - |
- | - | - | P | A | N | - | - | - |
- | - | - | - | P | A | N | - | - |
- | - | - | - | - | P | A | N | - |
文字列 S に対する操作を以下のように表す:
- S[i]: 文字列 S の i 番目の文字
- S[i..j]: 文字列 S の i から j 番目までの部分文字列(i 文字目、j 文字目をそれぞれ含む)
文字列 S に含まれる文字の個数を文字列の長さと定義する。また、文字列 S の先頭を含む部分文字列をプレフィックス、末尾を含む部分文字列をサフィックスと定義する。
- len(S):S の長さ
- S[1..i], 1 ≤ i ≤ len(S):S のプレフィックス
- S[i..len(S)], 1 ≤ i ≤ len(S):S のサフィックス
検索文字列をパターンと呼び、P で表す。被検索文字列をテキストと呼び、T で表す。また T 上での P の位置を T の先頭から数えた P の末尾の文字の位置と定義し、k で表す。
- T:テキスト(被検索文字列)
- P:パターン(検索文字列)
- k:テキスト T 上でのパターン P の最後の文字の位置(len(P) ≤ k ≤ len(T))
「P が T に一致する」とは P と文字列として等価な部分文字列 T[i..j] が存在することをいう。より具体的に、P が位置 k で T と一致するとは、k 番目から前方 len(P) 文字分を取り出した部分文字列 T[(k − len(P) + 1)..k] が P と文字列として等価であることをいう。
本項では特に断りない限り、m を len(T), n を len(P) の意味で使う。
アルゴリズム
ボイヤー-ムーア法は T における P の出現を検索するもので、異なる位置で明示的に何度も文字を比較することで検索する。全部で m − n + 1 ある位置について力まかせ探索するのではなく、P を前処理して得た情報を使ってなるべく位置をスキップする。
まず、k = n として P が T の先頭に配置されるようにする。そして P の n 番目と T の k 番目から文字を照合しはじめ、インデックスを順次小さくして照合していく。つまり、P の最後尾から先頭に向かって照合していく。この照合は不一致が発生するか P の先頭に到達するまで行われ(その場合は一致が見つかったことになる)、その後いくつかの規則に従って位置を右にシフトできる最大値を求める。新たな位置で再び同様の照合を行い、T の最後尾に到達するまでそれを繰り返す。
シフト規則は、P の前処理で生成したテーブル群を参照することで実装されており、定数時間でシフト量が決定される。
- ^ Hume and Sunday (1991) [Fast String Searching] SOFTWARE—PRACTICE AND EXPERIENCE, VOL. 21(11), 1221–1248 (NOVEMBER 1991)
- ^ Boyer, Robert S.; Moore, J Strother (October 1977). “A Fast String Searching Algorithm.”. Comm. ACM (New York, NY, USA: Association for Computing Machinery) 20 (10): 762-772. doi:10.1145/359842.359859. ISSN 0001-0782 .
- ^ a b Gusfield, Dan (1999) [1997], “Chapter 2 - Exact Matching: Classical Comparison-Based Methods”, Algorithms on Strings, Trees, and Sequences (1 ed.), Cambridge University Press, pp. 19–21, ISBN 0521585198
- ^ a b Galil, Z. (September 1979). “On improving the worst case running time of the Boyer-Moore string matching algorithm”. Comm. ACM (New York, NY, USA: Association for Computing Machinery) 22 (9): 505-508. doi:10.1145/359146.359148. ISSN 0001-0782 .
- ^ Knuth, Donald; Morris, James H.; Pratt, Vaughan (1977). “Fast pattern matching in strings”. SIAM Journal on Computing 6 (2): 323-350. doi:10.1137/0206024 .
- ^ Guibas, Odlyzko; Odlyzko, Andrew (1977). “A new proof of the linearity of the Boyer-Moore string searching algorithm”. Proceedings of the 18th Annual Symposium on Foundations of Computer Science (Washington, DC, USA: IEEE Computer Society): 189-195. doi:10.1109/SFCS.1977.3 .
- ^ a b Cole, Richard (September 1991). “Tight bounds on the complexity of the Boyer-Moore string matching algorithm”. Proceedings of the 2nd annual ACM-SIAM symposium on Discrete algorithms (Philadelphia, PA, USA: Society for Industrial and Applied Mathematics): 224-233. ISBN 0-89791-376-0 .
- ^ FENG, Z. -R. and TAKAOKA, TADAO (1988). “On Improving the Average Case of the Boyer-Moore String Matching Algorithm”. J. of Information Proc. (一般社団法人情報処理学会) 10: 173-177. ISSN 03876101 .。
- 1 ボイヤー-ムーア文字列検索アルゴリズムとは
- 2 ボイヤー-ムーア文字列検索アルゴリズムの概要
- 3 シフト規則
- 4 ガリル規則
- 5 派生
ボイヤー-ムーア文字列検索アルゴリズムと同じ種類の言葉
アルゴリズムに関連する言葉 | ラウンドロビンアルゴリズム STRASSENのアルゴリズム ボイヤームーア文字列検索アルゴリズム 求根アルゴリズム フロイドのアルゴリズム |
- ボイヤー-ムーア文字列検索アルゴリズムのページへのリンク