Введение

Алгоритм поиска строк в информатике — это алгоритм поиска строк, изобретенный Альфредом В. Ахо и Маргарет Дж. Корасик в 1975 году. Это разновидность алгоритма поиска по словарю, который находит элементы конечного набора строк ("словаря") в заданном тексте. Он осуществляет поиск всех строк одновременно. Временная сложность алгоритма линейна относительно суммарной длины строк, длины искомого текста и количества найденных совпадений. Следует отметить, что поскольку находятся все совпадения, их количество может быть квадратичным, если каждая подстрока соответствует одному из элементов словаря (например, словарь = "a", "aa", "aaa" и входная строка — "aaaa"). По сути, алгоритм строит конечный автомат, напоминающий префиксное дерево (trie) с дополнительными связями между различными внутренними узлами. Эти дополнительные связи позволяют быстро переходить от неудачных совпадений строк (например, при поиске "bc" в trie, который не содержит "bc", но содержит "abc", и, следовательно, поиск не удастся в узле, соответствующем префиксу "b"), к другим ветвям trie, имеющим общий суффикс (например, в предыдущем случае ветвь для "abc" может быть наилучшим переходом). Это позволяет автомату переходить между совпадениями строк без необходимости возврата. Если словарь строк известен заранее (например, база данных компьютерных вирусов), построение автомата можно выполнить однократно в автономном режиме, а скомпилированный автомат сохранить для последующего использования. В этом случае время его работы линейно относительно длины входного текста плюс количество найденных совпадений. Алгоритм поиска строк Ахо-Корасика лег в основу оригинальной команды Unix fgrep.

Динамический поисковый список

Оригинальный алгоритм Ахо-Корасика предполагает, что набор поисковых строк задан заранее и не изменяется. Он не применим напрямую к задачам, в которых поисковые строки добавляются в процессе работы алгоритма. Примером может служить интерактивная программа индексирования, в которой пользователь просматривает текст и выделяет новые слова или фразы для индексации по мере необходимости. Бертран Мейер предложил инкрементную версию алгоритма, позволяющую расширять набор поисковых строк в процессе поиска, сохраняя при этом алгоритмическую сложность исходного алгоритма.