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