Поиск подстроки в строке
Версия от 21:49, 5 июня 2014; Firespace (обсуждение | вклад)
\Поиск подстроки в строке (англ. String searching algorithm) — класс алгоритмов над строками, которые позволяют найти паттерн (needle) в тексте (haystack).
Классификация алгоритмов поиска подстроки в строке
Сравнение — «чёрный ящик»
Во всех алгоритмах этого типа сравнение является «чёрным ящиком» для программиста.
- + Позволяет использовать стандартные функции сравнения участков памяти (man *cmp(3)), которые, зачастую, оптимизированы под конкретное железо.
- - Не выдается точка, в которой произошло несовпадение.
По порядку сравнения паттерна в тексте
Прямой
- + Отсутсвие регрессии на «плохих» данных.
- - Не самая хорошая средняя асимптотическая сложность.
Обратный
Паттерн движется по тексту слева на право, но сравнение подстрок происходит справа на лево.
- + При несовпадении позволяет перемещать паттерн по строке сразу на несколько символов
Сравнение в необычном порядке
Специфические алгоритмы, основанные, как правило, на некоторых эмпирических наблюдениях над словарём.
По количеству поисковых шаблонов
- Один шаблон (Single pattern algorithms)
- Конечное количество шаблонов (finite set of patterns)
- Бесконечное количество шаблонов (infinite number of patterns) (см. Теория формальных языков, regexp)
По необходимости препроцессинга текста
Виды препроцессинга:
Алгоритмы использующие препроцессинг — одни из самых быстрых в этом классе.
Сравнение алгоритмов
- — размер алфавита
- — длина текста
- — длина паттерна
- — размер ответа(кол-во пар)
- — суммарная длина всх паттернов
Название | Среднее | Худшее | Необходимость препроцессинга | Дополнительная память | Кол-во поисковых шаблонов | Порядок сравнения | Описание |
---|---|---|---|---|---|---|---|
Наивный алгоритм (Brute Force algorithm) |
Нет | Single | Прямой | Сравнение — «чёрный ящик». Если | достаточно мало по сравнению с , то ассимптотика будет близкой к O(h), что позволяет использовать его на практике в случаях, когда паттерн много меньше текста (например, ctrl+F в браузерах)|||
Алгоритм Бойера-Мура-Хорспула (Horspool algorithm) |
Да |
Single | Прямой | В самой простой реализации использует только эвристику стоп-символа и относится к алгоритмом с сравнением — «чёрным ящиком». | |||
Алгоритм Рабина-Карпа (Karp-Rabin algorithm) |
Да |
Single / Finite | Прямой | Данный алгоритм использует хэширование, что снижает скорость в среднем. Можно модифицировать для поиска нескольких паттернов. | |||
Алгоритм Кнута-Морриса-Пратта (Knuth-Morris-Pratt algorith) |
Да |
Single | Прямой | Использует префикс-функцию | |||
Алгоритм Ахо-Корасик (Aho–Corasick string matching algorithm) |
Да |
Finite | Прямой | Строит конечный автомат. Можно хранить таблицу переходов как индексный массив (array), а можно как Красно-черное дерево. В последнем случае уменьшится расход памяти, но ухудшится асимптотика | |||
Shift-Or algorithm | w — размер машинного слова |
w — размер машинного слова |
Да |
Single | Прямой | Использует тот факт, что в современных процессорах битовые сдвиг и или являются атомарными. Эффективен, если n <= w. Иначе деградирует и по памяти, и по сложности. | |
Алгоритм Бойера-Мура (Boyer-Moore algorithm) |
Да |
Single | Обратный | Считается наиболее быстрым из алгоритмов общего назначения. Использует эвристики. | |||
Алгоритм Чжу-Такаоки (Zhu-Takaoka algorithm) |
Да |
Single | Обратный | Оптимизация Бойера-Мура под короткие алфавиты | |||
Турбо-алгоритм Бойера-Мура (Turbo-BM algorithm) |
Да |
Single | Обратный | Не дает регрессии на «плохих» данных. | сравнений в худшем случае. Количество эвристик увеличивается до трёх.|||
Алгоритм поиска подстроки в строке с помощью суффиксного массива | Да |
Single | Использует Суффиксный массив. Если использовать Largest common prefix(lcp), то можно увеличить асимптотику до |
Ссылки
- http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_%D0%BF%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8
- http://en.wikipedia.org/wiki/String_searching_algorithm
- http://www-igm.univ-mlv.fr/~lecroq/string/index.html — (англ.) Очень много разных алгоритмов поиска подстроки в строке. Многие из них в данной статье не описаны.