Codificación delta de Elías
El código Elias δ o código Elias delta es un código universal que codifica los números enteros positivos desarrollado por Peter Elias.
Codificación
Para codificar un número X ≥ 1:
- Vamos N= ⌊log2 X⌋; ser el poder más alto de 2 en X, así que 2N ≤ X 2N+ 1.
- Vamos L= ⌊log2 N+1⌋ ser el poder más alto de 2 en N+1, so 2L ≤ N+1L+ 1.
- Escriba L ceros, seguidos
- el L+1-bit representación binaria de N+1, seguido
- todo menos la parte principal (es decir, la última N bits) of X.
Una forma equivalente de expresar el mismo proceso:
- Separación X en el poder más alto de 2 contiene (2N) y el resto N dígitos binarios.
- Código N+1 con Elias gamma codificación.
- Apéndice el resto N dígitos binarios a esta representación de N+1.
To represent a number x{displaystyle x}, Elias delta (δ) utiliza ⌊ ⌊ log2 ()x)⌋ ⌋ +2⌊ ⌊ log2 ()⌊ ⌊ log2 ()x)⌋ ⌋ +1)⌋ ⌋ +1{displaystyle lfloor log _{2}(x)rfloor +2lfloor log _{2}(lfloor log _{2}(x)rfloor +1)rfloor +1} bits.
El código comienza, utilizando γ γ .{displaystyle gamma} en lugar de γ γ {displaystyle gamma }:
Número | N | N+1 | δ encoding | Probabilidad implícita |
---|---|---|---|---|
1 = 20 | 0 | 1 | 1 | 1/2 |
2 = 21 + 0 | 1 | 2 | 0 1 0 0 | 1/16 |
3 = 21 + 1 | 1 | 2 | 0 1 0 1 | 1/16 |
4 = 22 + 0 | 2 | 3 | 0 1 1 00 | 1/32 |
5 = 22 + 1 | 2 | 3 | 0 1 1 01 | 1/32 |
6 = 22 + 2 | 2 | 3 | 0 1 1 10 | 1/32 |
7 = 22 + 3 | 2 | 3 | 0 1 1 11 | 1/32 |
8 = 23 + 0 | 3 | 4 | 00 1 00 000 | 1/256 |
9 = 23 + 1 | 3 | 4 | 00 1 00 001 | 1/256 |
10 = 23 + 2 | 3 | 4 | 00 1 00 010 | 1/256 |
11 = 23 + 3 | 3 | 4 | 00 1 00 011 | 1/256 |
12 = 23 + 4 | 3 | 4 | 00 1 00 100 | 1/256 |
13 = 23 + 5 | 3 | 4 | 00 1 00 101 | 1/256 |
14 = 23 + 6 | 3 | 4 | 00 1 00 110 | 1/256 |
15 = 23 + 7 | 3 | 4 | 00 1 00 111 | 1/256 |
16 = 24 + 0 | 4 | 5 | 00 1 01 0000 | 1/512 |
17 = 24+1 | 4 | 5 | 00 1 01 0001 | 1/512 |
Para decodificar un entero con codificación delta de Elias:
- Lea y cuente ceros desde el arroyo hasta llegar al primero. Llama a este conteo de ceros L.
- Considerando el que fue alcanzado para ser el primer dígito de un entero, con un valor de 2L, leer el resto L dígitos del entero. Llama a este entero N+1, y restar uno para conseguir N.
- Ponga una en el primer lugar de nuestra salida final, representando el valor 2N.
- Lea y apéndice los siguientes N dígitos.
Ejemplo:
001010011 1. 2 ceros principales en 001 2. leer 2 bits más i.e. 00101 3. decodificación N+1 = 00101 = 5 4. obtener N = 5 - 1 = 4 bits restantes para el código completo, es decir, '0011 ' 5. número codificado = 24 + 3 = 19
Este código se puede generalizar a cero o enteros negativos de la misma manera que se describe en la codificación gamma de Elias.
Código de ejemplo
Codificación
vacío eliasDeltaIncode()char* fuente, char* dest){} IntReader intreader()fuente); BitWriter bitwriter()dest); mientras ()intreader.hasLeft()) {} int num = intreader.# Int(); int Len = 0; int longitudOfLen = 0; Len = 1 + planta baja()log2()num)); // calcular 1+floor(log2(num)) longitudOfLen = planta baja()log2()Len)); // calcular piso(log2(len))) para ()int i = longitudOfLen; i ■ 0; --i) bitwriter.Producto Bit()0); para ()int i = longitudOfLen; i >= 0; --i) bitwriter.Producto Bit()Len > i) " 1); para ()int i = Len-2; i >= 0; i--) bitwriter.Producto Bit()num > i) " 1); } bitwriter.cerca(); intreader.cerca();}
Decodificación
vacío eliasDeltaDecode()char* fuente, char* dest){} BitReader bitreader()fuente); IntWriter intwriter()dest); mientras ()bitreader.hasLeft()) {} int num = 1; int Len = 1; int longitudOfLen = 0; mientras ()!bitreader.entrada Bit()) // potencialmente peligroso con archivos malformados. longitudOfLen++; para ()int i = 0; i . longitudOfLen; i++) {} Len " 1; si ()bitreader.entrada Bit()) Len ← 1; } para ()int i = 0; i . Len-1; i++) {} num " 1; si ()bitreader.entrada Bit()) num ← 1; } intwriter.putInt()num); // escriba el valor } bitreader.cerca(); intwriter.cerca();}
Generalizaciones
La codificación delta de Elias no codifica cero ni enteros 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 establecer una biyección, mapeando enteros 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 usando el "ZigZag" codificación de búferes de protocolo (que no debe confundirse con el código Zigzag, ni con la codificación de entropía JPEG Zig-zag).
Contenido relacionado
Programación alfabetizada
Intercambio de paquetes entre redes
Mapa bilineal