Понимание Бойера-Мура заключается в том, что если вы начнете поиск шаблона в строке, начинающейся с последнего символа в шаблоне, вы можете перейти к поиску вперед на несколько символов, если вы столкнулись с несоответствием.
Допустим, наш шаблон 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 = ^
(2) если мы попробуем сопоставить символ, последняя позиция которого k
от конца 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 = ^
Однако на самом деле мы можем добиться большего, чем это.(3b), поскольку мы знаем, что в старом i
мы уже сопоставили несколько символов (в данном случае 1).Если совпавшие символы не соответствуют началу p
, то мы можем на самом деле прыгнуть немного вперед (это дополнительное расстояние называется «delta2» в статье):
s = WHICH FINALLY HALTS. AT THAT POINT...
p = AT THAT
i = ^
На этом этапе, наблюдение (2) применяется снова, давая
s = WHICH FINALLY HALTS. AT THAT POINT...
p = AT THAT
i = ^
и бинго!Мы закончили.