Сдвиг плохого символа, используемый в алгоритме Боуера - Мура, не очень эффективен для маленького алфавита, но, когда размер алфавита большой по сравнению с длиной образца, как это часто имеет место с
таблицей ASCII и при обычном поиске в текстовом редакторе, он становится чрезвычайно полезен. Использование в алгоритме только его одного может быть весьма эффективным.
После попытки совмещения x и y [i, i+m-1], длина сдвига - не менее 1. Таким образом, символ y [ i + m ] обязательно будет вовлечен в следующую попытку, а значит, может быть использован в текущей попытке для сдвига плохого символа. Модифицируем функцию плохого символа, чтобы принять в расчет последний символ х:
bc[ a ] = min j , если a встречается в x,
bc[ a ] = m в противоположном случае.
Сравнения текста и образца могут производиться в любом порядке.
Турбо БМ (Классификация Thierry Lecroq [2]).
Турбо - БМ является также является улучшением алгоритма Боуера - Мура. Мы будем запоминать сегмент текста, который сошелся с суффиксом образца во время прошлой попытки (и только, если произошел сдвиг хорошего суффикса).
Это даст нам два преимущества:
1. Возможность перескочить через этот сегмент
2. Возможность применения «турбо - сдвига»
«Турбо - сдвиг» может произойти, если мы обнаружим, что суффикс образца, который сходится с текстом, короче, чем тот, который был запомнен ранее.
Пусть u - запомненный сегмент, а v - cуффикс, совпавший во время текущей попытки, такой что uzv - суффикс x. Тогда av - суффикс x, два символа а и b встречаются на расстоянии p в тексте, и суффикс x длины |uzv| имеет период длины p, а значит не может перекрыть оба появления символов а и b в тексте. Наименьший возможный сдвиг имеет длину |u| - |v| ( его мы и называем «турбо - сдвигом» ).
0
1
2
3
4
5
6
7
a
b
c
Алгоритм
Время выполнения
Длина ?10
Длина ?100
Длина ?250
Послед. поиск
15
93
234
(Хеш - сумма кодов)
63
КМП
30
50
БМ
31
32
Время на пред. обработку
Среднее время поиска
Худшее время поиска
Затраты памяти
Время работы (мс) при длине строки ?250
Примечания
Алгоритмы основанные на алгоритме последовательного поиска
Алгоритм прямого поиска
Нет
O((m-n+1)*n+1)/2
O((m-n+1)*n+1)
Mалые трудозатраты на программу, малая эффективность.
Алгоритм Рабина
O(m+n)
Алгоритм Кнута-Морриса-Пратта
O(m)
O(n+m)
Универсальный алгоритм, если неизвестна длина образца
Алгоритм Бойера-Мура
O(m+s)
O(n*m)
Алгоритмы этой группы наиболее эффективны в обычных ситуациях. Быстродействие повышается при увеличении образца или алфавита.
Страницы: 1, 2