Поиск подстроки в строке — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(По порядку сравнения паттерна в тексте: вернул случайно удалённый заголовок; пункты списка со строчных букв)
(Классификация алгоритмов поиска подстроки в строке)
Строка 5: Строка 5:
  
 
Во всех алгоритмах этого типа сравнение является «чёрным ящиком» для программиста.
 
Во всех алгоритмах этого типа сравнение является «чёрным ящиком» для программиста.
===== Преимущества =====
+
 
* Позволяет использовать стандартные функции сравнения участков памяти (man *cmp(3)), которые, зачастую, оптимизированы под конкретное железо.  
+
Преимущества:
===== Недостатки =====
+
* позволяет использовать стандартные функции сравнения участков памяти (man *cmp(3)), которые, зачастую, оптимизированы под конкретное железо.  
* Не выдается точка, в которой произошло несовпадение.
+
 
 +
Недостатки:
 +
* не выдается точка, в которой произошло несовпадение.
  
 
=== По порядку сравнения паттерна в тексте ===
 
=== По порядку сравнения паттерна в тексте ===
 
==== Прямой ====
 
==== Прямой ====
===== Преимущества =====
+
 
 +
Преимущества:
 
* отсутствие регрессии на «плохих» данных.
 
* отсутствие регрессии на «плохих» данных.
===== Недостатки =====
+
 
 +
Недостатки:
 
* не самая хорошая средняя асимптотическая сложность.
 
* не самая хорошая средняя асимптотическая сложность.
  
 
==== Обратный ====
 
==== Обратный ====
 
Паттерн движется по тексту слева направо, но сравнение подстрок происходит справа налево.
 
Паттерн движется по тексту слева направо, но сравнение подстрок происходит справа налево.
===== Преимущества =====
+
 
* при несовпадении позволяет перемещать паттерн по строке сразу на несколько символов
+
Преимущества:
 +
* при несовпадении позволяет перемещать паттерн по строке сразу на несколько символов.
 +
 
 +
Недостатки:
 +
* производительность сильно зависит от данных.
  
 
==== Сравнение в необычном порядке ====
 
==== Сравнение в необычном порядке ====

Версия 16:29, 9 июня 2015

Поиск подстроки в строке (англ. String searching algorithm) — класс алгоритмов над строками, которые позволяют найти паттерн (needle) в тексте (haystack).

Классификация алгоритмов поиска подстроки в строке

Сравнение — «чёрный ящик»

Во всех алгоритмах этого типа сравнение является «чёрным ящиком» для программиста.

Преимущества:

  • позволяет использовать стандартные функции сравнения участков памяти (man *cmp(3)), которые, зачастую, оптимизированы под конкретное железо.

Недостатки:

  • не выдается точка, в которой произошло несовпадение.

По порядку сравнения паттерна в тексте

Прямой

Преимущества:

  • отсутствие регрессии на «плохих» данных.

Недостатки:

  • не самая хорошая средняя асимптотическая сложность.

Обратный

Паттерн движется по тексту слева направо, но сравнение подстрок происходит справа налево.

Преимущества:

  • при несовпадении позволяет перемещать паттерн по строке сразу на несколько символов.

Недостатки:

  • производительность сильно зависит от данных.

Сравнение в необычном порядке

Специфические алгоритмы, основанные, как правило, на некоторых эмпирических наблюдениях над словарём.[1]

По количеству поисковых шаблонов

Сколько поисковых шаблонов может обработать алгоритм за один раз.

  • один шаблон (англ. single pattern algorithms)
  • конечное количество шаблонов (англ. finite set of patterns)
  • бесконечное количество шаблонов (англ. infinite number of patterns) (см. Теория формальных языков)

По необходимости препроцессинга текста

Виды препроцессинга:

Алгоритмы, использующие препроцессинг — одни из самых быстрых в этом классе.

Сравнение алгоритмов

  • |Σ|=σ­ — размер алфавита
  • |text|=t — длина текста
  • |pattern|=p — длина паттерна
  • a — размер ответа(кол-во пар)
  • m — суммарная длина всех паттернов
Название Среднее Худшее Препроцессинг Дополнительная память Кол-во поисковых шаблонов Порядок сравнения Описание
Наивный алгоритм
(Brute Force algorithm)
O(p(tp)) O(p2) O(1) Single Прямой Сравнение — «чёрный ящик». Если p достаточно мало по сравнению с t, то асимптотика будет близкой к O(t), что позволяет использовать его на практике в случаях, когда паттерн много меньше текста (например, ctrl+F в браузерах)
Поиск подстроки в строке с помощью Z-функции O(t) O(t) O(p+t) O(p) Single Прямой
Алгоритм Рабина-Карпа
(Karp-Rabin algorithm)
O(p+t) O(pt) O(p) O(1) Single / Finite Прямой Данный алгоритм использует хэширование, что снижает скорость в среднем. Можно модифицировать для поиска нескольких паттернов
Алгоритм Кнута-Морриса-Пратта
(Knuth-Morris-Pratt algorith)
O(p+t) O(p+t) O(p) O(p) Single Прямой Использует префикс-функцию
Алгоритм Колусси
(Colussi algorithm)
O(t) O(t) O(p) O(p) Single Прямой / Обратный Оптимизация Алгоритма Кнута-Морриса-Пратта использует как прямой, так и обратный обход
Алгоритм Ахо-Корасик
(Aho–Corasick string matching algorithm)
O(m+t+a) O(t)
O(m)
O(mσ) Finite Прямой Строит конечный автомат. Можно хранить таблицу переходов как индексный массив (array), а можно как Красно-черное дерево. В последнем случае уменьшится расход памяти, но ухудшится асимптотика
Алгоритм Shift-Or O(t) O(tnw)
w — размер машинного слова
O(p+σ) O(p+σ) Single Прямой Использует тот факт, что в современных процессорах битовые сдвиг и или являются атомарными. Эффективен, если pw. Иначе деградирует и по памяти, и по сложности
Алгоритм Бойера-Мура
(Boyer-Moore algorithm)
O(t) O(pt) O(p+σ) O(p+σ) Single Обратный Считается наиболее быстрым из алгоритмов общего назначения. Использует эвристики. Существует большое количество оптимизаций[2]
Поиск подстроки в строке с помощью суффиксного массива
(Suffix array)
O(plogt) O(plogt) O(t) O(t) Single Прямой Использует Суффиксный массив. Если использовать Largest common prefix (lcp), то можно уменьшить асимптотику до O(p+logt). Суффиксный массив можно строить стандартными способами или алгоритмом Каркайнена-Сандерса. Асимптотика приведена для построения суффиксного массива с помощью алгоритма Каркайнена-Сандерса
Поиск подстроки в строке с помощью суффиксного дерева
(Suffix tree)
O(p) O(p) O(t) O(t) Single Прямой Позволяет выполнять поиск подстроки в строке за линейное время

Примечания

Источники информации