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