Estoy buscando una estructura de datos que admita búsquedas aproximadas eficientes de claves (por ejemplo, distancia de Levenshtein para cadenas), devolviendo la coincidencia más cercana posible para la clave de entrada. La estructura de datos más adecuada que he encontrado hasta ahora son los árboles de Burkhard-Keller , pero me preguntaba si hay otras / mejores estructuras de datos para este propósito.
Editar: algunos detalles más de mi caso específico:
- Las cadenas generalmente tienen una diferencia de Levenshtein bastante grande entre sí.
- Las cadenas tienen una longitud máxima de alrededor de 20-30 caracteres, con un promedio más cercano a 10-12.
- Estoy más interesado en una búsqueda eficiente que en la inserción, ya que construiré un conjunto de datos mayormente estáticos que quiero consultar de manera eficiente.
data-structures
strings
efficiency
Merijn
fuente
fuente
Respuestas:
Lo que está buscando es "búsqueda aproximada de vecinos cercanos" (ANNS) en la distancia Levenshtein / edición. Desde una perspectiva teórica, la distancia de edición hasta ahora ha resultado ser relativamente difícil para las búsquedas cercanas al vecino, afaik. Aún así, hay muchos resultados, vea las referencias en este artículo de Ostrovsky y Rabani . Si está dispuesto a considerar métricas de distancia alternativas para las cuales hay soluciones más simples y mejores, pase al siguiente párrafo. Para ANNS en la distancia de edición, hay un resultado debido a Indyk , que muestra cómo construir una estructura de datos de tamaño que responde a cualquier consulta en el tiempoO(d)e informa una cadena que es como máximo tres veces más que la cadena más cercana a la cadena de consulta (esto se generaliza al tamañonO(dϵ)y aproximación31/ϵ). Aquínes el número de cadenasydes la longitud máxima de cualquier cadena. El artículo de Ostrovsky y Rabani que vinculé anteriormente mejora este resultado al mapear cadenas a vectores para que elℓ1norteO ( d√) O ( d) norteO ( dϵ) 31 / ϵ norte re ℓ1 -la distancia (un tipo de distancia geométrica natural similar a la distancia euclidiana) entre vectores se aproxima a la distancia de edición entre las cadenas correspondientes (esto se denomina "incrustación de baja distorsión"). Una vez hecho esto, se puede usar una estructura de datos ANNS para , y estos resultan ser más eficientes (ver el siguiente párrafo).ℓ1
Si está dispuesto a considerar otras distancias, entonces el hashing sensible a la localidad (LSH) hace un gran trabajo. El hashing sensible a la localidad es una técnica iniciada por Indyk y Motwani para resolver el problema ANNS, donde los puntos que viven en un espacio de alta dimensión (leer vectores largos, cadenas largas, etc.) se agrupan en un pequeño número de cubos para que los puntos están cerca uno del otro se asignan al mismo contenedor con buena probabilidad y los puntos que están lejos del otro se asignan a diferentes contenedores, también con buena probabilidad. Hay un excelente y muy accesible artículo de encuesta de Indyk y Andoni en CACM . Esta técnica es simple y rápida, y tiene pequeños requisitos de espacio; también hay código (creo que el artículo enlaza con el código). Funciona bien para cosas como la distancia de Hamming (y en ciertos regímenes distancia) y distancia euclidiana, distancia cosenoidal. Además,Muthu y Sahinalpdiseñan esquemas LSH para una generalización muy natural de la distancia de edición, ladistancia de edición de bloque(donde algunas operaciones de edición pueden operar en un bloque de símbolos).ℓ1
Este tipo de pregunta es una buena opción para cstheory.SE . Hay una pregunta relacionada allí , pero parece pedir un vecino cercano exacto.
fuente
Las estructuras de datos que le interesan son árboles métricos. Es decir, admiten búsquedas eficientes en espacios métricos. Un espacio métrico está formado por un conjunto de objetos y una función de distancia definida entre ellos que satisface la desigualdad del triángulo. El objetivo es, dado un conjunto de objetos y un elemento de consulta, recuperar esos objetos lo suficientemente cerca de la consulta.
Dado que los problemas de búsqueda están literalmente en todas partes en informática, hay una gran cantidad de árboles métricos diferentes. Sin embargo, se pueden dividir al menos en dos grupos: basados en pivotes y en grupos (y seguramente también hay híbridos). Una buena encuesta es E. Chavez et al., Searching in Metric Spaces, 2001 . Consulte, por ejemplo, el Capítulo 5: Soluciones actuales para espacios métricos, página 283.
Chávez y cols. También brinde una buena descripción de los otros árboles y, naturalmente, más referencias si alguien en particular despierta su interés. En la práctica, el rendimiento de diferentes árboles a menudo se evalúa experimentalmente. Esto creo que depende mucho de la estructura del espacio. Por lo tanto, es difícil decir qué árbol en particular sería el más eficiente en su caso. Sin embargo, creo que es una buena idea ir primero con la más fácil. Si los árboles BK son los más fáciles de construir, pruébelos primero. Si no satisfacen sus requisitos, invierta tiempo (y quizás tiempo de programación) para reunir más datos sobre su espacio que podrían ayudarlo a tomar decisiones más informadas.
fuente