Наивный алгоритм поиска подстроки в строке — различия между версиями
(→Преимущества: удалил <tex> из не-формул) |
Iloskutov (обсуждение | вклад) (→Источники информации: обновил Кормена) |
||
Строка 30: | Строка 30: | ||
== Источники информации == | == Источники информации == | ||
− | * ''Кормен | + | * ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 3-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2014. — 1328 с.: ил. — ISBN 978-5-8459-1794-2 (рус.) — страница 1034. |
[[Категория:Алгоритмы и структуры данных]] | [[Категория:Алгоритмы и структуры данных]] | ||
[[Категория:Поиск подстроки в строке]] | [[Категория:Поиск подстроки в строке]] |
Версия 21:22, 8 июня 2015
Задача: |
Дан текст | и паттерн такие, что и элементы этих строк — символы из конечного алфавита . Требуется проверить, входит ли паттерн в текст .
Определение: |
Говорят, что паттерн | встречается в тексте со сдвигом , если и Если строка встречается в строке , то является подстрокой .
Алгоритм
В наивном алгоритме поиск всех допустимых сдвигов производится с помощью цикла, в котором проверяется условие
для каждого из возможных значений .Псевдокод
Приведем пример псевдокода, который находит все вхождения строки
в и возвращает массив позиций, откуда начинаются вхождения.vector<int> naiveStringMatcher(string t, string p): int n = t.length int m = p.length vector<int> ans for i = 1 to n - m + 1 if t[i..i + m - 1] == p[1..m] ans.push_back(i) return ans
Время работы
Алгоритм работает за
. В худшем случае что дает . Однако если достаточно мало, по сравнению с , то тогда асимптотика получается близкой к , поэтому этот алгоритм достаточно широко применяется на практике.Преимущества
- Требует памяти.
- Приемлемое время работы на практике (см. выше). Благодаря этом алгоритм применяется, например, в браузерах и текстовых редакторах (при использовании Ctrl + F), потому что обычно паттерн, который нужно найти очень короткий по сравнению с самим текстом. Также наивный алгоритм используется в стандартных библиотеках языков высокого уровня (C++, Java), потому что он не требует дополнительной памяти.
- Простая и понятная реализация.
Источники информации
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 3-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2014. — 1328 с.: ил. — ISBN 978-5-8459-1794-2 (рус.) — страница 1034.