Алгоритм Колусси — различия между версиями
Kabanov (обсуждение | вклад) (→Псевдокод) |
Kabanov (обсуждение | вклад) м |
||
| Строка 90: | Строка 90: | ||
* [http://www-igm.univ-mlv.fr/~lecroq/string/node10.html Colussi algorithm] | * [http://www-igm.univ-mlv.fr/~lecroq/string/node10.html Colussi algorithm] | ||
* [http://alg.csie.ncnu.edu.tw/course/StringMatching/Colussi.ppt Colussi.ppt] | * [http://alg.csie.ncnu.edu.tw/course/StringMatching/Colussi.ppt Colussi.ppt] | ||
| + | |||
| + | [[Категория: Дискретная математика и алгоритмы]] | ||
| + | [[Категория: Поиск подстроки в строке]] | ||
Версия 00:06, 15 мая 2014
Содержание
Алгоритм
Отметим, что нумерация символов строк и элементов массива у нас начинается с .
Сначала построим массивы: Kmp, Kmin, Rmin, Shift.
| Определение: |
| Обозначим за функцию, возвращающую количество прыжков для позиций , которые являются полными. |
| Определение: |
| Обозначим за функцию, возвращающую наименьший из периодов шаблона, которые больше позиции , для позиций, которые являются пустыми. |
| Определение: |
| Функция сдвига |
Псевдокод
Наивный вариант
int[] buildHmax(char[] x, int m):
int hmax[m + 1]
for k = 1 .. m
int i = k
while x[i] == x[i - k]
i++
hmax[k] = i
return hmax
Явная реализация по определению, очевидно, работает за и требует памяти.
Улучшенный вариант
int[] buildHmax(char[] x, int m):
int hmax[m + 1]
int i = 1
int k = 1
while k <= m
while x[i] == x[i - k]
i++;
hmax[k] = i
int q = k + 1
while hmax[q - k] + k < i
hmax[q] = hmax[q - k] + k
q++
k = q
if k == i + 1
i = k
return hmax
На каждой итерации цикла увеличивается либо переменная , либо (или переменная , которая используется в конечном счете для обновления ). Поскольку и в начале и в конце алгоритма, количество итераций алгоритма не превосходит . Следовательно функция требует времени и памяти.
Функция для построения массива .
int[] buildKmin(int[] hmax, int m)
int kmin[m]
for i = m .. 1
if hmax[i] < m
kmin[hmax[i]] = i
return kmin
Функция для построения массива .
int[] buildRmin(int[] hmax, int[] kmin, int m)
int rmin[m]
int r = 0
for i = m - 1 .. 0
if hmax[i + 1] == m
r = i + 1
if kmin[i] == 0
rmin[i] = r
else
rmin[i] = 0
return rmin
Асимптотики
- partitions the set of pattern positions into two disjoint subsets; the positions in the first set are scanned from left to right and when no mismatch occurs the positions of the second subset are scanned from right to left;
- preprocessing phase in time and space complexity;
- searching phase in time complexity;
- performs text character comparisons in the worst case.