Boyer-Moore の背後にある洞察は、パターンの最後の文字から始まる文字列のパターンの検索を開始すると、不一致にヒットしたときに複数の文字を前方に検索できるということです。
私たちのパターンpが一連の文字p1, p2, ... であるとしましょう。現在pn、文字列 を検索しているため、インデックスは で整列されています。sppnis
例えば:
s = WHICH FINALLY HALTS. AT THAT POINT...
p = AT THAT
i = ^
BM の論文では、次のような見解が示されています。
(1) 含まれていない文字を照合しようとすると、次の文字にpジャンプできnます。
'F' は にないpため、文字を進めnます:
s = WHICH FINALLY HALTS. AT THAT POINT...
p = AT THAT
i = ^
k(2) 最後の位置がの最後にある文字を照合しようとすると、次の文字pにジャンプできkます。
' の最後の位置は最後pから 4 つなので、4 文字進めます。
s = WHICH FINALLY HALTS. AT THAT POINT...
p = AT THAT
i = ^
ここでi、成功するか不一致に達するまで、から逆方向にスキャンします。(3a)kの先頭から文字の不一致が発生pし、不一致の文字が にない場合、p(少なくとも)k文字を進めることができます。
'L' が含まれておらず、pに対して不一致が発生したp6ため、(少なくとも) 6 文字進めることができます。
s = WHICH FINALLY HALTS. AT THAT POINT...
p = AT THAT
i = ^
ただし、実際にはこれよりも優れたことができます。i(3b) 以前はすでにいくつかの文字 (この場合は 1) に一致していたことがわかっているためです。一致した文字が の先頭に一致しない場合、p実際にはもう少し先にジャンプできます (この余分な距離は、論文では「デルタ 2」と呼ばれます)。
s = WHICH FINALLY HALTS. AT THAT POINT...
p = AT THAT
i = ^
この時点で、観測 (2) が再び適用され、次のようになります。
s = WHICH FINALLY HALTS. AT THAT POINT...
p = AT THAT
i = ^
そしてビンゴ!終わったね。