Алгоритм Ахо-Корасик — различия между версиями
Tsar (обсуждение | вклад) (→Шаг 1: Добавляю пример бора) |
Tsar (обсуждение | вклад) (→Шаг 2: Добавляю пример автомата АК) |
||
Строка 24: | Строка 24: | ||
Суффиксная ссылка <tex>\pi(u) = v</tex>, если <tex>[v]</tex> - максимальный суффикс <tex>[u]</tex>, <tex>[v]\neq[u]</tex>. Обозначение: <tex>[u]</tex> - слово, приводящее в вершину <tex>u</tex> в боре.<br /> | Суффиксная ссылка <tex>\pi(u) = v</tex>, если <tex>[v]</tex> - максимальный суффикс <tex>[u]</tex>, <tex>[v]\neq[u]</tex>. Обозначение: <tex>[u]</tex> - слово, приводящее в вершину <tex>u</tex> в боре.<br /> | ||
Функции перехода и суффиксные ссылки можно найти либо алгоритмом обхода в глубину с ленивыми вычислениями, либо с помощью алгоритма обхода в ширину. | Функции перехода и суффиксные ссылки можно найти либо алгоритмом обхода в глубину с ленивыми вычислениями, либо с помощью алгоритма обхода в ширину. | ||
+ | === Пример автомата Ахо-Корасик === | ||
+ | [[Файл:Aho-corasick2.jpg]]<br /> | ||
+ | Пунктиром обозначены суффиксные ссылки. Из вершин, для которых они не показаны, суффиксные ссылки идут в корень. | ||
== Шаг 3 == | == Шаг 3 == |
Версия 18:01, 29 марта 2011
Содержание
Задача алгоритма
Найти для каждого образца из заданного множества образцов все его вхождения в текст за время
, где - суммарная длина образцов, - длина текста, - размер ответа (количество пар). В худшем случае , но он случается редко.Шаг 1
Строим бор из образцов. См. Бор.
Построение выполняется за время , где - суммарная длина образцов.
Пример построенного бора
Бор для набора образцов {he, she, his, hers}:
Шаг 2
Превращаем бор в автомат.
Узлы бора становятся состояниями автомата; корень - начальное состояние.
Узлы бора, в которых заканчиваются образцы, становятся терминалами.
Для переходов по автомату заведём в узлах несколько функций:
1) - возвращает родителя вершины ;
2) - суффиксная ссылка; здесь - сын по символу ;
3) - функция перехода.
Суффиксная ссылка , если - максимальный суффикс , . Обозначение: - слово, приводящее в вершину в боре.
Функции перехода и суффиксные ссылки можно найти либо алгоритмом обхода в глубину с ленивыми вычислениями, либо с помощью алгоритма обхода в ширину.
Пример автомата Ахо-Корасик
Пунктиром обозначены суффиксные ссылки. Из вершин, для которых они не показаны, суффиксные ссылки идут в корень.
Шаг 3
Построение сжатых суффиксных ссылок.
- сжатая суффиксная ссылка, т.е. ближайшее допускающее состояние (терминал) перехода по суффиксным ссылкам.
Сжатые суффиксные ссылки могут отыскиваться при помощи ленивой рекурсии.
Использование автомата
По очереди просматриваем символы текста. Для очередного символа
Примечание. Если требуется найти только первое вхождение образца в текст, то существенно ускорить работу алгоритма могут пометки о посещённости узла, т.е. если узел посещён, то не переходить по сжатым суффиксным ссылкам. Вместо хранения пометок можно просто сбрасывать сжатую суффиксную ссылку.