Алгоритм Кнута-МоррисаПратта История Алгоритм был разработан Д.Кнутом и В.Праттом и, независимо от них, Д.Моррисом для эффективного поиска подстроки в строке. Результаты своей работы они опубликовали совместно в 1977 году. Д. Кнут Д. Моррис В. Пратт Принцип работы Алгоритм можно разделить на два этапа: • Создание префикс функции для образа(подстроки) • Поиск Префикс-функция Префикс-функция позволяет отбрасывать ненужные сравнения во время работы алгоритма. Префикс-функция для i-го символа образа возвращает значение, равное максимальной длине совпадающий префикса и суффикса подстроки в образе, которая заканчивается i-м символом. 0 1 2 3 4 5 a b a a b d 0 1 2 3 4 5 a b a a b d 0 0 1 2 3 4 5 a b a a b d 0 0 0 1 2 3 4 5 a b a a b d 0 0 0 1 2 3 4 5 a b a a b d 0 0 1 0 1 2 3 4 5 a b a a b d 0 0 1 0 1 2 3 4 5 a b a a b d 0 0 1 1 0 1 2 3 4 5 a b a a b d 0 0 1 1 0 1 2 3 4 5 a b a a b d 0 0 1 1 2 0 1 2 3 4 5 a b a a b d 0 0 1 1 2 0 Пример работы abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 abcabbaabcabd abcabd 0 1 2 3 4 5 a b c a b d 0 0 1 1 2 0 Сложность Из примера видно, что главный текст размера n мы проходим всего один раз. Также расходуется время для создания префикс-функции подстроки размера m. Соответственно временная сложность алгоритма O(n + m) Вывод Алгоритм эффективно и быстро работает, когда образец и строка поиска содержат повторяющиеся последовательности(Алгоритм Бойера-Мура в этом случае слегка уступает). Поэтому алгоритм широко применяется в олимпиадных задачах.