Префикс-функция — различия между версиями
Строка 1: | Строка 1: | ||
==Определение== | ==Определение== | ||
− | Префикс-функцией цепочки <tex>S</tex> называется функция <tex>\pi(k) = max \{ j | j \leq k</tex> | + | Префикс-функцией цепочки <tex>S</tex> называется функция <tex>\pi(k) = max \{ j | j \leq k</tex> и <tex>s[0..j - 1] = s[k - j + 1..k] \}</tex> |
==Алгоритм вычисления== | ==Алгоритм вычисления== |
Версия 20:31, 27 июня 2011
Определение
Префикс-функцией цепочки
называется функция иАлгоритм вычисления
- Псевдокод
k = 0(0) = 0 for (i = 1 .. (n - 1)) { while (k > 0 && s[i] s[k]) k = (k - 1) if (s[i] == s[k]) k = k + 1 (i) = k }
- Корректность работы
Как видно из рисунка, при совпадении символов
и длина наибольшего общего префикса увеличивается на 1. В случае, когда символы и не совпадают, - следующая по максимальности длина потенциального наибольшего общего префикса- Время работы
Сперва отметим очевидный из определения факт:для любого . В самом деле, в противном случае не максимально. Теперь рассмотрим произвольную итерацию внешнего цикла . Возможно одно из трёх: 1) . Тогда значение увеличивается на 1, цикл не итерируется 2) . Тогда значение не изменяется, цикл не итерируется 3) итерируется хотя бы раз. При каждой итерации значение может, очевидно, лишь уменьшаться, при этом, в силу отмеченного выше очевидного наблюдения, общее число итераций для всех итераций не превышает Таким образом, общее время работы - .