Boyer-Moore の背後にある洞察は、パターンの最後の文字から始まる文字列のパターンの検索を開始すると、不一致にヒットしたときに複数の文字を前方に検索できるということです。
私たちのパターンp
が一連の文字p1
, p2
, ... であるとしましょう。現在pn
、文字列 を検索しているため、インデックスは で整列されています。s
p
pn
i
s
例えば:
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 = ^
そしてビンゴ!終わったね。