Me gustaría crear una clase "vector comprimido"/"vector comprimido" (detalles a continuación), que permite el acceso aleatorio a datos con un tiempo más o menos constante.vector comprimido/clase de matriz con acceso aleatorio a datos
"tiempo más o menos constante" significa que aunque el tiempo de acceso al elemento no es constante, no debería seguir aumentando cuando me acerque a cierto punto de la matriz. Es decir. el contenedor no debe hacer muchos más cálculos (como "descomprimir todo una vez más para obtener el último elemento", y "hacer casi nada para obtener el último elemento") para obtener un elemento. Probablemente se logre dividiendo la matriz en fragmentos de datos comprimidos. Es decir. el acceso a un elemento debe tomar "averageTime" + - alguna desviación. Podría decir que quiero que el tiempo de acceso al mejor de los casos y el tiempo de acceso al peor de los casos sea relativamente cercano al tiempo promedio de acceso.
¿Cuáles son mis opciones (algoritmos adecuados/contenedores ya disponibles, si hay alguno)?
detalles de contenedores:
- Container actúa como una matriz lineal de elementos idénticos (como std :: vector)
- Una vez que se inicializa contenedor, los datos es constante y no cambia nunca. El contenedor necesita proporcionar acceso de solo lectura.
- El contenedor debe comportarse como array/std :: vector - es decir, los valores accedidos a través del operador [], hay .size(), etc.
- Sería bueno si pudiera hacerlo como clase de plantilla.
- El acceso a los datos debe ser más o menos de tiempo constante. No necesito el mismo tiempo de acceso para cada elemento, pero no debería tener que descomprimir todo para obtener el último elemento.
Ejemplo de uso:
Búsqueda binaria en los datos.
Datos de datos:
1. Los datos son estructuras que consisten principalmente en flotadores y algunos ints. Hay más flotadores que ints. Sin cadenas.
2. Es poco probable que haya muchos elementos idénticos en el conjunto, por lo que simplemente no será posible indexar los datos.
3. El tamaño de un elemento es inferior a 100 bytes.
4. El tamaño total de los datos por contenedor es de entre algunos kilobytes y algunos megabytes.
5. Los datos no son escasos: es un bloque continuo de elementos, todos ellos asignados, no hay "espacios vacíos".
El objetivo de la compresión es reducir la cantidad de memoria RAM que toma el bloque cuando se compara con la representación sin comprimir como matriz, manteniendo un rendimiento de acceso de lectura razonable y permitiendo acceder aleatoriamente a los elementos como matriz. Es decir. los datos deben almacenarse en forma comprimida internamente, y debería poder acceder a él (solo lectura) como si fuera un contenedor estándar o similar.
Ideas/Opiniones?
¿Qué es "más o menos" tiempo constante? O es constante, o no lo es. De lo contrario, pregunta interesante. ¿Estás seguro de que no puedes hacer lo que quieres con las muchas clases de contenedores existentes? – ereOn
¿dónde entra la parte "comprimida"? Nunca explicas esa parte. ¿Podrías usar un vector de punteros para crear blobs gzip, o algo así? ¿O quiere decir que está comprimido ya que tiene un conjunto de datos disperso por lo que un vector ingenuo tendría muchas ranuras vacías? – jalf
También dices que los elementos son solo flotantes y enteros, y que un elemento nunca excede los 100 bytes. A menos que trabaje en una arquitectura de 800 bits, puede omitir el último requisito. – ereOn