5

Я пытаюсь вычислить расстояния редактирования строки против коллекции, чтобы найти ближайшее совпадение. Моя текущая проблема заключается в том, что коллекция очень большая (около 25000 элементов), поэтому мне пришлось сузить набор до простых строк одинаковой длины, но это все равно ограничило бы его до нескольких тысяч строк, и это все еще очень медленно. Есть ли структура данных, которая позволяет быстро найти похожие строки или есть ли другой способ решить эту проблему?Быстро сравнить строку с сборкой в ​​Java

+0

Как вы это делаете прямо сейчас? Можете ли вы показать код? –

+3

Определите «похожие». –

+0

Подобным я имею в виду сравнение слов, которые являются распространенными орфографическими ошибками, такими как «exanple» и «example» или «weird» и «wierd». – Lezan

ответ

8

Похоже, что BK-tree может быть тем, что вы хотите. Вот статья, обсуждающая их: http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees. A quick Google дает некоторые реализации Java.

+0

Спасибо, я посмотрю это и дам вам знать, как оно идет, спасибо! – Lezan

+0

Yup, который сделал это, нужна была другая реализация поиска, но это было прекрасно! Спасибо!! – Lezan

2

Если ваши критерии для «похожих» определяют общий порядок, вы должны иметь возможность определить Компаратор и использовать TreeSet для поиска ближайших совпадений (например, с использованием методов потолка и пола).

6

Levenshtein Automata позволяют быстро выбирать набор слов из большого словаря таким образом, чтобы они находились в пределах данного расстояния Левенштейна от данного слова.

См .: Schulz K, Mihov S. (2002) Fast String Correction with Levenshtein-Automata.