Префикс-функция — различия между версиями
Vasin (обсуждение | вклад) (→Время работы) |
Vasin (обсуждение | вклад) (→Оптимизация) |
||
Строка 36: | Строка 36: | ||
==Оптимизация== | ==Оптимизация== | ||
− | + | В начале приводится псевдокод алгоритма, а затем его обоснование. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===Псевдокод=== | ===Псевдокод=== | ||
'''Prefix_function''' (<tex>s</tex>) | '''Prefix_function''' (<tex>s</tex>) | ||
Строка 54: | Строка 48: | ||
<tex>\pi</tex>[i] = k | <tex>\pi</tex>[i] = k | ||
'''return''' <tex>\pi</tex> | '''return''' <tex>\pi</tex> | ||
+ | |||
+ | ===Корректность работы=== | ||
+ | Начнем с рассмотрения леммы, в которой показано, что путем итерации префиксной функции <tex>\pi</tex> можно перечислить все префиксы длины <tex> k</tex> <tex>s_k</tex>, которые являются истинными суффиксами заданного префикса длины <tex>i</tex> <tex>s_i</tex>. Введем обозначение <tex> \pi ' [i] = (\pi[i], \pi^{2}[i], ..., \pi^{t}[i])</tex>, где величина <tex>\pi^{j}[i]</tex> обозначает <tex>j</tex>-ю итерацию префиксной функции, т.е. <tex>\pi^{0}[i] = i</tex> и при <tex> i \ge 1</tex> <tex>\pi^{j}[i] = \pi[\pi^{j-1}[i]]</tex>. Кроме того, понятно, что последовательность <tex>\pi'[i]</tex> обрывается, когда в ней будет достигнуто значение <tex>\pi^t[i] = 0</tex>. | ||
+ | {{Лемма | ||
+ | |about= | ||
+ | Лемма об итерации префиксной функции | ||
+ | |statement= | ||
+ | Пусть <tex>s</tex> - строка длиной <tex>n</tex> с префиксной функцией <tex>\pi</tex>. Тогда для всех <tex> i = 0,1,..,n</tex> имеем <tex>\pi'[i] = (k : k < q</tex> и <tex>s_k s_i</tex>. | ||
===Время работы=== | ===Время работы=== |
Версия 21:09, 8 июня 2012
Префикс-функция строки
— функция .Содержание
Алгоритм
Наивный алгоритм вычисляет префикс функцию непосредственно по определению, сравнивая префиксы и суффиксы строк.
Пример
Рассмотрим строку abcabcd, для которой значение префикс-функции равно
.Шаг | Строка | Значение функции |
---|---|---|
a | 0 | |
ab | 0 | |
abc | 0 | |
abca | 1 | |
abcab | 2 | |
abcabc | 3 | |
abcabcd | 0 |
Псевдокод
Prefix_function () = [] for i = 1 to n for k = 1 to i - 1 if s[1..k] == s[i - k + 1..i] [i] = k return
Время работы
Всего
итераций цикла, на каждой из который происходит сравнение строк за , что дает в итоге .Оптимизация
В начале приводится псевдокод алгоритма, а затем его обоснование.
Псевдокод
Prefix_function () = 0 for i = 2 to n k = [i - 1] while k > 0 && s[i] != s[k + 1] k = [k] if s[i] == s[k + 1] k++ [i] = k return
Корректность работы
Начнем с рассмотрения леммы, в которой показано, что путем итерации префиксной функции
можно перечислить все префиксы длины , которые являются истинными суффиксами заданного префикса длины . Введем обозначение , где величина обозначает -ю итерацию префиксной функции, т.е. и при . Кроме того, понятно, что последовательность обрывается, когда в ней будет достигнуто значение . {{Лемма |about= Лемма об итерации префиксной функции |statement= Пусть - строка длиной с префиксной функцией . Тогда для всех имеем и .Время работы
С помощью метода потенциалов можно показать, что время работы
. Потенциал величины связывается с текущим ее значением в алгоритме. Начальное значение этого потенциала равно нулю. На каждой итерации цикла значение уменьшается, поскольку . Однако в силу значение этой переменной не бывает отрицательным. Также значение изменяется не более чем на 1 внутри тела цикла . Поскольку перед входом в цикл выполняется и поскольку значение переменной увеличивается в каждой итерации цикла , справедливость неравенства сохраняется (подтверждая тот факт, что соблюдается также неравенство . Каждое выполнение тела цикла можно оплатить соответствующим уменьшение потенциальной функции, поскольку . Кроме этого значение потенциальной функции возрастает не более чем на 1, из-за этого амортизированная стоимость тела цикла — . Так как количество итераций , и поскольку конечное значение потенциальной функции по величине не меньше, чем ее начальное значение, полное время работы в наихудшем случае равно .Литература
Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.