El código δ de Elias o código delta de Elias es un código universal que codifica los enteros positivos, desarrollado por Peter Elias . [ 1 ] : 200
Codificación
Para codificar un número X ≥ 1:
- Sea N = ⌊log 2 X ⌋; la mayor potencia de 2 en X , de modo que 2 N ≤ X < 2 N +1 .
- Sea L = ⌊log 2 N + 1⌋ la mayor potencia de 2 en N + 1, de modo que 2 L ≤ N + 1 < 2 L +1 .
- Escriba L ceros, seguidos de
- la representación binaria de ( L + 1) bits de N + 1, seguida de
- todos excepto el bit principal (es decir, los últimos N bits ) de X.
Una forma equivalente de expresar el mismo proceso:
- Separe X en la potencia más alta de 2 que contiene (2 N ) y los N dígitos binarios restantes.
- Codificar N + 1 con codificación gamma de Elias .
- Agregue los N dígitos binarios restantes a esta representación de N + 1.
Para representar un número, Elias delta (δ) utilizabits. [ 1 ] : 200 Esto es útil para enteros muy grandes, donde los bits de la representación codificada general terminan siendo menores que los que se podrían obtener usando la codificación gamma de Elias ] debido a laparte de la expresión anterior.
El código comienza, usandoen lugar de:
Para decodificar un número entero codificado con delta de Elias:
- Lee y cuenta los ceros del flujo hasta que llegues al primero. Llama a este conteo de ceros L.
- Considerando que el dígito alcanzado es el primer dígito de un entero, con un valor de 2L , lee los L dígitos restantes del entero. Llama a este entero N + 1 y réstale uno para obtener N.
- Coloca un uno en el primer lugar del resultado final, que representa el valor 2 N .
- Lee y añade los siguientes N dígitos.
Ejemplo: 001010011
- 2 ceros iniciales en 001
- lee 2 bits más, es decir 00101
- decodificar N + 1 = 00101 = 5
- Se obtienen N = 5 − 1 = 4 bits restantes para el código completo, es decir, 0011.
- Número codificado = 2 4 + 3 = 19
Este código se puede generalizar a enteros cero o negativos de la misma manera que se describe en la codificación gamma de Elias .
Código de ejemplo
Codificación
void eliasDeltaEncode ( const ByteBuffer & source , ByteBuffer & dest ) { IntReader intreader ( source ); BitWriter bitwriter ( dest ); while ( intreader . hasLeft ()) { int num = intreader . getInt ();int len = 1 + std :: floor ( std :: log2 ( num ) ) ; int lengthOfLen = std :: floor ( std :: log2 ( len )); for ( int i = lengthOfLen ; i > 0 ; --i ) { bitwriter.outputBit ( 0 ) ; } for ( int i = lengthOfLen ; i > = 0 ; --i ) { bitwriter.outputBit ( ( len >> i ) & 1 ) ; } for ( int i = len - 2 ; i > = 0 ; --i ) { bitwriter.outputBit ( ( num >> i ) & 1 ) ; } }bitwriter.close ( ) ; intreader.close ( ) ; }Descodificación
void eliasDeltaDecode ( const ByteBuffer & source , ByteBuffer & dest ) { BitReader bitreader ( source ); IntWriter intwriter ( dest ); while ( bitreader . hasLeft ()) { int num = 1 ; int len = 1 ; int lengthOfLen = 0 ;// potencialmente peligroso con archivos mal formados. while ( ! bitreader . inputBit ()) { ++ lengthOfLen ; } for ( int i = 0 ; i < lengthOfLen ; ++ i ) { len <<= 1 ; if ( bitreader . inputBit ()) { len |= 1 ; } } for ( int i = 0 ; i < len - 1 ; ++ i ) { num <<= 1 ; if ( bitreader . inputBit ()) { num |= 1 ; } }intwriter.putInt ( num ); // escribir el valor } bitreader.close ( ) ; intwriter.close ( ) ; }Generalizaciones
La codificación delta de Elias no codifica enteros cero ni negativos. Una forma de codificar todos los enteros no negativos es sumar 1 antes de la codificación y luego restar 1 después de la decodificación. Otra forma de codificar todos los enteros es establecer una biyección , mapeando todos los enteros (0, 1, −1, 2, −2, 3, −3, ...) a enteros estrictamente positivos (1, 2, 3, 4, 5, 6, 7, ...) antes de la codificación. Esta biyección se puede realizar utilizando la codificación "ZigZag" de Protocol Buffers (que no debe confundirse con el código Zigzag ni con la codificación de entropía zigzag JPEG ).
Véase también
Referencias
- 1 2 Elias, Peter (marzo de 1975). "Conjuntos de palabras clave universales y representaciones de los enteros". IEEE Transactions on Information Theory . 21 (2): 194– 203. doi : 10.1109/tit.1975.1055349 .
Lecturas adicionales
- Codificación de entropía
- Sistemas numéricos
- Compresión de datos