Алгоритм Апостолико-Крочемора — различия между версиями
Строка 1: | Строка 1: | ||
{{в разработке}} | {{в разработке}} | ||
'''Алгоритм Апостолико-Крочемора''' (англ. ''Apostolico-Crochemore algorithm'') - вариация [[Алгоритм Бойера-Мура|Алгоритма Бойера-Мура]]. | '''Алгоритм Апостолико-Крочемора''' (англ. ''Apostolico-Crochemore algorithm'') - вариация [[Алгоритм Бойера-Мура|Алгоритма Бойера-Мура]]. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
==Описание алгоритма== | ==Описание алгоритма== | ||
Строка 24: | Строка 19: | ||
empty | empty | ||
− | Пусть теперь <tex>l {{=}} 0</tex>, если <tex>x = c ^ m</tex> и <tex>c \in \Sigma</tex>, иначе <tex>l</tex> равно позиции первого элемента, который не равен <tex>x[0]</tex> (<tex>x {{=}} | + | Пусть теперь <tex>l {{=}} 0</tex>, если <tex>x = c ^ m</tex> и <tex>c \in \Sigma</tex>, иначе <tex>l</tex> равно позиции первого элемента, который не равен <tex>x[0]</tex> (<tex>x {{=}} a ^ l bu</tex>, где <tex>a</tex> и <tex>b \in \Sigma</tex>, а <tex>u \in \Sigma^*</tex> и <tex>a \neq b</tex>). На каждой итерации алгоритма мы выполняем сравнения с шаблоном в следующем порядке: <tex>l, l + 1, \ldots , m - 2, m - 1, 0, 1, \ldots , l - 1</tex>. |
Во время поиска вхождений мы рассматриваем данную тройку <tex>(i, j, k)</tex> где: | Во время поиска вхождений мы рассматриваем данную тройку <tex>(i, j, k)</tex> где: | ||
Строка 44: | Строка 39: | ||
# <tex>i = m</tex>: | # <tex>i = m</tex>: | ||
#: Если <tex> k < l </tex> и <tex>x[k] {{=}} y[j + k]</tex>, тогда следующая тройка <tex>(i, j, k + 1)</tex>. | #: Если <tex> k < l </tex> и <tex>x[k] {{=}} y[j + k]</tex>, тогда следующая тройка <tex>(i, j, k + 1)</tex>. | ||
− | #: Иначе | + | #: Иначе либо <tex>k < l</tex> и <tex>x[k] \ne y[l + k]</tex>, либо <tex>k = l</tex>. Если <tex>k = l</tex>, то вхождение x в y найдено. В обоих случаях следующая тройка вычисляется как в случае <tex>l < i < m </tex>. |
+ | |||
+ | ==Асимптотика алгоритма== | ||
+ | Стадия предподсчета, а именно вычисление массива <tex>t</tex> и переменной <tex>l</tex> занимает <math>O(m)</math> времени и константное количество памяти. Этап поиска занимает <math>O(n)</math> времени более того алгоритм в худшем случае выполнит <tex>\frac{3}{2} n</tex> сравнений. |
Версия 22:23, 4 марта 2016
Эта статья находится в разработке!
Алгоритм Апостолико-Крочемора (англ. Apostolico-Crochemore algorithm) - вариация Алгоритма Бойера-Мура.
Описание алгоритма
Нам даны:
— текст, — образец, , .Для начала рассмотрим ситуацию, когда мы сравниваем наш образец с
. Предположим, что первое несовпадение произойдет между и при . Тогда и . Когда сдвиг возможен, разумно ожидать что префикс шаблона совпадет c некоторым суффиксом . Более того, если мы ходим избежать несовпадения при сдвиге, то нужно чтобы символ, следующий за префиксом в шаблоне, не совпадал с . Такой наибольший префикс называется помеченным бордером строки .
Определение: |
помеченный бордер (англ. tagged border) строки | — строка .
Введем обозначение: пусть — длина наибольшего бордера для за которым следует символ и если нет такого помеченного бордера, где ( ). Затем после сдвига сравнение можно продолжить между символами и не потеряв никакого вхождения в и избежав отступа по тексту (смотри рис. 1).
Псевдокод
empty
Пусть теперь
, если и , иначе равно позиции первого элемента, который не равен ( , где и , а и ). На каждой итерации алгоритма мы выполняем сравнения с шаблоном в следующем порядке: .Во время поиска вхождений мы рассматриваем данную тройку
где:- шаблон сравнивается с
- и
- и
Вначале инициализируем эту тройку
. Теперь опишем, как по уже вычисленной тройке перейти к следующей. Возможны три случая в зависимости от значения :-
- Если , тогда следующая тройка .
- Если , тогда следующая тройка .
:
-
- Если , тогда следующая тройка .
- Если
- Если , тогда следующая тройка .
- Если , тогда следующая тройка .
, тогда возможны два случая в зависимости от значения :
-
- Если и , тогда следующая тройка .
- Иначе либо и , либо . Если , то вхождение x в y найдено. В обоих случаях следующая тройка вычисляется как в случае .
:
Асимптотика алгоритма
Стадия предподсчета, а именно вычисление массива
и переменной занимает времени и константное количество памяти. Этап поиска занимает времени более того алгоритм в худшем случае выполнит сравнений.