Алгоритм Кнута — Морриса — Пратта
Алгоритм Кнута — Морриса — Пратта (КМП-алгоритм) — алгоритм поиска образца (подстроки) в строке.
Алгоритм был открыт Д. Кнутом и В. Праттом и, независимо от них, Д. Моррисом[1]. Результаты своей работы они опубликовали совместно в 1977 году.[2]
Содержание |
[править] Постановка задачи
Поставим следующую задачу: имеется образец
и строка
, и нужно определить индекс, начиная с которого строка
содержится в строке
. Если
не содержится в
— вернуть индекс, который не может быть интерпретирован как позиция в строке (например, отрицательное число). При необходимости отслеживать каждое вхождение образца в текст имеет смысл завести дополнительную функцию, вызываемую при каждом обнаружении образца.
[править] Описание алгоритма и оценка времени работы
Рассмотрим сравнение строк на позиции
, где образец
сопоставляется с частью текста
. Предположим, что первое несовпадение произошло между
и
, где
. Тогда
и
.
При сдвиге вполне можно ожидать, что префикс (начальные символы) образца
сойдется с каким-нибудь суффиксом (конечные символы) текста
. Длина наиболее длинного префикса, являющегося одновременно суффиксом, есть префикс-функция от строки
для индекса
.
Это приводит нас к следующему алгоритму: пусть
— префикс-функция от строки
для индекса
. Тогда после сдвига мы можем возобновить сравнения с места
и
без потери возможного местонахождения образца. Средствами амортизационного анализа можно показать, что таблица
может быть вычислена за
сравнений перед началом поиска. А поскольку строка
будет пройдена ровно один раз, суммарное время работы алгоритма будет равно
, где
- длина текста
.
[править] См. также
[править] Примечания
- ↑ Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4
- ↑ Donald Knuth; James H. Morris, Jr, Vaughan Pratt (1977). «Fast pattern matching in strings». SIAM Journal on Computing 6 (2): 323–350. DOI:10.1137/0206024.
