Автомат Кнута-Морриса-Пратта
Автомат Кнута-Морриса-Пратта используется в алгоритмах связанных с поиском образца в тексте, в том числе в реальном времени.
Содержание
Основные определения
| Определение: |
Конечным автоматом(finite-state machine) называется набор из пяти элементов:
|
Пример конечного автомата
Нулевое состояние обозначим стартовым, а допускающим будет только первое. Алфавит взят Такой автомат допускает все строки, в которых нечетное количество символов .
| Определение: |
| Для строки длиной функция называется суффикс-функцией, если каждой строке сопоставляется длина ее максимального суффикса, являющегося префиксом . |
Структура автомата
Автомат строится на строке-образце длины , которую в будущем мы будем искать в тексте.
Для автомата Кнута-Морриса-Пратта:
- , где — это состояние, — символ, по которому осуществляется переход, a "" — операция конкатенации ().
Таким образом, если часть текста, в котором мы ищем образец, уже пропущена через автомат, то текущее состояние отражает, сколько последних символов этой прочитанной части совпадает с началом нашего образца. Если мы пришли в допускающее состояние, значит последние m символов полностью совпадают с образцом и мы нашли включение.
Заметим, что тот факт, что переход по символу осуществляется независимо от последующих, позволяет нам работать как с текстом, данным заранее, так и с текстом, который вводится в реальном времени.
Пример автомата Кнута-Морриса-Пратта
Данный автомат построен для образца "" и алфавита
Построение автомата
Идея алгоритма
Для каждого состояния и каждого символа будем определять значение функции перехода из данного состояния по данному символу. Пусть текущее состояние . При считывании каждого нового символа из текста возможно два варианта развития событий:
- Символ совпадает с символом строки .
Это значит, что число последних символов текста, совпадающих с началом образца увеличилось на 1. Значит переход осуществляется в следующее состояние. В этом случае .
- Символ не совпадает с символом строки .
Тогда заметим, что если к строке, являющейся максимальным бордером предыдущего совпадения, добавить прочитанный символ, то как раз получится текущее окончание текста, совпадающее с началом образца. Таким образом, в этом случае .
( — префикс-функция, она возвращает длину максимального бордера для префикса строки длины ) Исключением для этого случая является лишь нулевое состояние. Если считанный символ не совпадает с первым символом образца, то мы останемся в нулевом состоянии, так как по прежнему совпадением является пустая строка.
Асимптотика
В данном алгоритме нам нужно лишь вычислить значение функции перехода в каждом состоянии для каждого символа. При предподсчитанной за префикс-функции вычисление для одного состояния и одного символа происходит за . Всего состояний , а символов . Итого .
Псевдокод
for q = 0 to m for a if q > 0 and a s[q + 1] (q, a) = ((q), a) if c = s[q + 1] (q, a) = q + 1 else (q, a) = q
См. также
Источники информации
- Wikipedia — Finite-state machine
- ISBN 978-5-8459-1794-2 Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн — Алгоритмы. Построение и анализ.

