<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Oneone</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Oneone"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Oneone"/>
		<updated>2026-04-27T11:11:25Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%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_%D0%B2_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5&amp;diff=63446</id>
		<title>Поиск подстроки в строке</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%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_%D0%B2_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5&amp;diff=63446"/>
				<updated>2018-01-10T20:46:01Z</updated>
		
		<summary type="html">&lt;p&gt;Oneone: Худшее время наивного&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Поиск подстроки в строке''' (англ. ''String searching algorithm'') — класс алгоритмов над строками, которые позволяют найти паттерн (''pattern'') в тексте (''text''). &lt;br /&gt;
== Классификация алгоритмов поиска подстроки в строке ==&lt;br /&gt;
&lt;br /&gt;
=== Сравнение — «чёрный ящик» ===&lt;br /&gt;
&lt;br /&gt;
Во всех алгоритмах этого типа сравнение является «чёрным ящиком» для программиста.&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* позволяет использовать стандартные функции сравнения участков памяти (man *cmp(3)), которые, зачастую, оптимизированы под конкретное железо. &lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
* не выдается точка, в которой произошло несовпадение.&lt;br /&gt;
&lt;br /&gt;
=== По порядку сравнения паттерна в тексте ===&lt;br /&gt;
==== Прямой ====&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* отсутствие регрессии на «плохих» данных.&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
* не самая хорошая средняя асимптотическая сложность.&lt;br /&gt;
&lt;br /&gt;
==== Обратный ====&lt;br /&gt;
Паттерн движется по тексту слева направо, но сравнение подстрок происходит справа налево.&lt;br /&gt;
&lt;br /&gt;
Преимущества:&lt;br /&gt;
* при несовпадении позволяет перемещать паттерн по строке сразу на несколько символов.&lt;br /&gt;
&lt;br /&gt;
Недостатки:&lt;br /&gt;
* производительность сильно зависит от данных.&lt;br /&gt;
&lt;br /&gt;
==== Сравнение в необычном порядке ====&lt;br /&gt;
Специфические алгоритмы, основанные, как правило, на некоторых эмпирических наблюдениях над словарём.&amp;lt;ref&amp;gt;Например, [[Wikipedia:en:Raita Algorithm| Алгоритм Райты (англ.)]]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== По количеству поисковых шаблонов ===&lt;br /&gt;
&lt;br /&gt;
Сколько поисковых шаблонов может обработать алгоритм за один раз.&lt;br /&gt;
&lt;br /&gt;
* один шаблон (англ. ''single pattern algorithms'')&lt;br /&gt;
* конечное количество шаблонов (англ. ''finite set of patterns'')&lt;br /&gt;
* бесконечное количество шаблонов (англ. ''infinite number of patterns'') (см. [[Теория формальных языков]])&lt;br /&gt;
&lt;br /&gt;
=== По необходимости препроцессинга текста ===&lt;br /&gt;
Виды препроцессинга: &lt;br /&gt;
*[[Префикс-функция]]&lt;br /&gt;
*[[Z-функция]]&lt;br /&gt;
*[[Бор]]&lt;br /&gt;
*[[Суффиксный массив]]&lt;br /&gt;
Алгоритмы, использующие препроцессинг — одни из самых быстрых в этом классе.&lt;br /&gt;
&lt;br /&gt;
== Сравнение алгоритмов ==&lt;br /&gt;
*&amp;lt;tex&amp;gt;|\Sigma| = \sigma&amp;lt;/tex&amp;gt;­ — размер алфавита&lt;br /&gt;
*&amp;lt;tex&amp;gt;|text| = t&amp;lt;/tex&amp;gt; — длина текста&lt;br /&gt;
*&amp;lt;tex&amp;gt;|pattern| = p&amp;lt;/tex&amp;gt; — длина паттерна&lt;br /&gt;
*&amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; — размер ответа(кол-во пар)&lt;br /&gt;
*&amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; — суммарная длина всех паттернов &lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!width=&amp;quot;25%&amp;quot;|Название !! width=&amp;quot;5%&amp;quot;| Среднее !! width=&amp;quot;5%&amp;quot;| Худшее !! width=&amp;quot;5%&amp;quot;|Препроцессинг !! width=&amp;quot;5%&amp;quot;| Дополнительная память !! width=&amp;quot;10%&amp;quot;| Кол-во поисковых шаблонов !! width=&amp;quot;10%&amp;quot;| Порядок сравнения !! width=&amp;quot;35%&amp;quot;| Описание&lt;br /&gt;
&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Наивный алгоритм поиска подстроки в строке| Наивный алгоритм &amp;lt;br&amp;gt;(Brute Force algorithm)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p \cdot (t - p))&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t^2)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Прямой&lt;br /&gt;
|Сравнение — «чёрный ящик». Если &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; достаточно мало по сравнению с &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, то асимптотика будет близкой к &amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;, что позволяет использовать его на практике в случаях, когда паттерн много меньше текста (например, Ctrl+F в браузерах)&lt;br /&gt;
&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Z-функция| Поиск подстроки в строке с помощью Z-функции]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p + t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Прямой&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Поиск подстроки в строке с использованием хеширования. Алгоритм Рабина-Карпа| Алгоритм Рабина-Карпа &amp;lt;br&amp;gt;(Karp-Rabin algorithm)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p + t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(pt)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(1)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single / Finite&lt;br /&gt;
|Прямой&lt;br /&gt;
|Данный алгоритм использует хэширование, что снижает скорость в среднем. Можно модифицировать для поиска нескольких паттернов&lt;br /&gt;
&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Алгоритм Кнута-Морриса-Пратта| Алгоритм Кнута-Морриса-Пратта &amp;lt;br&amp;gt;(Knuth-Morris-Pratt algorith)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p + t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p + t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Прямой&lt;br /&gt;
|Использует [[Префикс-функция| префикс-функцию]]&lt;br /&gt;
&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Алгоритм Колусси| Алгоритм Колусси &amp;lt;br&amp;gt;(Colussi algorithm)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Прямой / Обратный&lt;br /&gt;
|Оптимизация [[Алгоритм Кнута-Морриса-Пратта| Алгоритма Кнута-Морриса-Пратта]] использует как прямой, так и обратный обход&lt;br /&gt;
&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Алгоритм Ахо-Корасик| Алгоритм Ахо-Корасик &amp;lt;br&amp;gt;(Aho–Corasick string matching algorithm)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(m + t + a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;O(m)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(m\sigma)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Finite&lt;br /&gt;
|Прямой&lt;br /&gt;
|Строит конечный автомат. Можно хранить таблицу переходов как индексный массив (array), а можно как [[Красно-черное дерево]]. В последнем случае уменьшится расход памяти, но ухудшится асимптотика&lt;br /&gt;
&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Алгоритм Shift-Or]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t \cdot \dfrac{n}{w})&amp;lt;/tex&amp;gt; &amp;lt;br&amp;gt; &amp;lt;tex&amp;gt;w&amp;lt;/tex&amp;gt; — размер машинного слова&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p + \sigma)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p + \sigma)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Прямой&lt;br /&gt;
|Использует тот факт, что в современных процессорах битовые сдвиг и или являются атомарными. Эффективен, если &amp;lt;tex&amp;gt;p \leqslant w&amp;lt;/tex&amp;gt;. Иначе деградирует и по памяти, и по сложности&lt;br /&gt;
&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Алгоритм Бойера-Мура| Алгоритм Бойера-Мура &amp;lt;br&amp;gt;(Boyer-Moore algorithm)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(pt)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p + \sigma)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p + \sigma)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Обратный&lt;br /&gt;
|Считается наиболее быстрым из алгоритмов общего назначения. Использует эвристики. Существует большое количество оптимизаций&amp;lt;ref&amp;gt;Например, [http://www-igm.univ-mlv.fr/~lecroq/string/node15.html#SECTION00150 Турбо-алгоритм Бойера-Мура &amp;lt;br&amp;gt;(Turbo-BM algorithm)]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Алгоритм поиска подстроки в строке с помощью суффиксного массива| Поиск подстроки в строке с помощью суффиксного массива &amp;lt;br&amp;gt;(Suffix array)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p\log t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p\log t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Прямой&lt;br /&gt;
|Использует [[Суффиксный массив]]. Если использовать [[Алгоритм Касаи и др.| Largest common prefix (lcp)]], то можно уменьшить асимптотику до &amp;lt;tex&amp;gt;O(p + \log t)&amp;lt;/tex&amp;gt;. Суффиксный массив можно строить[[Построение суффиксного массива с помощью стандартных методов сортировки| стандартными способами]] или [[Алгоритм Каркайнена-Сандерса| алгоритмом Каркайнена-Сандерса]]. Асимптотика приведена для построения суффиксного массива с помощью алгоритма Каркайнена-Сандерса&lt;br /&gt;
&lt;br /&gt;
|-align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Сжатое суффиксное дерево| Поиск подстроки в строке с помощью суффиксного дерева &amp;lt;br&amp;gt;(Suffix tree)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Прямой&lt;br /&gt;
|Позволяет выполнять поиск подстроки в строке за линейное время&lt;br /&gt;
&lt;br /&gt;
|- align = &amp;quot;center&amp;quot;&lt;br /&gt;
|[[Алгоритм Апостолико-Крочемора| Алгоритм Апостолико-Крочемора &amp;lt;br&amp;gt;( Apostolico-Crochemore algorithm)]]&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(t)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|&amp;lt;tex&amp;gt;O(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
|Single&lt;br /&gt;
|Прямой&lt;br /&gt;
|В худшем случае выполнит &amp;lt;tex&amp;gt;\dfrac{3}{2} n&amp;lt;/tex&amp;gt; сравнений.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [[wikipedia:ru:Поиск_подстроки | Википедия {{---}} Поиск подстроки]]&lt;br /&gt;
* [[Wikipedia:en:String_searching_algorithm | Википедия {{---}} String searching algorithm]]&lt;br /&gt;
* [http://www-igm.univ-mlv.fr/~lecroq/string/index.html ESMAJ] — (англ.) Большое количество разных алгоритмов поиска подстроки в строке. Многие из них в данной статье не описаны.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Дискретная математика и алгоритмы]]&lt;br /&gt;
[[Категория: Поиск подстроки в строке]]&lt;/div&gt;</summary>
		<author><name>Oneone</name></author>	</entry>

	</feed>