Алгоритм Ахо-Корасик — различия между версиями
(Первая версия статьи (статья ещё не дописана)) |
Tsar (обсуждение | вклад) (Продолжение статьи) |
||
Строка 19: | Строка 19: | ||
v\text{, if $v$ is son by symbol $c$ in trie;}\\ | v\text{, if $v$ is son by symbol $c$ in trie;}\\ | ||
\delta(\pi(u), c)\text{, else.} | \delta(\pi(u), c)\text{, else.} | ||
− | \end{cases}</tex> - функция перехода | + | \end{cases}</tex> - функция перехода.<br /><br /> |
− | + | Суффиксная ссылка <tex>\pi(u) = v</tex>, если <tex>[v]</tex> - максимальный суффикс <tex>[u]</tex>, <tex>[v]\neq[u]</tex>. Обозначение: <tex>[u]</tex> - слово, приводящее в вершину <tex>u</tex> в боре.<br /> | |
+ | Функции перехода и суффиксные ссылки можно найти либо алгоритмом обхода в глубину с ленивыми вычислениями, либо с помощью алгоритма обхода в ширину. | ||
+ | |||
+ | == Шаг 3 == | ||
+ | Построение сжатых суффиксных ссылок.<br /> | ||
+ | <tex>up(u) = | ||
\begin{cases} | \begin{cases} | ||
\pi(u)\text{, if $\pi(u)$ is terminal;}\\ | \pi(u)\text{, if $\pi(u)$ is terminal;}\\ | ||
\emptyset\text{, if $\pi(u)$ is root;}\\ | \emptyset\text{, if $\pi(u)$ is root;}\\ | ||
up(\pi(u))\text{, else.} | up(\pi(u))\text{, else.} | ||
− | \end{cases}</tex> - сжатая суффиксная ссылка. | + | \end{cases}</tex> - сжатая суффиксная ссылка, т.е. ближайшее допускающее состояние (терминал) перехода по суффиксным ссылкам. |
− | + | ||
+ | == Использование автомата == | ||
+ | По очереди просматриваем символы текста. Для очередного символа <tex>c</tex> переходим из текущего состояния <tex>u</tex> в состояние, которое вернёт функция <tex>\delta(u, c)</tex>. Оказавшись в новом состоянии, отмечаем по сжатым суффиксным ссылкам образцы, которые нам встретились и их позицию (если требуется). Если новое состояние является терминалом, то соответствующие ему образцы тоже отмечаем. |
Версия 03:42, 14 марта 2011
Задача алгоритма
Найти для каждого образца из заданного множества образцов все его вхождения в текст за время
, где - суммарная длина образцов, - длина текста, - размер ответа (количество пар). В худшем случае , но он случается редко.Шаг 1
Строим бор из образцов. См. Бор.
Построение выполняется за время , где - суммарная длина образцов.
Шаг 2
Превращаем бор в автомат.
Узлы бора становятся состояниями автомата; корень - начальное состояние.
Узлы бора, в которых заканчиваются образцы, становятся терминалами.
Для переходов по автомату заведём в узлах несколько функций:
1) - возвращает родителя вершины ;
2) - суффиксная ссылка; здесь - сын по символу ;
3) - функция перехода.
Суффиксная ссылка , если - максимальный суффикс , . Обозначение: - слово, приводящее в вершину в боре.
Функции перехода и суффиксные ссылки можно найти либо алгоритмом обхода в глубину с ленивыми вычислениями, либо с помощью алгоритма обхода в ширину.
Шаг 3
Построение сжатых суффиксных ссылок.
- сжатая суффиксная ссылка, т.е. ближайшее допускающее состояние (терминал) перехода по суффиксным ссылкам.
Использование автомата
По очереди просматриваем символы текста. Для очередного символа
переходим из текущего состояния в состояние, которое вернёт функция . Оказавшись в новом состоянии, отмечаем по сжатым суффиксным ссылкам образцы, которые нам встретились и их позицию (если требуется). Если новое состояние является терминалом, то соответствующие ему образцы тоже отмечаем.