Estou procurando uma estrutura de dados que suporte pesquisas aproximadas eficientes de chaves (por exemplo, distância de Levenshtein para seqüências de caracteres), retornando a correspondência mais próxima possível da chave de entrada. A estrutura de dados mais adequada que eu encontrei até agora são as árvores Burkhard-Keller , mas eu queria saber se existem outras / melhores estruturas de dados para esse fim.
Edit: Mais alguns detalhes do meu caso específico:
- As cordas geralmente têm uma diferença Levenshtein bastante grande uma da outra.
- As cordas têm um comprimento máximo de cerca de 20 a 30 caracteres, com uma média mais próxima de 10 a 12.
- Estou mais interessado em pesquisa eficiente do que em inserção, pois construirei um conjunto de dados principalmente estáticos que desejo consultar com eficiência.
data-structures
strings
efficiency
merijn
fonte
fonte
Respostas:
O que você está procurando é "busca aproximada por vizinhos próximos" (ANNS) na distância Levenshtein / edit. De uma perspectiva teórica, a distância de edição até agora se mostrou relativamente difícil para pesquisas de vizinhos próximos. Ainda assim, existem muitos resultados, veja as referências neste artigo de Ostrovsky e Rabani . Se você deseja considerar métricas de distância alternativas para as quais existem soluções mais simples e melhores, passe para o próximo parágrafo. Para ANNS na distância de edição, há um resultado devido a Indyk , que mostra como construir uma estrutura de dados de tamanho que responde a qualquer consulta no tempoO(d)e relata uma cadeia que é no máximo três vezes maior que a cadeia mais próxima à cadeia de consulta (isso generaliza para o tamanhonO(dϵ)e a aproximação31/ϵ). Aquiné o número de cadeias edé o comprimento máximo de qualquer cadeia. O artigo de Ostrovsky e Rabani, que eu liguei acima, melhora esse resultado, mapeando cadeias de caracteres para vetores, para que oℓ1nO ( d√) O ( d) nO ( dϵ) 31 / ϵ n d ℓ1 1 -distance (um tipo de distância geométrica natural semelhante à distância euclidiana) entre vetores aproxima-se da distância de edição entre as strings correspondentes (isso é chamado de "incorporação de baixa distorção"). Uma vez feito isso, uma estrutura de dados ANNS para pode ser usada, e elas se tornam mais eficientes (consulte o próximo parágrafo).ℓ1 1
Se você estiver disposto a considerar outras distâncias, o hash sensível à localidade (LSH) faz um ótimo trabalho. O hashing sensível à localidade é uma técnica pioneira por Indyk e Motwani para solucionar o problema do ANNS, em que pontos que vivem em um espaço de alta dimensão (leia vetores longos, strings longos etc.) são agrupados em um pequeno número de buckets, para que estão próximos um do outro são mapeados para o mesmo compartimento com boa probabilidade e os pontos distantes um do outro são mapeados para compartimentos diferentes, também com boa probabilidade. Há um excelente e muito acessível artigo de pesquisa de Indyk e Andoni no CACM . Essa técnica é simples e rápida e possui pequenos requisitos de espaço; também há código por aí (acho que o artigo está vinculado ao código). Funciona bem para coisas como distância de Hamming (e em certos regimes distância) e a distância Euclidiana, distância cosseno. Além disso,Muthu e Sahinalpprojetam esquemas LSH para uma generalização muito natural da distância de edição, a distância de edição dobloco(onde algumas operações de edição podem operar em um bloco de símbolos).ℓ1 1
Esse tipo de pergunta é um bom ajuste para cstheory.SE . Existe uma pergunta relacionada lá , mas parece pedir um vizinho próximo exato.
fonte
As estruturas de dados nas quais você está interessado são árvores métricas. Ou seja, eles suportam pesquisas eficientes em espaços métricos. Um espaço métrico é formado por um conjunto de objetos e uma função de distância definida entre eles, satisfazendo a desigualdade do triângulo. O objetivo é, dado um conjunto de objetos e um elemento de consulta, recuperar esses objetos próximos o suficiente da consulta.
Como os problemas de pesquisa estão literalmente em toda parte na ciência da computação, há uma enorme quantidade de diferentes árvores métricas. No entanto, eles podem ser divididos em pelo menos dois grupos: baseado em pivô e em cluster (e certamente também existem híbridos). Uma boa pesquisa é E. Chavez et al., Searching in Metric Spaces, 2001 . Consulte, por exemplo, o Capítulo 5: Soluções atuais para espaços métricos, página 283.
Chávez et al. também dê uma boa visão geral das outras árvores e, naturalmente, mais referências, se alguém em particular despertar seu interesse. Na prática, o desempenho de diferentes árvores é frequentemente avaliado experimentalmente. Acho que isso depende muito da estrutura do espaço. Portanto, é difícil dizer qual árvore em particular seria a mais eficiente no seu caso. No entanto, acho que é uma boa ideia ir primeiro com a mais fácil. Se as árvores BK forem as mais fáceis de construir, experimente-as primeiro. Se eles não atenderem aos seus requisitos, invista tempo (e talvez tempo de programação) na coleta de mais fatos sobre o seu espaço que possam ajudá-lo a tomar decisões mais informadas.
fonte