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