Алгоритм Апостолико-Крочемора — различия между версиями
| Строка 43: | Строка 43: | ||
==Асимптотика алгоритма== | ==Асимптотика алгоритма== | ||
Стадия предподсчета, а именно вычисление массива <tex>t</tex> и переменной <tex>l</tex> занимает <math>O(m)</math> времени и константное количество памяти. Этап поиска занимает <math>O(n)</math> времени более того алгоритм в худшем случае выполнит <tex>\frac{3}{2} n</tex> сравнений. | Стадия предподсчета, а именно вычисление массива <tex>t</tex> и переменной <tex>l</tex> занимает <math>O(m)</math> времени и константное количество памяти. Этап поиска занимает <math>O(n)</math> времени более того алгоритм в худшем случае выполнит <tex>\frac{3}{2} n</tex> сравнений. | ||
| + | |||
| + | ==См. также== | ||
| + | *[[Алгоритм Кнута-Морриса-Пратта|Алгоритм Кнута-Морриса-Пратта]] | ||
| + | *[[Алгоритм Бойера-Мура|Алгоритм Бойера-Мура]] | ||
| + | |||
| + | |||
| + | ==Источники информации== | ||
| + | *[[wikipedia:en:Apostolico–Giancarlo algorithm | Wikipedia {{---}} Apostolico–Giancarlo algorithm]] | ||
| + | *[http://www-igm.univ-mlv.fr/~lecroq/string/node12.html#SECTION00120 Краткое описание алгоритма, пример работы] | ||
| + | |||
| + | [[Категория:Алгоритмы и структуры данных]] | ||
| + | [[Категория:Поиск подстроки в строке]] | ||
| + | [[Категория:Точный поиск]] | ||
Версия 22:37, 4 марта 2016
Алгоритм Апостолико-Крочемора (англ. Apostolico-Crochemore algorithm) - вариация Алгоритма Бойера-Мура.
Содержание
Описание алгоритма
Нам даны: — текст, — образец, , .
Для начала рассмотрим ситуацию, когда мы сравниваем наш образец с . Предположим, что первое несовпадение произойдет между и при . Тогда и . Когда сдвиг возможен, разумно ожидать что префикс шаблона совпадет c некоторым суффиксом . Более того, если мы ходим избежать несовпадения при сдвиге, то нужно чтобы символ, следующий за префиксом в шаблоне, не совпадал с . Такой наибольший префикс называется помеченным бордером строки .
| Определение: |
| помеченный бордер (англ. tagged border) строки — строка . |
Введем обозначение: пусть — длина наибольшего бордера для за которым следует символ и если нет такого помеченного бордера, где (). Затем после сдвига сравнение можно продолжить между символами и не потеряв никакого вхождения в и избежав отступа по тексту (смотри рис. 1).
Псевдокод
empty
Пусть теперь , если и , иначе равно позиции первого элемента, который не равен (, где и , а и ). На каждой итерации алгоритма мы выполняем сравнения с шаблоном в следующем порядке: .
Во время поиска вхождений мы рассматриваем данную тройку где:
- шаблон сравнивается с
- и
- и
Вначале инициализируем эту тройку . Теперь опишем, как по уже вычисленной тройке перейти к следующей. Возможны три случая в зависимости от значения :
- :
- Если , тогда следующая тройка .
- Если , тогда следующая тройка .
-
- Если , тогда следующая тройка .
- Если , тогда возможны два случая в зависимости от значения :
- Если , тогда следующая тройка .
- Если , тогда следующая тройка .
- :
- Если и , тогда следующая тройка .
- Иначе либо и , либо . Если , то вхождение x в y найдено. В обоих случаях следующая тройка вычисляется как в случае .
Асимптотика алгоритма
Стадия предподсчета, а именно вычисление массива и переменной занимает времени и константное количество памяти. Этап поиска занимает времени более того алгоритм в худшем случае выполнит сравнений.
См. также