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