Из Википедии, свободной энциклопедии
  (Перенаправлено из сопоставления строк )
Перейти к навигации Перейти к поиску

В информатике , алгоритмы струнно-поиска , иногда называемые алгоритмы сравнения строк , представляют собой важный класс алгоритмов строк , которые пытаются найти место , где один или несколько строк (также называемые шаблоны) находятся в пределах большей строки или текста.

Базовый пример строкового поиска - это когда шаблон и искомый текст являются массивами элементов алфавита ( конечного множества ) Σ. Σ может быть алфавитом человеческого языка, например, буквы от A до Z и другие приложения могут использовать двоичный алфавит (Σ = {0,1}) или алфавит ДНК (Σ = {A, C, G, T}) в биоинформатике .

На практике на метод возможного алгоритма поиска строки может влиять кодировка строки. В частности, если в переменной ширины кодирование используется, то это может быть медленнее , чтобы найти г N - й символ, возможно , требует времени , пропорционального N . Это может значительно замедлить работу некоторых поисковых алгоритмов. Одно из многих возможных решений состоит в том, чтобы вместо этого искать последовательность кодовых единиц, но это может привести к ложным совпадениям, если только кодирование специально не предназначено для предотвращения этого. [ необходима цитата ]

Обзор [ править ]

Самый простой случай поиска строки включает одну (часто очень длинную) строку, иногда называемую стогом сена , и одну (часто очень короткую) строку, иногда называемую иглой . Цель состоит в том, чтобы найти одно или несколько вхождений иголки в стоге сена. Например, можно искать с точностью до :

 Некоторые книги нужно пробовать, другие проглатывать, а некоторые - пережевывать и переваривать.

Можно запросить первое появление «to», которое является четвертым словом; или все вхождения, из которых 3; или последнее, пятое с конца слово.

Однако очень часто добавляются различные ограничения. Например, кто-то может захотеть сопоставить «иглу» только в том случае, если она состоит из одного (или нескольких) полных слов - возможно, определяется как отсутствие других букв, непосредственно смежных с обеих сторон. В этом случае поиск «hew» или «low» должен завершиться неудачно для приведенного выше примера предложения, даже если эти буквальные строки действительно встречаются.

Другой распространенный пример включает «нормализацию». Для многих целей поиск такой фразы, как «быть», должен быть успешным даже в тех местах, где есть что-то еще, промежуточное между «to» и «be»:

  • Более одного места
  • Другие «пробельные» символы, такие как табуляция, неразрывные пробелы, перенос строки и т. Д.
  • Реже дефис или мягкий дефис
  • В структурированном тексте теги или даже произвольно большие, но «заключенные в скобки» вещи, такие как сноски, номера списков или другие маркеры, встроенные изображения и так далее.

Многие системы символов включают символы, которые являются синонимами (по крайней мере, для некоторых целей):

  • Алфавиты на основе латиницы различают строчные и прописные буквы, но для многих целей ожидается, что строковый поиск игнорирует это различие.
  • Многие языки включают лигатуры , в которых один составной символ эквивалентен двум или более другим символам.
  • Во многих системах письма используются диакритические знаки, такие как акценты или гласные , которые могут различаться по своему использованию или иметь различное значение при сопоставлении.
  • Последовательности ДНК могут включать в себя некодирующие сегменты, которые могут игнорироваться для некоторых целей, или полиморфизмы, которые не приводят к изменению кодируемых белков, что может не считаться истинным различием для некоторых других целей.
  • В некоторых языках есть правила, согласно которым в начале, середине или конце слова должен использоваться другой символ или форма символа.

Наконец, для строк, представляющих естественный язык, задействуются аспекты самого языка. Например, кто-то может захотеть найти все вхождения слова, несмотря на то, что оно имеет альтернативное написание, префиксы или суффиксы и т. Д.

Другой более сложный тип поиска - это поиск по регулярному выражению , когда пользователь создает шаблон из символов или других символов, и любое совпадение с шаблоном должно выполнять поиск. Например, чтобы поймать и американское английское слово «цвет», и британский эквивалент «цвет», вместо поиска двух разных буквальных строк можно использовать регулярное выражение, такое как:

 цвет

где "?" обычно делает предыдущий символ («u») необязательным.

В этой статье в основном обсуждаются алгоритмы для более простых видов поиска по строкам.

Похожая проблема, возникающая в области биоинформатики и геномики, - это максимальное точное соответствие (MEM). [1] Учитывая две строки, MEM являются обычными подстроками, которые не могут быть расширены влево или вправо, не вызывая несоответствия. [2]

Примеры алгоритмов поиска [ править ]

Наивный поиск по строке [ править ]

