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

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

Работа

Алгоритм соответствия образца «в лоб» не мог быть более простым. Это состоит из два

вложенные петли, с внешней индексацией петли через все возможные стартовые индексы образца в тексте и внутренней индексацией петли через каждый характер образца, сравнивая его с его потенциально соответствующим характером в тексте. Таким образом правильность алгоритма соответствия образца «в лоб» немедленно следует от этого исчерпывающего подхода поиска.

Продолжительность образца «в лоб», совпадающего по худшему случаю, не хороша, однако, потому что для каждого индекса кандидата в T мы можем выступить до m сравнений характера, чтобы обнаружить, что P не соответствует T в текущем индексе. Что касается

Кодовый Фрагмент 12.3, мы видим, что внешнее для петли выполнено в большей части n- m + 1

в большинство m раз выполнены времена и внутренняя петля. Таким образом, продолжительность

метод «в лоб» - O ((n- m + 1) m), который упрощен как O (nm). Отметьте это

когда m = n/2, у этого алгоритма есть квадратная продолжительность O (n2).

Пример 12.4: Предположим, что нам дают текстовую строку

T = «abacaabaccabacabaabb»

и последовательность образца

P = «abacab».

В рисунке 12.3 мы иллюстрируем выполнение алгоритма соответствия образца «в лоб» на T и P.

Рисунок 12.3: пробег В качестве примера алгоритма соответствия образца «в лоб». algo-rithm выполняет 27 сравнений характера, обозначенных выше с числовыми этикетками.

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

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

Сначала, мы могли бы чувствовать, что всегда необходимо исследовать каждый характер в T

чтобы определить местонахождение образца P как подстрока. Но это не всегда имеет место. Алгоритм соответствия образца Boyer Moore (BM), который мы изучаем в этой секции, может иногда избегать сравнений между P и значительной частью знаков в T. Единственный протест состоит в том, что, тогда как алгоритм «в лоб» может работать даже с потенциально неограниченным алфавитом, алгоритм BM предполагает, что алфавит имеет фиксированный, конечный размер. Это работает самое быстрое, когда алфавит умеренно измерен, и образец относительно длинен. Таким образом алгоритм BM идеален для поиска слов в документах. В этой секции мы описываем упрощенную версию оригинального алгоритма Бойером и Муром.

Главная идея алгоритма BM состоит в том, чтобы улучшить продолжительность алгоритма грубой силы, добавив две потенциально экономящих время эвристики. Примерно заявленный, они эвристика следующие: Эвристическое зеркало: проверяя возможное размещение P против T, начать

сравнения от конца P и двигаются назад во фронт P.

Эвристический скачок характера: Во время тестирования возможного размещения P против

T, несоответствие текстового символа T [я] = c с соответствующей случайной работой образца - актер П [j] обработан следующим образом. Если c не содержится нигде в P, то перейдите, P полностью мимо T [я] (для него не может соответствовать никакому характеру в P). Иначе, переместите P, пока возникновение характера c в P не будет выровнено с T [я].

Мы формализуем их эвристика вскоре, но на интуитивном уровне, они работают интегрированной командой. Зеркало эвристические наборы другое эвристическое, чтобы позволить нам избегать сравнений между P и целыми группами знаков в T. В этом случае, по крайней мере, мы можем добраться до места назначения быстрее, идя назад, поскольку, если мы сталкиваемся с несоответствием во время рассмотрения P в определенном местоположении в T, тогда мы, вероятно, избежим большого количества бесполезных сравнений, значительно переходя P относительно T использование эвристического скачка характера. Эвристические платежи скачка характера от большого, если это может быть применено рано в тестировании потенциального размещения P против T.

Давайте поэтому перейдем к бизнесу определения, как эвристика скачка характера может быть объединена в алгоритм соответствия образца последовательности. Чтобы осуществить это эвристическое, мы определяем функцию, последнюю (c), который берет характер c от алфавита и характеризует, как далеко мы можем переместить образец P, если характер, равный c, найден в тексте, который не соответствует образцу. В частности мы определяем последний (c) как:

• Если c находится в P, последний (c) индекс последнего (самого правого) возникновения c в P.

Иначе, мы традиционно определяем последний (c) =-1.

Если знаки могут использоваться в качестве индексов во множествах, то последняя функция может быть легко

осуществленный как справочная таблица. Мы оставляем метод для вычисления этого стола в

O (m +|S ) время, данное P, как простое осуществление (Упражнение R-12.8). Эта последняя функция

дает нам всю информацию, мы должны выполнить эвристический скачок характера.