Поиск подстроки в строке
Версия от 20:26, 5 июня 2014; Firespace (обсуждение | вклад) (Новая страница: «''Поиск подстроки в строке'' (''String searching algorithm'') — класс алгоритмов над строками, которые п...»)
Поиск подстроки в строке (String searching algorithm) — класс алгоритмов над строками, которые позволяют найти паттерн (needle) в тексте (haystack).
Классификация алгоритмов поиска подстроки в строке
Сравнение — «чёрный ящик»
Во всех алгоритмах этого типа сравнение является черным ящиком для программиста.
- + Позволяет использовать стандартные функции сравнения участков памяти (man *cmp(3)), которые, зачастую, оптимизированы под конкретное железо.
- - Не выдается точка, в которой произошло несовпадение.
По порядку сравнения паттерна в тексте
Прямой
- + Отсутсвие регрессии на «плохих» данных.
- - Не самая хорошая средняя ассимптотическая сложность.
Обратный
Паттерн движется по тексту слева на право, но сравнение подстрок происходит с права на лево.
- + При несовпадении позволяет перемещать паттерн по строке сразу на несколько символов
Сравнение в необычном порядке
Специфические алгоритмы, основанные, как правило, на некоторых эмпирических наблюдениях над словарём.
По количеству поисковых шаблонов
- Один шаблон (Single pattern algorithms)
- Конечное количество шаблонов (finite set of patterns)
- Бесконечное количество шаблонов (Регулярные грамматики/regexp'ы)
По необходимости препроцессинга текста
Виды препроцессинга:
Алгоритмы, использующие препроцессинг — одни из самых быстрых в этом классе.
Сравнение алгоритмов
- — размер алфавита
- — длина текста
- — длина паттерна
- — размер ответа(кол-во пар)
- — суммарная длина всх паттернов
Название | Среднее | Худшее | Необходимость препроцессинга | Дополнительная память | Кол-во поисковых шаблонов | Порядок сравнения | Описание |
---|---|---|---|---|---|---|---|
Наивный алгоритм (Brute Force algorithm) |
Нет | Single | Прямой | Сравнение — «чёрный ящик». Если | достаточно мало по сравнению с , то ассимптотика будет близкой к O(h), что позволяет использовать его на практике в случаях, когда паттерн много меньше текста (например, ctrl+F в браузерах)|||
Алгоритм Бойера-Мура-Хорспула (Horspool algorithm)] |
Да |
Single | Прямой | В самой простой реализации использует только эвристику стоп-символа и относится к алгоритмом с сравнением — «чёрным ящиком». | |||
Алгоритм Рабина-Карпа (Karp-Rabin algorithm) |
Да |
Single | Прямой | Данный алгоритм использует хэширование, что снижает скорость в среднем. | |||
Алгоритм Кнута-Морриса-Пратта (Knuth-Morris-Pratt algorith) |
Да |
Single | Прямой | Использует префикс-функцию | |||
Алгоритм Ахо-Корасик (Aho–Corasick string matching algorithm) |
Да |
finite | Прямой | Строит конечный автомат |