Para un número tan pequeño de bits, no es factible guardar muchos bits como Glorfindel ha señalado . Sin embargo, si el dominio que está utilizando tiene algunos bits más, puede lograr ahorros significativos para el caso promedio codificando rangos con el valor inicial y un delta.
Supongamos que el dominio son los enteros, entonces 32 bits. Con el enfoque ingenuo, necesita 64 bits (inicio, fin) para almacenar un rango.
Si cambiamos a una codificación de (inicio, delta), podemos construir el final del rango a partir de eso. Sabemos que en el peor de los casos, el inicio es 0 y el delta tiene 32 bits.
2 ^ 5 es 32, por lo que codificamos la longitud del delta en cinco bits (sin longitud cero, siempre sumamos 1), y la codificación se convierte en (inicio, longitud, delta). En el peor de los casos, esto cuesta 32 * 2 + 5 bits, por lo que 69 bits. Entonces, en el peor de los casos, si todos los rangos son largos, esto es peor que la codificación ingenua.
En el mejor de los casos, cuesta 32 + 5 + 1 = 38 bits.
Esto significa que si tiene que codificar muchos rangos, y esos rangos solo cubren una pequeña parte de su dominio, termina usando menos espacio en promedio usando esta codificación. No importa cómo se distribuyen los inicios, ya que el inicio siempre tomará 32 bits, pero sí importa cómo se distribuyen las longitudes de los rangos. Si las longitudes más pequeñas que tiene, mejor es la compresión, más rangos tiene que cubren la longitud completa del dominio, peor será esta codificación.
Sin embargo, si tiene muchos rangos agrupados en torno a puntos de inicio similares (por ejemplo, porque obtiene valores de un sensor), puede lograr ahorros aún mayores. Puede aplicar la misma técnica al valor inicial y usar un sesgo para compensar el valor inicial.
Digamos que tienes 10000 rangos. Los rangos se agrupan alrededor de un cierto valor. Codifica el sesgo con 32 bits.
Usando el enfoque ingenuo, necesitaría 32 * 2 * 10 000 = 640 000 bits para almacenar todos esos rangos.
Codificar el sesgo requiere 32 bits, y codificar cada rango requiere, en el mejor de los casos, 5 + 1 + 5 + 1 = 12 bits, para un total de 120 000 + 32 = 120 032 bits. En el peor de los casos, necesita 5 + 32 + 5 + 32 bits, por lo tanto 74 bits, para un total de 740 032 bits.
Esto significa que, para 10 000 valores en un dominio que requiere 32 bits para codificar, obtenemos
- 120 032 bits con la codificación inteligente delta en el mejor de los casos
- 640 000 bits con el comienzo ingenuo, la codificación final, siempre (no hay mejor ni peor caso)
- 740 032 bits con la codificación inteligente delta en el peor de los casos
Si toma la codificación ingenua como línea de base, eso significa ahorros de hasta 81.25% o hasta 15.625% más de costo.
Dependiendo de cómo se distribuyan sus valores, esos ahorros son significativos. ¡Conozca su dominio comercial! Sepa lo que quiere codificar.
Como extensión, también puede cambiar el sesgo. Si analiza los datos e identifica grupos de valores, puede ordenar los datos en cubos y codificar cada uno de esos cubos por separado, con su propio sesgo. Esto significa que puede aplicar esta técnica no solo a los rangos que se agrupan alrededor de un solo valor inicial, sino también a los rangos que se agrupan alrededor de varios valores.
Si sus puntos de inicio se distribuyen por igual, esta codificación realmente no funciona tan bien.
Esta codificación es obviamente extremadamente mala para indexar. No puede simplemente leer el valor x-th. Solo se puede leer secuencialmente. Lo cual es apropiado en algunas situaciones, por ejemplo, transmisión a través de la red o almacenamiento masivo (por ejemplo, en cinta o HDD).
Evaluar los datos, agruparlos y elegir el sesgo correcto puede ser un trabajo sustancial y puede requerir algunos ajustes para obtener resultados óptimos.