Estoy buscando una estructura de datos altamente eficiente para el almacenamiento de datos similar a la siguiente.
Etiquetas de identificación Order1 Order2 -------------------------- 1 1,2 1 1 2 2,5 2 3 3 1,7 4 7 4 6 3 0
Tengo que ser capaz de consultar esta estructura de tal manera que me daría una lista de todos los identificadores que contienen una expresión de etiquetas - el apoyo AND
y OR
y NOT
operaciones. P.ej. ((1 o 2) y no 7)
También necesito poder especificar el orden de los resultados (Order1 u Order2) y poder especificar las filas máximas devueltas con un desplazamiento opcional. El rendimiento para la obtención de los primeros 30-100 resultados es clave.
Finalmente, necesito una forma barata de buscar "relaciones de etiqueta", por ejemplo, quiero saber qué etiquetas "se relacionan" con las etiquetas (1 O 2) y con qué frecuencia. Significa qué etiquetas aparecen en el mismo conjunto que 1 O 2 ... ordenadas por frecuencia.
¿Alguna idea de qué estructura de datos (o conjunto de estructuras) sería altamente eficiente para este tipo de trabajo?
(Me gustaría usar esto como una prueba de concepto para rediseñar las páginas etiquetadas de la familia de sitios SE)
fuente
Respuestas:
Esto no es exactamente una respuesta de una estructura de datos eficiente, sino más bien una elaboración de los comentarios de @bbejot y @Kaveh dando un argumento de saludo a mano por qué dada la pregunta actual, no deberíamos esperar algo que haga mucho mejor que buscar Base de datos completa. El argumento se basa en una reducción de SAT, la hipótesis del tiempo exponencial y un montón de movimientos manuales.
No deberíamos esperar una búsqueda eficiente en la duración de la consulta (por reducción a SAT). Tampoco deberíamos esperar mucho mejor que mirar todos los elementos en la base de datos por la hipótesis del tiempo exponencial.
fuente
Esta es una respuesta bastante directa, pero creo que es efectiva:
Map Tag ([Id],[Id])
Map Id (Set Tag)
Id
fuente