Алгоритм Кнута-Морриса-Пратта
Версия от 05:10, 8 мая 2011; Логунов Глеб (обсуждение | вклад) (Новая страница: «==Постановка задачи== Дана цепочка <tex>S</tex> и образец <tex>T</tex>. Требуется найти все позиции, на…»)
Постановка задачи
Дана цепочка
и образец . Требуется найти все позиции, начиная с которых входит в .Алгоритм решения
- любой символ, не входящий в алфавит и
- Псевдокод
P <-+ '$' + ; <вычисление префикс-функции для цепочки P> count <- 0 for (i = 0..s - 1) { if ( (t + i + 1) = t) { answer[count] <- i + 1 - t count <- count + 1 } }
- Корректность работы
Отметим, что из-за символа
значение для всех . По определению , если , то , то есть , то есть входит в , начиная с позиции . Пусть теперь входит в , начиная с позиции . Тогда . Иными словами, , что эквивалентно .- Время работы
(время подсчета для ) + (последующий ) .