Problema Antecedentesestructura de datos para coincidencia de patrones en los datos grandes
I tiene un vocabulario finito que contiene de, digamos, 10 símbolos [A-J]. Lo que significan estos símbolos no es relevante para la pregunta. Pueden ser bases de ADN, fonemas, palabras, etc.
Un elemento es una secuencia de símbolos. En este problema, todos los artículos son de la misma longitud (digamos 6). P.ej.
A C B A D J
Tengo una tabla grande (5M) que contiene recuentos de todos los elementos de longitud 6 muestreados de algunos datos conocidos. P.ej.
A C B A D J 55
B C B I C F 923
A B C D E G 478
Dando una nueva secuencia con un símbolo desconocido, mi tarea es adivinar el símbolo. En el siguiente ejemplo, ¿el símbolo que falta es ?.
B C B ? C F
Una solución simple para adivinar ? es mirar en mi mesa y encontrar el elemento con el recuento más grande que se ajusta al patrón de B C B ? C F
Preguntas
¿Qué es una buena estructura de datos para almacenar mi tabla de elementos de frecuencia para que yo manejar el espacio-tiempo de manera razonablemente eficiente? Prefiero usar menos memoria si el cálculo en tiempo de consulta es razonable. (Voy a tener muchas de esas tablas, por lo que el número 5M es solo una aproximación.)
¿Cuáles son algunos detalles de implementación que pueden marcar una gran diferencia en la velocidad de procesamiento?
cosas que he pensado:
Hacer una cadena de cada secuencia y usar expresiones regulares para que coincida. Advertencia: 1. O (n) es inaceptable. (2) Las expresiones regulares son lentas. (3) Las cuerdas (al menos en java) están hinchadas.
Deje que Lucene maneje la indexación. Desactivar tfidf puntuación. Use la búsqueda de frase. Potencialmente, use los valores de conteo para la puntuación, de modo que Lucene también se encargue de la clasificación.
Use el prefijo y el sufijo para indexar cada elemento.
Utilice db (probable en la memoria) con toda la información en una/columna separada para manejar la búsqueda.
Actualizaciones
- En mi aplicación real, que va a trabajar con secuencias de longitud 5,6,7,8,9,10 almacenados por separado. Simplifiqué el problema restringiéndolo a una longitud fija. De ahí la restricción/preferencia a una solución que usa menos memoria.
- Mi tamaño del vocabulario se puede suponer que estar bajo 20.
Lo diseñaría de modo que cada elemento resida en su propia columna indexada. Entonces 6 columnas + 1 columna para la frecuencia. La consulta y el pedido desde la base de datos deben ser muy rápidos. – arviman
Las dos constantes en su descripción: 10 letras y longitud = 6. ¿Son solo ejemplos o valores reales? ¿Puede el número de letras de longitud ser significativamente mayor? – maxim1000
@ maxim1000. Las constantes se pueden considerar casi reales. Actualizaciones agregadas 1,2 Gracias. – hashable