Алгоритм Апостолико-Крочемора — различия между версиями
Строка 33: | Строка 33: | ||
Теперь опишем, как по уже вычисленной тройке <tex>(i, j, k)</tex> перейти к следующей. | Теперь опишем, как по уже вычисленной тройке <tex>(i, j, k)</tex> перейти к следующей. | ||
Возможны три случая в зависимости от значения <tex>i</tex>: | Возможны три случая в зависимости от значения <tex>i</tex>: | ||
+ | |||
+ | # <tex>i = l</tex>: | ||
+ | #: Если <tex>x[i] {{=}} y[i + j]</tex>, тогда следующая тройка <tex>(i + 1, j, k)</tex>. | ||
+ | #: Если <tex>x[i] \neq y[i + j]</tex>, тогда следующая тройка <tex>(l, j + 1, \max(0, k - 1))</tex>. | ||
+ | # <tex>l < i < m </tex> | ||
+ | #: Если <tex>x[i] {{=}} y[i + j]</tex>, тогда следующая тройка <tex>(i + 1, j, k)</tex>. | ||
+ | #: Если <tex>x[i] \neq y[i + j]</tex>, тогда возможны два случая в зависимости от значения <tex>t[i]</tex>: | ||
+ | #:* Если <tex>t[i] \le l</tex>, тогда следующая тройка <tex>(l, i + j - t[i], \max(0, t[i]))</tex>. | ||
+ | #:* Если <tex>t[i] > l</tex>, тогда следующая тройка <tex>(t[i], i + j - t[i], l)</tex>. | ||
+ | # <tex>i = m</tex>: | ||
+ | #: Если <tex> k < l </tex> и <tex>x[k] {{=}} y[j + k]</tex>, тогда следующая тройка <tex>(i, j, k + 1)</tex>. | ||
+ | #: Иначе |
Версия 21:21, 4 марта 2016
Эта статья находится в разработке!
Алгоритм Апостолико-Крочемора (англ. Apostolico-Crochemore algorithm) - вариация Алгоритма Бойера-Мура.
Характерные черты
- этап предобработки занимает времени и константное количество памяти,
- этап поиска занимает времени,
- выполняет сравнений в худшем случае.
Описание алгоритма
Нам даны:
— текст, — образец, , .Для начала рассмотрим ситуацию, когда мы сравниваем наш образец с
. Предположим, что первое несовпадение произойдет между и при . Тогда и . Когда сдвиг возможен, разумно ожидать что префикс шаблона совпадет c некоторым суффиксом . Более того, если мы ходим избежать несовпадения при сдвиге, то нужно чтобы символ, следующий за префиксом в шаблоне, не совпадал с . Такой наибольший префикс называется помеченным бордером строки .
Определение: |
помеченный бордер (англ. tagged border) строки | — строка .
Введем обозначение: пусть — длина наибольшего бордера для за которым следует символ и если нет такого помеченного бордера, где ( ). Затем после сдвига сравнение можно продолжить между символами и не потеряв никакого вхождения в и избежав отступа по тексту (смотри рис. 1).
Псевдокод
empty
Пусть теперь
, если и , иначе равно позиции первого элемента, который не равен ( , где и , а и ). На каждой итерации алгоритма мы выполняем сравнения с шаблоном в следующем порядке: .Во время поиска вхождений мы рассматриваем данную тройку
где:- шаблон сравнивается с
- и
- и
Вначале инициализируем эту тройку
. Теперь опишем, как по уже вычисленной тройке перейти к следующей. Возможны три случая в зависимости от значения :-
- Если , тогда следующая тройка .
- Если , тогда следующая тройка .
:
-
- Если , тогда следующая тройка .
- Если
- Если , тогда следующая тройка .
- Если , тогда следующая тройка .
, тогда возможны два случая в зависимости от значения :
-
- Если и , тогда следующая тройка .
- Иначе
: