Я ищу структуру данных, которая поддерживает эффективный приблизительный поиск ключей (например, расстояние Левенштейна для строк), возвращая максимально возможное совпадение для клавиши ввода. Наилучшей структурой данных, которую я нашел до сих пор, являются деревья Буркхарда-Келлера , но мне было интересно, существуют ли другие / лучшие структуры данных для этой цели.
Изменить: некоторые подробности моего конкретного случая:
- Струны обычно имеют довольно большое отличие Левенштейна друг от друга.
- Струны имеют максимальную длину около 20-30 символов, в среднем ближе к 10-12.
- Меня больше интересует эффективный поиск, чем вставка, поскольку я буду создавать набор в основном статических данных, которые я хочу эффективно запрашивать.
data-structures
strings
efficiency
Merijn
источник
источник
Ответы:
То, что вы ищете, это «приблизительный поиск ближнего» (ANNS) на расстоянии Левенштейна / редактирования. С теоретической точки зрения, расстояние редактирования до сих пор оказалось относительно трудным для поиска ближайших соседей. Тем не менее, есть много результатов, см. Ссылки в этой статье Островского и Рабани . Если вы хотите рассмотреть альтернативные метрики расстояния, для которых есть более простые и лучшие решения, переходите к следующему абзацу. Для ANNS на расстоянии редактирования есть результат благодаря Indyk , который показывает, как построить структуру данных размером которая отвечает на любой запрос за время и сообщает строку который не более чем в три раза дальше строки, ближайшей к строке запроса (это обобщает размерnO(d√) O(d) nO(dϵ) и приближение ). Здесь - количество строк, а - максимальная длина любой строки. Связанные выше работы Островского и Рабани, которые я связал, улучшают этот результат путем сопоставления строк с векторами, так что расстояние (вид естественного геометрического расстояния, аналогичного евклидову расстоянию) между векторами приближается к редактируемому расстоянию между соответствующими строками (это называется «вложение с низким искажением»). Как только это будет сделано, можно использовать структуру данных ANNS для , и они окажутся более эффективными (см. Следующий параграф).31/ϵ n d ℓ1 ℓ1
Если вы готовы учитывать другие расстояния, то хеширование, чувствительное к местному населению (LSH), делает большую работу. Хеширование с учетом локальных особенностей - это метод, впервые предложенный Indyk и Motwani для решения проблемы ANNS, когда точки, которые живут в многомерном пространстве (считывают длинные векторы, длинные строки и т. Д.), Хэшируются в небольшое количество сегментов, так что расположенные рядом друг с другом отображаются с одинаковой вероятностью в одну и ту же ячейку, а точки, расположенные далеко друг от друга, сопоставляются с разными ячейками, также с большой вероятностью. В CACM есть отличная и очень доступная обзорная статья Indyk и Andoni . Эта техника проста и быстра, и требует небольшого места; там тоже есть код (я думаю, что статья ссылается на код). Это хорошо работает для таких вещей, как расстояние Хэмминга (и в определенных режимахℓ1 расстояние) и евклидово расстояние, косинусное расстояние. Кроме того, Muthu и Sahinalp проектируют схемы LSH для очень естественного обобщения расстояния редактирования, расстояния редактирования блока (где некоторые операции редактирования могут работать с блоком символов).
Этот вопрос подходит для cstheory.SE . Там есть связанный вопрос , но он, кажется, спрашивает о точном соседе.
источник
Интересующие вас структуры данных являются деревьями метрик. То есть они поддерживают эффективный поиск в метрических пространствах. Метрическое пространство образовано набором объектов и определенной между ними функцией расстояния, удовлетворяющей неравенству треугольника. Затем, при наличии набора объектов и элемента запроса, цель состоит в том, чтобы извлечь эти объекты достаточно близко к запросу.
Поскольку проблемы поиска буквально повсюду в компьютерных науках, существует огромное количество различных метрических деревьев. Тем не менее, их можно разделить по крайней мере на две группы: на основе сводной и кластерной (и, конечно же, есть гибриды). Хороший обзор - Э. Чавес и др., Поиск в метрических пространствах, 2001 . См., Например, главу 5 «Современные решения метрических пространств», стр. 283.
Там, в таблице 1, Чавес и соавт. рассмотрим 16 разных метрических деревьев. Они представляют сложность пространства, сложность конструкции, заявленную сложность запроса и дополнительное время запроса ЦП для каждого (если известно). Если вас не слишком волнует сложность построения, сложность запроса для BK-дерева равна , где зависимости от диапазона поиска и структуры пространства. , Или, если у вас нет большого количества элементов, взгляните на AESA (аппроксимирующее устранение алгоритма поиска). Он неприемлемо медленен для создания и хранения огромных пространств ( времени и пространства), но экспериментально было показано, что время запроса.O(nα) 0<α<1 O ( 1 )O(n2) O(1)
Чавес и соавт. также дайте хороший обзор других деревьев и, естественно, больше ссылок, если какой-либо из них вызывает у вас интерес. На практике производительность разных деревьев часто оценивается экспериментально. Это, я думаю, во многом зависит от структуры пространства. Поэтому трудно сказать, какое именно дерево будет наиболее эффективным в вашем случае. Тем не менее, я думаю, что это хорошая идея, чтобы сначала пойти с самым простым. Если BK-деревья проще всего построить, сначала попробуйте их. Если они не удовлетворяют вашим требованиям, потратьте время (и, возможно, время программирования) на сбор большего количества фактов о вашем пространстве, которые могут помочь вам принимать более обоснованные решения.
источник