Префикс-функция — различия между версиями
| Строка 8: | Строка 8: | ||
<tex>\pi</tex>(0) <- 0 | <tex>\pi</tex>(0) <- 0 | ||
for (i <- 1..n - 1) { | for (i <- 1..n - 1) { | ||
| − | while (k > 0 && s[i] | + | while (k > 0 && s[i] <tex>\ne</tex> s[k]) |
k <- <tex>\pi</tex>(k - 1) | k <- <tex>\pi</tex>(k - 1) | ||
if (s[i] = s[k]) | if (s[i] = s[k]) | ||
| Строка 18: | Строка 18: | ||
Теперь рассмотрим произвольную итерацию внешнего цикла <tex>for</tex>. Возможно одно из трёх: | Теперь рассмотрим произвольную итерацию внешнего цикла <tex>for</tex>. Возможно одно из трёх: | ||
# <tex>s[i] = s[k]</tex>. Тогда значение <tex>k</tex> увеличивается на 1, цикл <tex>while</tex> не итерируется | # <tex>s[i] = s[k]</tex>. Тогда значение <tex>k</tex> увеличивается на 1, цикл <tex>while</tex> не итерируется | ||
| − | # <tex>k = 0 \& s[i] | + | # <tex>k = 0 \& s[i] \ne s[k]</tex>. Тогда значение <tex>k</tex> не изменяется, цикл <tex>while</tex> не итерируется |
| − | # <tex>while</tex> итерируется хотя бы раз. При каждой итерации <tex>while</tex> значение <tex>k</tex> может, очевидно, лишь уменьшаться, при этом, в силу отмеченного выше очевидного наблюдения, общее число итераций <tex>while</tex> для всех итераций <tex>for</tex> не превышает <tex> | + | # <tex>while</tex> итерируется хотя бы раз. При каждой итерации <tex>while</tex> значение <tex>k</tex> может, очевидно, лишь уменьшаться, при этом, в силу отмеченного выше очевидного наблюдения, общее число итераций <tex>while</tex> для всех итераций <tex>for</tex> не превышает <tex>n</tex> |
| − | Таким образом, общее время работы - <tex>O( | + | Таким образом, общее время работы - <tex>O(n)</tex>. |
Версия 05:04, 8 мая 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, цикл не итерируется
- . Тогда значение не изменяется, цикл не итерируется
- итерируется хотя бы раз. При каждой итерации значение может, очевидно, лишь уменьшаться, при этом, в силу отмеченного выше очевидного наблюдения, общее число итераций для всех итераций не превышает
Таким образом, общее время работы - .