Простой и неэффективный способ увидеть, где одна строка встречается внутри другой, - это проверять каждое место, где она может быть, одно за другим, чтобы увидеть, есть ли оно там. Итак, сначала мы видим, есть ли копия иголки у первого символа стога сена; если нет, мы смотрим, есть ли копия иглы, начинающаяся со второго символа стога сена; в противном случае мы смотрим, начиная с третьего символа и так далее. В обычном случае нам нужно только посмотреть на один или два символа для каждой неправильной позиции, чтобы увидеть, что это неправильная позиция, поэтому в среднем случае это занимает O ( n + m ) шагов, где n - длина стог сена и мдлина иглы; но в худшем случае поиск строки типа «aaaab» в строке типа «aaaaaaaaab» занимает O ( нм )

Поиск на основе конечных автоматов [ править ]

Поиск DFA mommy.svg

В этом подходе мы избегаем поиска с возвратом, создавая детерминированный конечный автомат (DFA), который распознает сохраненную строку поиска. Их создание дорого - обычно они создаются с использованием конструкции powerset, - но очень быстро в использовании. Например, DFA, показанный справа, распознает слово «МАМА». Этот подход часто обобщается на практике для поиска произвольных регулярных выражений .

Заготовки [ править ]

Кнут – Моррис – Пратт вычисляет DFA, который распознает входные данные со строкой для поиска как суффикс, Бойер – Мур начинает поиск с конца иглы, поэтому обычно на каждом шаге он может продвигаться вперед на целую длину иглы. Баеза – Йейтс отслеживает, были ли предыдущие символы j префиксом строки поиска, и, следовательно, может быть адаптирован для поиска по нечеткой строке . Алгоритм bitap является применение подхода Баеза-Йейтс.

Методы индекса [ править ]

Более быстрые поисковые алгоритмы предварительно обрабатывают текст. После построения индекса подстроки , например дерева суффиксов или массива суффиксов , можно быстро найти вхождения шаблона. Например, суффиксное дерево может быть построено во времени, и все вхождения шаблона могут быть найдены во времени при условии, что алфавит имеет постоянный размер и все внутренние узлы в суффиксном дереве знают, какие листья находятся под ними. Последнее может быть выполнено путем запуска алгоритма DFS из корня дерева суффиксов.

Другие варианты [ править ]

Некоторые методы поиска, например поиск по триграмме , предназначены для поиска оценки «близости» между строкой поиска и текстом, а не «совпадение / несоответствие». Иногда это называют «нечетким» поиском .


Классификация поисковых алгоритмов [ править ]

Классификация по количеству паттернов [ править ]

Различные алгоритмы можно классифицировать по количеству используемых ими шаблонов.

Алгоритмы единого паттерна [ править ]

В следующей компиляции m - длина шаблона, n - длина текста, доступного для поиска, k = | Σ | - размер алфавита, а f - константа, вводимая операциями SIMD .

1. ^ Асимптотические времена выражаются с использованием обозначений O, Ω и .

Алгоритм строк поиска Бойер-Мур был стандартным эталоном для практической строкового поиска литературы. [8]

Алгоритмы, использующие конечный набор шаблонов [ править ]

  • Алгоритм сопоставления строк Ахо – Корасика (расширение Knuth-Morris-Pratt)
  • Алгоритм Коментария-Вальтера (расширение Бойера-Мура)
  • Set-BOM (расширение Backward Oracle Matching)
  • Алгоритм поиска строки Рабина – Карпа

Алгоритмы, использующие бесконечное количество шаблонов [ править ]

Естественно, что в этом случае образцы не могут быть перечислены до бесконечности. Обычно они представлены регулярной грамматикой или регулярным выражением .

Классификация с использованием программ предварительной обработки [ править ]

Возможны другие подходы к классификации. Один из наиболее распространенных критериев использует предварительную обработку.

Классификация по стратегиям сопоставления [ править ]

Другой классифицирует алгоритмы по их стратегии сопоставления: [11]

  • Сначала сопоставьте префикс (Knuth-Morris-Pratt, Shift-And, Aho-Corasick)
  • Сначала сопоставьте суффикс (Бойер-Мур и варианты, Комментарий-Вальтер)
  • Сначала сопоставьте лучший фактор (BNDM, BOM, Set-BOM)
  • Другая стратегия (Наив, Рабин-Карп)

См. Также [ править ]

  • Выравнивание последовательности
  • Сопоставление графиков
  • Сопоставление с образцом
  • Сжатое сопоставление с образцом
  • Подстановочные знаки соответствия
  • Полнотекстовый поиск

