stringtranslate.com

Codificación omega de Elías

La codificación Elias ω o codificación Elias omega es un código universal que codifica los números enteros positivos desarrollado por Peter Elias . Al igual que la codificación gamma de Elias y la codificación delta de Elias , funciona anteponiendo al entero positivo una representación de su orden de magnitud en un código universal. Sin embargo, a diferencia de esos otros dos códigos, Elias omega codifica recursivamente ese prefijo; por lo tanto, a veces se les conoce como códigos Elias recursivos .

La codificación omega se utiliza en aplicaciones donde el valor codificado más grande no se conoce de antemano o para comprimir datos en los que los valores pequeños son mucho más frecuentes que los valores grandes.

Para codificar un número entero positivo N :

  1. Coloque un "0" al final del código.
  2. Si N  = 1, deténgase; La codificación está completa.
  3. Anteponga la representación binaria de N al comienzo del código. Serán al menos dos bits, el primero de los cuales será un 1.
  4. Sea N igual al número de bits que se acaban de anteponer, menos uno.
  5. Regrese al Paso 2 para anteponer la codificación del nuevo N .

Para decodificar un entero positivo codificado en omega de Elias:

  1. Comience con una variable N , establecida en un valor de 1.
  2. Si el siguiente bit es "0", deténgase. El número decodificado es N .
  3. Si el siguiente bit es un "1" , léalo más N bits más y use ese número binario como el nuevo valor de N. Regrese al Paso 2.

Ejemplos

Los códigos omega pueden considerarse como una serie de "grupos". Un grupo es un único bit 0, que termina el código, o dos o más bits que comienzan con 1, seguidos por otro grupo.

Los primeros códigos se muestran a continuación. Se incluye la llamada distribución implícita , que describe la distribución de valores para los cuales esta codificación produce un código de tamaño mínimo; consulte Relación de los códigos universales con la compresión práctica para obtener más detalles.

La codificación de 1 googol , 10 100 , es 11 1000 101001100 (encabezado de 15 bits de longitud) seguido de la representación binaria de 333 bits de 1 googol, que es 10010 01001001 10101101 00100101 10010100 11000011 1100 11101011 00001011 00100111 10000100 11000100 11001110 00001011 11110011 10001010 11001110 01000000 10001110 00100001 00011010 01111100 10101010 10110010 01000011 00001000 10101000 00101110 10001111 000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 y un 0 final, para un total de 3 49 bits.

Un googol elevado a la centésima potencia (10 10000 ) es un número binario de 33.220 bits. Su codificación omega tiene una longitud de 33,243 bits: 11 1111 1000000111000100 (22 bits), seguida de 33,220 bits del valor y un 0 al final. Según la codificación delta de Elias , el mismo número tiene una longitud de 33,250 bits: 000000000000000 1000000111000100 (31 bits) seguido de 33.219 bits del valor. La codificación omega y delta son, respectivamente, un 0,07% y un 0,09% más largas que la representación binaria ordinaria de 33.220 bits del número.

Longitud del código

Para la codificación de un entero positivo N , el número de bits necesarios, B ( N ) , es recursivo: es decir, la longitud del código omega de Elias para el entero es donde el número de términos en la suma está limitado arriba por el logaritmo iterado binario . Para ser precisos, dejemos . Tenemos para algunos y la longitud del código es . Desde que tenemos .

Dado que el logaritmo iterado crece más lentamente que todo para cualquier fijo , la tasa de crecimiento asintótica es , donde la suma termina cuando cae por debajo de uno.

Optimidad asintótica

La codificación omega de Elias es un código de prefijo asintóticamente óptimo. [1]

Boceto de prueba. Un código de prefijo debe satisfacer la desigualdad de Kraft . Para la codificación omega de Elias, la desigualdad de Kraft establece que ahora la suma es asintóticamente igual a una integral, lo que nos da si el denominador termina en algún punto , entonces la integral diverge como . Sin embargo, si el denominador termina en algún punto , entonces la integral converge como . El código omega de Elías está al borde entre la divergencia y la convergencia.

Código de ejemplo

Codificación

void eliasOmegaEncode ( char * fuente , char * destino ) { IntReader intreader ( fuente ); BitWriter bitwriter ( destino ); while ( intreader . hasLeft ()) { int num = intreader . obtenerInt (); Bits de pila de bits ; mientras ( núm > 1 ) { int len ​​= 0 ; for ( int temp = num ; temp > 0 ; temp >>= 1 ) // calcula 1+floor(log2(num)) len ++ ; para ( int i = 0 ; i < len ; i ++ ) bits . pushBit (( número >> i ) & 1 ); número = len - 1 ; } mientras ( bits . longitud () > 0 ) bitwriter . putBit ( bits . popBit ()); escritor de bits . ponerBit ( falso ); // escribe un cero } bitwriter . cerca (); intruso . cerca (); }                                                                     

Descodificación

void eliasOmegaDecode ( char * fuente , char * destino ) { BitReader bitreader ( fuente ); IntWriter intwriter ( destino ); mientras ( bitreader . hasLeft ()) { int num = 1 ; while ( bitreader . inputBit ()) // potencialmente peligroso con archivos con formato incorrecto. { int longitud = número ; número = 1 ; for ( int i = 0 ; i < len ; ++ i ) { número <<= 1 ; si ( lector de bits . inputBit ()) num |= 1 ; } } escritor interno . putInt ( núm ); // escribe el valor } bitreader . cerca (); escritor interno . cerca (); }                                                    

Generalizaciones

La codificación omega de Elias no codifica cero ni números enteros negativos. Una forma de codificar todos los números enteros no negativos es sumar 1 antes de codificar y luego restar 1 después de decodificar, o utilizar la codificación Levenshtein muy similar . Una forma de codificar todos los números enteros es configurar una biyección , asignando todos los números enteros (0, 1, -1, 2, -2, 3, -3, ...) a enteros estrictamente positivos (1, 2, 3, 4). , 5, 6, 7, ...) antes de codificar.

Ver también

Referencias

  1. ^ Elías, P. (marzo de 1975). "Conjuntos de palabras de código universales y representaciones de números enteros". Transacciones IEEE sobre teoría de la información . 21 (2): 194-203. doi :10.1109/TIT.1975.1055349. ISSN  0018-9448.

Otras lecturas

enlaces externos