Алгоритм Ахо-Корасик — различия между версиями
Tsar (обсуждение | вклад) (Продолжение статьи) |
Tsar (обсуждение | вклад) м (Добавляю примечание) |
||
Строка 33: | Строка 33: | ||
== Использование автомата == | == Использование автомата == | ||
− | По очереди просматриваем символы текста. Для очередного символа <tex>c</tex> переходим из текущего состояния <tex>u</tex> в состояние, которое вернёт функция <tex>\delta(u, c)</tex>. Оказавшись в новом состоянии, отмечаем по сжатым суффиксным ссылкам образцы, которые нам встретились и их позицию (если требуется). Если новое состояние является терминалом, то соответствующие ему образцы тоже отмечаем. | + | По очереди просматриваем символы текста. Для очередного символа <tex>c</tex> переходим из текущего состояния <tex>u</tex> в состояние, которое вернёт функция <tex>\delta(u, c)</tex>. Оказавшись в новом состоянии, отмечаем по сжатым суффиксным ссылкам образцы, которые нам встретились и их позицию (если требуется). Если новое состояние является терминалом, то соответствующие ему образцы тоже отмечаем.<br /> |
+ | ''Примечание.'' Если требуется найти только первое вхождение образца в текст, то существенно ускорить работу алгоритма могут пометки о посещённости узла, т.е. если узел посещён, то не переходить по сжатым суффиксным ссылкам. Вместо хранения пометок можно просто сбрасывать сжатую суффиксную ссылку. |
Версия 03:47, 14 марта 2011
Задача алгоритма
Найти для каждого образца из заданного множества образцов все его вхождения в текст за время
, где - суммарная длина образцов, - длина текста, - размер ответа (количество пар). В худшем случае , но он случается редко.Шаг 1
Строим бор из образцов. См. Бор.
Построение выполняется за время , где - суммарная длина образцов.
Шаг 2
Превращаем бор в автомат.
Узлы бора становятся состояниями автомата; корень - начальное состояние.
Узлы бора, в которых заканчиваются образцы, становятся терминалами.
Для переходов по автомату заведём в узлах несколько функций:
1) - возвращает родителя вершины ;
2) - суффиксная ссылка; здесь - сын по символу ;
3) - функция перехода.
Суффиксная ссылка , если - максимальный суффикс , . Обозначение: - слово, приводящее в вершину в боре.
Функции перехода и суффиксные ссылки можно найти либо алгоритмом обхода в глубину с ленивыми вычислениями, либо с помощью алгоритма обхода в ширину.
Шаг 3
Построение сжатых суффиксных ссылок.
- сжатая суффиксная ссылка, т.е. ближайшее допускающее состояние (терминал) перехода по суффиксным ссылкам.
Использование автомата
По очереди просматриваем символы текста. Для очередного символа
Примечание. Если требуется найти только первое вхождение образца в текст, то существенно ускорить работу алгоритма могут пометки о посещённости узла, т.е. если узел посещён, то не переходить по сжатым суффиксным ссылкам. Вместо хранения пометок можно просто сбрасывать сжатую суффиксную ссылку.