Ссылки [ править ]

  1. ^ Курц, Стефан; Филлиппи, Адам; Делчер, Артур Л; Смут, Майкл; Шамуэй, Мартин; Антонеску, Корина; Зальцберг, Стивен Л. (2004). «Универсальное и открытое программное обеспечение для сравнения больших геномов» . Геномная биология . 5 (2): R12. DOI : 10.1186 / GB-2004-5-2-r12 . ISSN  1465-6906 . PMC  395750 . PMID  14759262 .
  2. ^ Хан, Зия; Блум, Джошуа С .; Кругляк Леонид; Сингх, Мона (1 июля 2009 г.). «Практический алгоритм для поиска максимально точных совпадений в больших наборах данных с использованием разреженных массивов суффиксов» . Биоинформатика . 25 (13): 1609–1616. DOI : 10.1093 / биоинформатики / btp275 . PMC 2732316 . PMID 19389736 .  
  3. ^ Кумар, Адитья. "libc ++: Улучшение алгоритма string :: find" . Цитировать журнал требует |journal=( помощь )
  4. ^ Кумар, Адитья. "libstdc ++: Улучшение алгоритма string :: find" . Cite journal requires |journal= (help)
  5. ^ Крошмор, Максим; Перрен, Доминик (1 июля 1991 г.). «Двустороннее сопоставление строк» (PDF) . Журнал ACM . 38 (3): 650–674. DOI : 10.1145 / 116825.116845 . S2CID 15055316 .  
  6. ^ Наварро, Гонсало; Раффино, Матье (1998). «Бит-параллельный подход к суффиксным автоматам: быстрое сопоставление расширенных строк» (PDF) . Комбинаторное сопоставление с образцом . Конспект лекций по информатике. Springer Berlin Heidelberg. 1448 : 14–33. DOI : 10.1007 / bfb0030778 . ISBN  978-3-540-64739-3.
  7. ^ Fan, H .; Yao, N .; Ма, Х. (декабрь 2009 г.). «Быстрые варианты алгоритма обратного оракула-похода» (PDF) . 2009 Четвертая международная конференция по Интернет-вычислениям для науки и техники : 56–59. DOI : 10,1109 / ICICSE.2009.53 . ISBN  978-1-4244-6754-9. S2CID  6073627 .
  8. ^ Юм; Воскресенье (1991). «Быстрый поиск строки» . Программное обеспечение: практика и опыт . 21 (11): 1221–1248. DOI : 10.1002 / spe.4380211105 . S2CID 5902579 . 
  9. ^ Melichar, Боривой, Ян Голуб и J. POLCAR. Алгоритмы текстового поиска. Том I: Прямое сопоставление строк. Vol. 1. 2 тома, 2005. http://stringology.org/athens/TextSearchingAlgorithms/ .
  10. ^ Риад Мокадем; Витольд Литвин http://www.cse.scu.edu/~tschwarz/Papers/vldb07_final.pdf (2007), Быстрый поиск строк на основе nGram по данным, закодированным с использованием алгебраических подписей , 33-я Международная конференция по очень большим базам данных (VLDB)
  11. ^ Гонсало Наварро; Матье Раффино (2008), Строки гибкого сопоставления с образцом: практические алгоритмы онлайн -поиска текстов и биологических последовательностей , ISBN 978-0-521-03993-2
  • RS Boyer и JS Moore, Быстрый алгоритм поиска строки , Carom. АКМ 20, (10), 262–272 (1977).
  • Томас Х. Кормен , Чарльз Э. Лейзерсон , Рональд Л. Ривест и Клиффорд Штайн . Введение в алгоритмы , третье издание. MIT Press и McGraw-Hill, 2009. ISBN 0-262-03293-7 . Глава 32: Сопоставление строк, стр. 985–1013. 

Внешние ссылки [ править ]

  • Огромный список ссылок на сопоставление с образцом Последнее обновление: 27.12.2008 20:18:38
  • Большой (поддерживаемый) список алгоритмов сопоставления строк
  • Список алгоритмов сопоставления строк NIST
  • StringSearch - высокопроизводительные алгоритмы сопоставления с образцом в Java - Реализации многих алгоритмов сопоставления строк в Java (BNDM, Boyer-Moore-Horspool, Boyer-Moore-Horspool-Raita, Shift-Or)
  • StringsAndChars - реализация многих алгоритмов сопоставления строк (для одного и нескольких шаблонов) в Java.
  • Алгоритмы точного сопоставления строк - анимация на Java, подробное описание и реализация на языке C многих алгоритмов.
  • (PDF) Улучшенное сопоставление единственной и множественной приближенной строки
  • Kalign2: высокоэффективное множественное выравнивание последовательностей белков и нуклеотидов с учетом внешних функций
  • NyoTengu - высокопроизводительный алгоритм сопоставления с образцом в C - Реализации векторных и скалярных алгоритмов сопоставления строк на C