Открыть сервисСервис

Поиск слов — алгоритмы и методы

Поиск слов — это класс информационно-поисковых задач и алгоритмов, направленных на обнаружение заданного слова (или слова с заданными свойствами) в тексте, словаре, базе данных или другом массиве данных. Задача является фундаментальной для информатики и применяется в текстовых редакторах, поисковых системах, библиотечных каталогах, генетике (поиск подпоследовательностей ДНК) и криминалистике. Поиск слов бывает точным (поиск заданного слова) и приближённым (поиск слов, похожих на заданное — с опечатками, морфологическими вариациями).

Точное поиск слова

Поиск подстроки в строке

Простейшая задача — найти все вхождения слова-образца (паттерна) в текст. Классические алгоритмы:

  • Наивный алгоритм — перебор всех позиций текста с попарным сравнением символов. Сложность O(n·m), где n — длина текста, m — длина образца. Прост в реализации, но неэффективен на больших текстах.
  • Алгоритм Кнута — Морриса — Пратта (КМП) — предвычисляет таблицу отказов для образца, что позволяет сдвигать окно без повторного сравнения символов. Сложность O(n + m).
  • Алгоритм Бойера — Мура — сравнивает символы образца с конца и использует таблицу сдвигов. На практике один из самых быстрых, особенно при большом алфавите и длинном образце.
  • Алгоритм Рабина — Карпа — использует хеширование подстрок фиксированной длины, что даёт среднюю сложность O(n + m).
  • Алгоритм Ахо — Корасик — обобщение КМП для поиска множества образцов одновременно построением конечного автомата.

Поиск в словаре и индексах

Для поиска слов в словарях и базах данных применяются структуры данных:

Приближённый поиск слов

Приближённый поиск (fuzzy search) используется, когда точное слово неизвестно или содержит ошибки. Ключевое понятие — расстояние между словами:

  • Расстояние Левенштейна — минимальное число односимвольных операций (вставка, удаление, замена) для превращения одного слова в другое. Вычисляется динамическим программированием за O(n·m).
  • Расстояние Дамерау — Левенштейна — дополнено операцией перестановки соседних символов.
  • Расстояние Джаро — Винклера — используется в системах проверки орфографии и сопоставлении имён.
  • Косинусное расстояние и TF-IDF — векторные модели, где слово представляется вектором частот, поиск выполняется по близости векторов.

Для ускорения приближённого поиска применяются блоки с ограничением ошибок (q-gram, n-gram): слова индексируются по коротким фрагментам, что позволяет отсеивать кандидатов без полного сравнения.

Применение

Историческая справка

Задачи поиска слов активно разрабатывались в 1960—1970-х годах в связи с автоматизацией библиотечного дела и созданием первых информационно-поисковых систем. Алгоритм КМП опубликован в 1977 году, Бойера — Мура — в 1977-м, Рабина — Карпа — в 1981-м, Ахо — Корасик — в 1975-м. В России исследования в области информационного поиска связаны с работами В. М. Маркова, А. А. Ляпунова и школой информационного поиска при МГУ.

Источники

  • Кнут Д. «Основы программирования», том 3: «Поиск и сортировка».
  • Кормен Т. и др. «Алгоритмы: построение и анализ».
  • Марков В. М., Чернов Ю. С. «Основы информационного поиска».
  • Седжвик Р. «Алгоритмы на C++».
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru