Алгоритм Колусси — различия между версиями
Kabanov (обсуждение | вклад) |
Kabanov (обсуждение | вклад) (→Псевдокод) |
||
Строка 35: | Строка 35: | ||
hmax[k] = i | hmax[k] = i | ||
return hmax | return hmax | ||
+ | Явная реализация по определению, очевидно, работает за <tex>O(m^2)</tex> и требует <tex>O(m)</tex> памяти. | ||
'''Улучшенный вариант''' | '''Улучшенный вариант''' | ||
+ | |||
'''int'''[] buildHmax('''char'''[] x, '''int''' m): | '''int'''[] buildHmax('''char'''[] x, '''int''' m): | ||
'''int''' hmax[m + 1] | '''int''' hmax[m + 1] | ||
Строка 53: | Строка 55: | ||
i = k | i = k | ||
'''return''' hmax | '''return''' hmax | ||
+ | На каждой итерации цикла увеличивается либо переменная <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>Kmin</tex>. | ||
+ | '''int'''[] buildKmin('''int'''[] hmax, '''int''' m) | ||
+ | '''int''' kmin[m] | ||
+ | '''for''' i = m .. 1 | ||
+ | '''if''' hmax[i] < m | ||
+ | kmin[hmax[i]] = i | ||
+ | '''return''' kmin | ||
+ | |||
+ | Функция для построения массива <tex>Rmin</tex>. | ||
+ | '''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 | ||
==Асимптотики== | ==Асимптотики== |
Версия 00:02, 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.