Изменения

Перейти к: навигация, поиск

Алгоритм Бойера-Мура

1078 байт добавлено, 01:38, 11 мая 2014
Алгоритм
==Алгоритм==
Алгоритм сравнивает символы шаблона <tex>y</tex> справа налево, начиная с самого правого, один за другим с символами исходной строки <tex>x</tex>. Если символы совпадают, производится сравнение предпоследнего символа шаблона и так до конца. Если все символы шаблона совпали с наложенными символами строки, значит, подстрока найдена, и поиск окончен. В случае несовпадения какого-либо символа (или полного совпадения всего шаблона) он использует две предварительно вычисляемых эвристических функций, чтобы сдвинуть позицию для начала сравнения вправо. Область определения одной из функций зависит линейно от размера алфавита  Алфавит обозначим буквой <tex>\Sigma</tex>.
Пусть <tex>|y|=n</tex>, <tex>|x|=m</tex> и <tex>|\Sigma|=\sigma</tex>
Если при сравнении текста и шаблона совпало один или больше символов, шаблон сдвигается в зависимости от того, какой суффикс совпал.
Если существует такая подстрока <tex>u</tex>, что она полностью входит в <tex>x</tex> и идет справа от символа, отличного от <tex>x[i]</tex>, то сдвиг идет на всю длину этого суффикса. Ясно, что в таком случае имеет смысл начинать сравнение не с очередного символа от конца <tex>x</tex>, а с левого конца подстроки равной суффиксу шаблона <tex>x</tex> из-за того, другие подстроки явно уже не подойдут.
[[Файл:boyer-moore-algorithm-1.png|450px|thumb|center|'''Сдвиг хорошего суффикса''', вся подстрока <tex>u</tex> полностью встречается справа от символа <tex>c</tex>, отличного от символа <tex>a</tex>.]]
Если не существует такой подстроки, то смещение состоит в выравнивании самого длинного суффикса <tex>v</tex> подстроки <tex>y[i+j+1 .. j+m-1]</tex> с соответствующим префиксом <tex>x</tex>. Из-за того, что мы не смогли найти такую подстроку, то, очевидно, что ни один суффикс шаблона <tex>x</tex> уже не будет лежать в подстроке <tex>y[i+j+1 .. j+m-1]</tex>, поэтому единственный вариант, что в эту подстроку попадет префикс.
[[Файл:boyer-moore-algorithm-2.png|450px|thumb|center|'''Сдвиг хорошего суффикса''', только суффикс подстроки <tex>u</tex> повторно встречается в <tex>x</tex>.]]
418
правок

Навигация