Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

12.3. Алгоритмы соответствия образца 567

В Кодовом Фрагменте 12.4, мы показываем алгоритм соответствия образца BM.

Алгоритм BMMatch (T, P):

Вход: Последовательности T (текст) с n знаками и P (образец) с m знаками

Продукция: Стартовый индекс первой подстроки T соответствие P или признак

это P не подстрока T, вычисляет функцию в последний раз

я¬ m-1

j¬ m-1

повториться

если P [j] = T [я] тогда

если j = 0 тогда

возвратитесь i Матч!

еще

я¬ i-1

j¬ j-1

еще

я¬ i + m- минута (j, 1 + в последний раз (T [я])) Подскакивают шаг

j¬ m-1

до i> n- 1

возвратитесь «Нет никакой подстроки T соответствия P.»

Кодовый Фрагмент 12.4: алгоритм соответствия образца Бойер-Мура.

Шаг скачка иллюстрирован в рисунке 12.4.

(a)

(b)

Рисунок 12.4: шаг скачка в алгоритме Кодового Фрагмента 12.4, где мы позволяем

l = в последний раз (T [я]). Мы отличаем два случая: (a) 1 + l£ j, куда мы перемещаем образец

j- l единицы; (b) j <1 + l, куда мы перемещаем образец одной единицей.

568 Глава 12. Последовательности и динамическое программирование

В рисунке 12.5 мы иллюстрируем выполнение соответствия образца Бойер-Мура

алгоритм на строке ввода, подобной Примеру 12.4.

Последнее (c) функция:

c ABC d

последний (c) 4 5 3- 1

Рисунок 12.5: алгоритм соответствия образца BM. Алгоритм выполняет 13 случайных работ - сравнения актера, которые обозначены с числовыми этикетками.

Правильность алгоритма соответствия образца BM следует из факта, что каждый раз метод делает изменение, это, как гарантируют, не «пропустит» в течение любых возможных матчей. Это вызвано тем, что последний (c) указывает на последнее возникновение c в P.

Продолжительность худшего случая алгоритма BM - O (nm +|S ). А именно,

вычисление последней функции берет O (m +|S ) время и фактический поиск

образец берет O (nm) время в худшем случае, то же самое как алгоритм «в лоб».

Пример пары текстового образца, которая достигает худшего случая,

n

T = aaaaaa m-1

P = b aa a.

Работа худшего случая, однако, вряд ли будет достигнута для английского текста, потому что в этом случае алгоритм BM часто в состоянии пропустить значительные части текста. (См. рисунок 12.6.) Экспериментальные данные на английском тексте показывают, что среднее число сравнений, сделанных за характер, 0.24 для пятисимвольной последовательности образца.

Рисунок 12.6: пример выполнения Бойер-Мура на английском тексте.

12.3. Алгоритмы соответствия образца 569

C ++ внедрение алгоритма соответствия образца BM, основанного на STL

вектор, показан в Кодовом Фрагменте 12.5.

/ ** Упрощенная версия алгоритма Бойер-Мура. Возвращает индекс

* крайняя левая подстрока текста, соответствующего образцу, или-1, если ни один. */

международный BMmatch (константа string& текст, константа string& образец)

станд.:: вектор <интервал> длится = buildLastFunction (образец);

интервал n = text.size (); интервал m = pattern.size ();

интервал i = m- 1;

если (i> n- 1) //образец дольше, чем текст?

возвратитесь-1; //.. .then никакой интервал матча j = m- 1;

сделайте

если (образец [j] == текст [я])

если (j == 0) возвращаются i;

еще

i-; j-;

еще

//найденный матчем//зеркало, эвристическое//, продолжаются справа налево

//эвристический скачок характера

i = я + m- станд.:: минута (j, 1 + в последний раз [текст [я]]); j = m- 1;

, в то время как (я <= n- 1);

возвратитесь-1;

//никакой матч

//постройте функцию в последний раз

станд.:: вектор <интервал> buildLastFunction (константа string& образец)

интервал константы N ASCII = 128; интервал i; станд.:: вектор <интервал> в последний раз (N ASCII); для (я = 0; я <N ASCII; я ++)

в последний раз [я] =-1;

//число знаков ASCII

//предположите, что кодировка ASCII//инициализирует множество

для (я = 0; я <pattern.size (); я ++)

в последний раз [образец [я]] = я;

возвратитесь в последний раз;

//(неявный бросок к кодексу ASCII)

Кодовый Фрагмент 12.5: C ++ внедрение алгоритма соответствия образца Boyer Moore (BM). Алгоритм выражен двумя статическими функциями: Метод BMmatch выполняет соответствие и называет вспомогательный buildLastFunc-tion функции, чтобы вычислить последнюю функцию, выраженную множеством, внесенным в указатель кодексом ASCII характера. Метод BMmatch указывает на отсутствие матча, возвращаясь

обычная стоимость-1.

570