Изменения

Перейти к: навигация, поиск

Алгоритм Колусси

1282 байта добавлено, 00:58, 15 мая 2014
Нет описания правки
Отметим, что нумерация символов строк и элементов массива у нас начинается с <tex>0</tex>.
Сначала построим массивы: Обозначим <tex>Kmp, Kmin, Rmin, Shift</tex> [[Префикс-функция|префикс-функцию]]. При этом она должна быть определена для <tex>x[0] \dots x[m-1]</tex> и иметь значение <tex>-1</tex> по умолчанию.
{{Определение
|definition=Обозначим за Для всех <tex>\mathrm{Kmin}(i)=i - \mathrm{Kmp}(i)</tex> функциютаких, возвращающую количество прыжков для позиций что <tex>0 \leqslant i</tex>, которые являются полными.}} {{Определение|definition=Обозначим за <tex>\mathrm{Rmin}(i)leqslant m-1</tex> функцию, возвращающую наименьший из периодов шаблона, которые больше позиции <tex>iвыполняется:<br/tex>, для позиций, которые являются пустыми.}} {{Определение|definition=Функция сдвига <tex>\mathrm{ShiftKmin}(i) = \begin{cases} \mathrm{Rmin}(i)d, & \mbox{if } d > 0\ and\ x[0 \mathrm{Kmp}(dots i) -1-d]= x[d \dots i-1]\ and\ x[i-d] \neq x[i]\\ \mathrm{Kmin}(i)0, & \mbox{otherwise}
\end{cases}</tex>
}}
 
 
 
 
==Псевдокод==
 
'''Наивный вариант'''
'''int'''[] buildHmax('''char'''[] x, '''int''' m):
На каждой итерации цикла увеличивается либо переменная <tex>i</tex>, либо <tex>k</tex> (или переменная <tex>q</tex>, которая используется в конечном счете для обновления <tex>k</tex>). Поскольку <tex>i = 1</tex> и <tex>k = 1</tex> в начале и <tex>i < k = m + 1</tex> в конце алгоритма, количество итераций алгоритма не превосходит <tex>2 \cdot m</tex>. Следовательно функция требует <tex>O(m)</tex> времени и памяти.
Функция для построения массива <tex>\mathrm{Kmin}</tex>.
'''int'''[] buildKmin('''int'''[] hmax, '''int''' m)
'''int''' kmin[m]
'''return''' kmin
Функция для построения массива <tex>\mathrm{Rmin}</tex>.
'''int'''[] buildRmin('''int'''[] hmax, '''int'''[] kmin, '''int''' m)
'''int''' rmin[m]
'''for''' i = m - 1 .. 0
'''if''' hmax[i + 1] == m
<font color="green">// <tex>r</tex> {{---}} первое число большее, чем <tex>i</tex> и такое, что шаблон имеет период <tex>r</tex></font>
r = i + 1
'''if''' kmin[i] == 0
rmin[i] = 0
return rmin
 
Функция для построение массива <tex>\mathrm{Shift}</tex>.
'''int'''[] buildShift('''int'''[] kmin, '''int'''[] rmin, '''int'''[] h, '''int''' nd, '''int''' m)
'''int''' shift[m + 1]
'''for''' i = 0 .. nd
shift[i] = kmin[h[i]]
'''for''' i = nd + 1 .. m - 1
shift[i] = rmin[h[i]]
shift[m] = rmin[0]
'''return''' shift
 
Функция для построения массива <tex>\mathrm{Next}</tex>.
 
==Асимптотики==
==Сравнение с другими алгоритмами==
===Достоинства===
* Поиск выполняется за <tex>O(n)</tex> в отличие от [[Алгоритм Кнута-Морриса-Пратта|алгоритма Кнута-Морриса-Пратта]], поиск в котором занимается <tex>O(n+m)</tex>, что помогает уменьшить константу при <tex>m~n</tex>.
* Фаза предобработки выполняется за <tex>O(m)</tex> в отличие от [[Алгоритм Бойера-Мура|алгоритма Бойера-Мура]], где в наилучшем случае можно получить время <tex>O(n+|\Sigma|)</tex>, что плохо при больших алфавитах.
===Недостатки===
* Сложность реализации.==СсылкиИсточники==* COLUSSI L., 1991, Correctness and efficiency of the pattern matching algorithms, Information and Computation 95(2):225-251.
* [http://www-igm.univ-mlv.fr/~lecroq/string/node10.html Colussi algorithm]
* [http://alg.csie.ncnu.edu.tw/course/StringMatching/Colussi.ppt Colussi.ppt]
418
правок

Навигация