Codificación delta de Elias


De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

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:

  1. Sea N  = ⌊log 2 X ⌋; ser la potencia más alta de 2 en X , por lo que 2 NX <2 N +1 .
  2. Sea L  = ⌊log 2 N + 1⌋ la potencia más alta de 2 en N +1, entonces 2 LN +1 <2 L +1 .
  3. Escriba L ceros, seguido de
  4. la representación binaria de L + 1 bit de N +1, seguida de
  5. todos excepto el bit inicial (es decir, los últimos N bits) de X .

Una forma equivalente de expresar el mismo proceso:

  1. Separe X en la potencia más alta de 2 que contiene (2 N ) y los N dígitos binarios restantes .
  2. Codifique N +1 con la codificación gamma de Elias .
  3. Agregue los N dígitos binarios restantes a esta representación de N +1.

Para representar un número , Elias delta (δ) usa bits. [1] : 200 

El código comienza usando en lugar de :

Para decodificar un entero codificado en delta de Elias:

  1. Lea y cuente los ceros de la secuencia hasta llegar al primero. Llame a este número de ceros de L .
  2. Considerando que el que se alcanzó es el primer dígito de un entero, con un valor de 2 L , lea los L restantes del número entero. Llame a este número entero N 1, y restar uno para obtener N .
  3. Poner un uno en el primer lugar de nuestro producto final, que representa el valor 2 N .
  4. Lea y agregue los siguientes N dígitos.

Ejemplo:

001010011
1. 2 ceros a la izquierda en 001
2. leer 2 bits más, es decir, 00101
3. decodificar N + 1 = 00101 = 5
4. obtenga N = 5 - 1 = 4 bits restantes para el código completo, es decir, '0011'
5. número codificado = 2 4 + 3 = 19

Este código se puede generalizar a números 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 ( char * fuente , char * dest )    { IntReader intreader ( fuente );  BitWriter bitwriter ( dest );  while ( intreader . hasLeft ())  { int num = intreader . getInt ();    int len = 0 ;    int lengthOfLen = 0 ;    len = 1 + piso ( log2 ( num )); // calcular 1 + piso (log2 (num)) lengthOfLen = piso ( log2 ( len )); // calcular el piso (log2 (len)) para ( int i = lengthOfLen ; i > 0 ; - i )                    bitwriter . outputBit ( 0 ); para ( int i = lengthOfLen ; i > = 0 ; - i )         bitwriter . outputBit (( len >> i ) & 1 );     para ( int i = len -2 ; i > = 0 ; i - )         bitwriter . outputBit (( num >> i ) & 1 );     } bitwriter . cerrar (); intreader . cerrar ();}

Descodificación

void eliasDeltaDecode ( char * fuente , char * dest )    { BitReader bitreader ( fuente );  IntWriter intwriter ( dest );  while ( lector de bits . hasLeft ())  { int num = 1 ;    int len = 1 ;    int lengthOfLen = 0 ;    while ( ! bitreader . inputBit ()) // potencialmente peligroso con archivos mal formados. lengthOfLen ++ ;    para ( int i = 0 ; i < lengthOfLen ; i ++ )         { len << = 1 ;   si ( lector de bits . inputBit ())  len | = 1 ;   } para ( int i = 0 ; i < len -1 ; i ++ )         { num << = 1 ;   si ( lector de bits . inputBit ())  num | = 1 ;   } intérprete . putInt ( num ); // escribe el valor }   lector de bits . cerrar (); intérprete . cerrar ();}

Generalizaciones

La codificación delta de Elias no codifica números enteros cero o negativos. Una forma de codificar todos los enteros no negativos es sumar 1 antes de codificar y luego restar 1 después de decodificar. Una forma de codificar todos los enteros es configurar 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 codificar. 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 JPEG Zig-zag ).

Ver también

Referencias

  1. a b Elias, Peter (marzo de 1975). "Conjuntos de palabras de código universales y representaciones de los números enteros". Transacciones IEEE sobre teoría de la información . 21 (2): 194-203. doi : 10.1109 / tit.1975.1055349 .

Otras lecturas