Алгоритм Кнута-Морриса-Пратта
Версия от 03:26, 21 июня 2011; 192.168.0.2 (обсуждение)
Постановка задачи
Дана цепочка
и образец . Требуется найти все позиции, начиная с которых входит в .Алгоритм решения
- любой символ, не входящий в алфавит и
- Псевдокод
P <-+ '$' + ; <вычисление префикс-функции для цепочки P> count <- 0 for (i = 0 .. (s - 1)) { if ( (t + i + 1) = t) { answer[count] <- i + 1 - t count <- count + 1 } }
- Корректность работы
Отметим, что из-за символа
значение для всех . По определению , если , то , то есть , то есть входит в , начиная с позиции . Пусть теперь входит в , начиная с позиции . Тогда . Иными словами, , что эквивалентно .- Время работы
(время подсчета для ) + (последующий ) .