- •Содержание
- •Введение
- •Часть 1. Теоретические сведения об алгоритмах поиска подстроки в строке
- •Основные понятия.
- •Строка, её длина, подстрока.
- •1.1.2. Понятие о сложности алгоритма.
- •1.2. Алгоритмы основанные на методе последовательного поиска.
- •1.2.1. Алгоритм последовательного (прямого) поиска (The Brute Force Algorithm).
- •1.2.2. Алгоритм Рабина.
- •Алгоритм Кнута - Морриса - Пратта (кмп).
- •1.4. Алгоритм Бойера – Мура и некоторые его модификации.
- •1.4.1. Алгоритм Боейера – Мура.
- •1.4.2. Модификации бм. Быстрый поиск (Классификация Thierry Lecroq [2]).
- •Т Листинг 6 урбо бм (Классификация Thierry Lecroq [2]).
- •1.5. Поиск подстрок с помощью конечного автомата.
- •1.5.1. Структура автомата.
- •1.5.2 Автоматные языки
- •1.5.3.Пример построения конечного автомата
- •1.6 Специфические алгоритмы
- •1.6.1 Турбо - обращение сегмента
- •1.6.2 Алгоритм Сдвига-Или
- •Часть 2.Экспериментальный анализ алгоритмов
- •2.1. Работа программы и результат
- •2.2. Суть эксперимента.
- •2.2. Результаты и анализ эксперимента.
- •Список литературы
Алгоритм Кнута - Морриса - Пратта (кмп).
Вначале рассмотрим некоторые вспомогательные утверждения. Для произвольного слова X рассмотрим все его начала, одновременно являющиеся его концами, и выберем из них самое длинное (не считая, конечно, самого слова X). Обозначим его n(X). Такая функция носит название префикс – функции [13].
Примеры.
n(aba)=a, n(n(aba))=n(a)=L;
n(abab)=ab, n(n(abab))=n(ab)=L;
n(ababa)=aba, n(n(ababa))=n(aba)=a, n(n(n(ababa)))=n(a)=L; n(abc)=L.
Докажем несколько используемых впоследствии фактов, а именно предложение (по [Шень,1995,с.165-166]):
(1) Последовательность слов n(X),n(n(X)),n(n(n(X))),... "обрывается" (на пустом слове L).
(2) Все слова n(X),n(n(X)),n(n(n(X))),...,L являются началами слова X.
(3) Любое слово, одновременно являющееся началом и концом слова X (кроме самого X), входит в последовательность n(X),n(n(X)),....,L.
Доказательство.
(1) Тривиально, т.к. каждое слово короче предыдущего.
(2) Каждое из них (по определению) является началом предыдущего. По той же причине все они являются концами слова X.
(3) Пусть слово Y является одновременно началом и концом X. Слово n(X) - самое длинное из таких слов, так что Y не длиннее n(X). Оба эти слова являются началами X, поэтому более короткое из них является началом более длинного: Y есть начало n(X). Аналогично, Y есть конец n(X). Рассуждая по индукции, можно предполагать, что утверждение задачи верно для всех слов короче X, в частности, для слова n(X). Так что слово Y, являющееся концом и началом n(X), либо равно n(X), либо входит в последовательность n(n(X)),n(n(n(X))),...,,L.
Предложение доказано.
Метод КМП использует
предобработку искомой строки, а именно:
на ее основе создается префикс-функция.
При этом используется следующая идея:
если префикс (он же суффикс) строки
длинной i длиннее одного символа, то он
одновременно и префикс подстроки длинной
i-1 (Листинг 3). Таким образом, мы проверяем
префикс предыдущей подстроки, если же
тот не подходит, то префикс ее префикса,
и т.д. Действуя так, находим наибольший
искомый префикс. Следующий вопрос, на
который стоит
Error: Reference source not foundответить: почему время работы процедуры линейно, ведь в ней присутствует вложенный цикл? Ну, во-первых, присвоение префикс-функции происходит четко m раз, остальное время меняется переменная k. Так как в цикле while она уменьшается (P[k]<k), но не становится меньше 0, то уменьшаться она может не чаще, чем возрастать. Переменная k возрастает на 1 не более m раз. Значит, переменная k меняется всего не более 2m раз. Выходит, что время работы всей процедуры есть O(m) [1, 2].
А
Листинг 3
сейчас мы переходим к самому алгоритму, ищущему подстроку в строке (Листинг 4).
Листинг 4
Error: Reference source not foundДоказать что эта программа работает за линейное время, можно точно так же, как и для префикс - функции. Стало быть, общее время работы программы есть O(n+m), т. е. линейное время.
Напоследок заметим, что алгоритм последовательного поиска и алгоритм КМП помимо нахождения самих строк считают, сколько символов совпало в процессе работы.
