Префикс-функция: различия между версиями
Перейти к навигации
Перейти к поиску
Ctrlalt (обсуждение | вклад) Нет описания правки |
Ctrlalt (обсуждение | вклад) (→Ссылки) |
||
Строка 19: | Строка 19: | ||
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F neerc.ifmo.ru/wiki — Префикс-функция] | * [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%B5%D1%84%D0%B8%D0%BA%D1%81-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F neerc.ifmo.ru/wiki — Префикс-функция] | ||
* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BD%D1%83%D1%82%D0%B0-%D0%9C%D0%BE%D1%80%D1%80%D0%B8%D1%81%D0%B0-%D0%9F%D1%80%D0%B0%D1%82%D1%82%D0%B0 neerc.ifmo.ru/wiki — Алгоритм Кнута-Морриса-Пратта] | * [http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D0%BD%D1%83%D1%82%D0%B0-%D0%9C%D0%BE%D1%80%D1%80%D0%B8%D1%81%D0%B0-%D0%9F%D1%80%D0%B0%D1%82%D1%82%D0%B0 neerc.ifmo.ru/wiki — Алгоритм Кнута-Морриса-Пратта] | ||
* [http://brestprog.neocities.org/lections/prefixfunction.html brestprog.neocities.org — Префикс-функция. Алгоритм Кнута-Морриса-Пратта] | |||
Код: | Код: | ||
* [http://github.com/indy256/codelibrary/blob/master/java/src/Kmp.java CodeLibrary — Searching substring in O(N). Knuth–Morris–Pratt algorithm + prefix function] | * [http://github.com/indy256/codelibrary/blob/master/java/src/Kmp.java CodeLibrary — Searching substring in O(N). Knuth–Morris–Pratt algorithm + prefix function] |
Версия от 20:17, 27 января 2016
Префикс-функция строки s — массив длин максимальных бордеров всех префиксов s. Бордер — собственный префикс, одновременно являющийся собственным суффиксом.
for (int i = 1; i < n; i++) { int border = p[i - 1]; while (border > 0 && s[i] != s[border]) border = p[border - 1]; p[i] = border + (s[i] == s[border]); }
Применения:
- Поиск подстроки s в тексте t за O(N) (алгоритм Кнута-Морриса-Пратта). Составляется строка s#t, вычисляется её префикс-функция. Вхождения завершаются в позициях, для которых p[i] == |s|.
- Определение минимального периода m строки s за O(N). m = |s| - p[|s| - 1].
- Определение числа различных подстрок n строки s за O(N^2). Пусть известен ответ n' для s' = s[1 .. |s| - 1], за O(N) вычислим ответ для s. Новые подстроки — те, которые начинаются в начале строки и не встречаются далее. Вычисляем префикс-функцию s. Пусть m = max(p[i]). В s' уже встречались все префиксы s длиной ≤ m, поэтому n = n' + (|s| - m).
Ссылки
Теория:
- e-maxx.ru — Префикс-функция. Алгоритм Кнута-Морриса-Пратта
- neerc.ifmo.ru/wiki — Префикс-функция
- neerc.ifmo.ru/wiki — Алгоритм Кнута-Морриса-Пратта
- brestprog.neocities.org — Префикс-функция. Алгоритм Кнута-Морриса-Пратта
Код:
- CodeLibrary — Searching substring in O(N). Knuth–Morris–Pratt algorithm + prefix function
- Algos — Prefix function
Задачи: