Он совершает 3n сравнений в
худшем случае при поиске первого совпадения с непериодничным образцом и O( n*m
) при поиске всех вхождений.
Он производит сравнения справа налево,
начиная с самого правого символа. В случае несовпадения ( или, наоборот,
полного попадания ) используются две заранее вычисляемые функции: функция
плохого символа и функция хорошего суффикса.
Предположим, что несовпадение произошло
между символом образца x[j] = b и символом текста y[ i+j ] = a на позиции i.
Тогда y[ i+j+1, i+m-1 ] = x[ j+1,
m-1 ] = u и y[ i+j ] =/= x[j]. Функция хорошего суффикса состоит в 'выравнивании'
сегмента y[ i+j+1, i+m-1 ] = x[ j+1, m-1 ] = u по его самому правому появлению
в x, так чтобы ему предшествовал символ, несовпадающий с x[ j ].
Если такого сегмента нет, то сдвиг
выравнивает наибольший суффикс v отрезка y[i+j+1,i+m-1] по совпадающему
префиксу x.
Функция плохого символа выравнивает символ
текста y[ i + j ] по его самому правому появлению в x[ 0 ... m - 2] ( см Рис.3
). Если его там нет - сдвигаем на всю длину образца: левый конец теперь - y[ i
+ j + 1 ]. Для сдвига образца мы берем минимум этих двух функций.
|