Наивный алгоритм поиска подстроки в строке — различия между версиями
Iloskutov (обсуждение | вклад) (Тикет 2-1) |
(→Преимущества: удалил <tex> из не-формул) |
||
| Строка 26: | Строка 26: | ||
==Преимущества== | ==Преимущества== | ||
* Требует <tex>O(1)</tex> памяти. | * Требует <tex>O(1)</tex> памяти. | ||
| − | * Приемлемое время работы на практике (см. выше). Благодаря этом алгоритм применяется, например, в браузерах и текстовых редакторах (при использовании < | + | * Приемлемое время работы на практике (см. выше). Благодаря этом алгоритм применяется, например, в браузерах и текстовых редакторах (при использовании <tt>Ctrl + F</tt>), потому что обычно паттерн, который нужно найти очень короткий по сравнению с самим текстом. Также наивный алгоритм используется в стандартных библиотеках языков высокого уровня (C++, Java), потому что он не требует дополнительной памяти. |
* Простая и понятная реализация. | * Простая и понятная реализация. | ||
Версия 21:17, 7 июня 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), потому что он не требует дополнительной памяти.
- Простая и понятная реализация.
Источники информации
- Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ.[1] — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.