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