Все ответы, кроме одного, в котором упоминается лучший первый алгоритм, сильно отклонены.
Локально чувствительное хеширование в основном спит. Это первый раз, когда я вижу столько ответов на stackoverflow.
Во-первых, это сложная, но стандартная проблема, которая была решена много лет назад.
по-разному.
В одном подходе используется три, например, предварительно заданный
Седжвик здесь:
http://www.cs.princeton.edu/~rs/strings/
У Седжвика также есть образец кода С.
Я цитирую статью Бентли и Седжвика «Быстрые алгоритмы сортировки и поиска строк»:
"‘ ‘Ближайший сосед" запросов найти все слова в пределах заданного расстояния Хэмминга
слова запроса (например, код - это расстояние 2 от соды). Мы даем новый алгоритм поиска ближнего соседа в строках, представляем простую реализацию на C и описываем эксперименты по его эффективности. "
Второй подход заключается в использовании индексации. Разбейте строки на символы n-грамм и индексируйте
с инвертированным индексом (проверьте орфографию в Lucene, чтобы узнать, как это делается).
Используйте индекс, чтобы вывести потенциальных кандидатов, а затем выполнить дистанцию Хэмминга или отредактировать расстановку кандидатов. Такой подход гарантированно работает лучше (и относительно прост).
Третий появляется в области распознавания речи. Там запрос представляет собой wav-сигнал, а база данных представляет собой набор строк. Существует «таблица», которая сопоставляет части сигнала с частями слова. Цель состоит в том, чтобы найти лучшее совпадение слов для сигнала. Эта проблема известна как выравнивание слов.
В опубликованной проблеме указана неявная стоимость сопоставления частей запроса с частями базы данных.
Например, один может иметь разные затраты на удаление / вставку / замену и даже
разные затраты на несоответствие, скажем «ph» с «f».
Стандартное решение в распознавании речи использует подход динамического программирования, который становится эффективным благодаря эвристике, которая непосредственно сокращает. Таким образом, сохраняются только лучшие, скажем, 50 кандидатов. Таким образом, имя лучший поиск в первую очередь. Теоретически, вы можете не получить наилучшее совпадение, но обычно вы получаете хорошее совпадение.
Вот ссылка на последний подход:
http://amta2010.amtaweb.org/AMTA/papers/2-02-KoehnSenellart.pdf
Быстрое сопоставление приблизительной строки с суффиксными массивами и анализом A *.
Этот подход применим не только к словам, но и к предложениям.