stringtranslate.com

Código de longitud variable

En teoría de codificación , un código de longitud variable es un código que asigna símbolos de origen a una cantidad variable de bits . El concepto equivalente en informática es cadena de bits .

Los códigos de longitud variable permiten comprimir y descomprimir fuentes con cero errores ( compresión de datos sin pérdida ) y, aun así, leerlas símbolo por símbolo. Con la estrategia de codificación adecuada, una fuente independiente e idénticamente distribuida puede comprimirse casi arbitrariamente cerca de su entropía . Esto contrasta con los métodos de codificación de longitud fija, para los cuales la compresión de datos solo es posible para grandes bloques de datos, y cualquier compresión más allá del logaritmo del número total de posibilidades conlleva una probabilidad finita (aunque quizás arbitrariamente pequeña) de falla.

Algunos ejemplos de estrategias de codificación de longitud variable bien conocidas son la codificación de Huffman , la codificación de Lempel-Ziv , la codificación aritmética y la codificación de longitud variable adaptativa al contexto .

Códigos y sus extensiones

La extensión de un código es el mapeo de secuencias fuente de longitud finita a cadenas de bits de longitud finita, que se obtiene concatenando para cada símbolo de la secuencia fuente la palabra de código correspondiente producida por el código original.

Utilizando términos de la teoría del lenguaje formal , la definición matemática precisa es la siguiente: Sean y dos conjuntos finitos, llamados alfabetos de origen y destino , respectivamente. Un código es una función total [1] que asigna cada símbolo de a una secuencia de símbolos sobre , y la extensión de a un homomorfismo de en , que asigna naturalmente cada secuencia de símbolos de origen a una secuencia de símbolos de destino, se conoce como su extensión .

Clases de códigos de longitud variable

Los códigos de longitud variable se pueden anidar estrictamente en orden decreciente de generalidad como códigos no singulares, códigos decodificables de forma única y códigos de prefijo. Los códigos de prefijo siempre son decodificables de forma única y estos, a su vez, siempre son no singulares:

Códigos no singulares

Un código no es singular si cada símbolo de origen se asigna a una cadena de bits no vacía diferente, es decir, la asignación de los símbolos de origen a las cadenas de bits es inyectiva .

Códigos decodificables de forma única

Un código es decodificable de forma única si su extensión es § no singular. Se puede decidir si un código dado es decodificable de forma única con el algoritmo de Sardinas–Patterson .

Códigos de prefijo

Un código es un código de prefijo si ninguna cadena de bits de destino en la asignación es un prefijo de la cadena de bits de destino de un símbolo de origen diferente en la misma asignación. Esto significa que los símbolos se pueden decodificar instantáneamente después de recibir su palabra de código completa. Otros nombres que se usan comúnmente para este concepto son código sin prefijo , código instantáneo o código sin contexto .

Ejemplo de codificación y decodificación:
aabacdab → 00100110111010 → |0|0|10|0|110|111|0|10| → aabacdab

Un caso especial de códigos de prefijo son los códigos de bloque . En estos casos, todas las palabras de código deben tener la misma longitud. Estos últimos no son muy útiles en el contexto de la codificación de fuente , pero a menudo sirven como corrección de errores hacia adelante en el contexto de la codificación de canal .

Otro caso especial de códigos de prefijo son los códigos LEB128 y de cantidad de longitud variable (VLQ), que codifican números enteros arbitrariamente grandes como una secuencia de octetos, es decir, cada palabra de código es un múltiplo de 8 bits.

Ventajas

La ventaja de un código de longitud variable es que a los símbolos de origen improbables se les pueden asignar palabras de código más largas y a los símbolos de origen probables se les pueden asignar palabras de código más cortas, lo que da como resultado una longitud de palabra de código esperada baja . Para el ejemplo anterior, si las probabilidades de (a, b, c, d) fueran , la cantidad esperada de bits utilizados para representar un símbolo de origen utilizando el código anterior sería:

.

Como la entropía de esta fuente es de 1,75 bits por símbolo, este código comprime la fuente tanto como sea posible para que pueda recuperarse con cero errores.

Véase también

Referencias

  1. ^ ab Este código se basa en un ejemplo encontrado en Berstel et al. (2009), Ejemplo 2.3.1, pág. 63.

Lectura adicional