fbpx
Wikipedia

Codificación Huffman

En ciencias de la computación y teoría de la información, la codificación Huffman es un algoritmo usado para compresión de datos. El término se refiere al uso de una tabla de códigos de longitud variable para codificar un determinado símbolo (como puede ser un carácter en un archivo), donde la tabla ha sido rellenada de una manera específica basándose en la probabilidad estimada de aparición de cada posible valor de dicho símbolo. Fue desarrollado por David A. Huffman mientras era estudiante de doctorado en el MIT, y publicado en "A Method for the Construction of Minimum-Redundancy Codes".

Árbol de Huffman generado para las frecuencias de apariciones exactas del texto "ESTO ES UN EJEMPLO DE UN ARBOL DE HUFFMAN". Las frecuencias y códigos de cada carácter se muestran abajo. Codificar esta frase de 41 caracteres usando este código requiere 156 bits (sin contar con el espacio para el árbol) cuando con bytes de 8 bits requiere 328 bits.
Carácter Frecuencia Código
Espacio 8 00
E 6 100
N 3 1100
O 3 1110
U 3 0100
A 2 0101
D 2 1010
F 2 1011
L 2 0110
M 2 0111
S 2 11010
B 1 110110
H 1 110111
J 1 111100
P 1 111101
R 1 111110
T 1 111111

La codificación Huffman usa un método específico para elegir la representación de cada símbolo, que da lugar a un código prefijo (es decir, la cadena de bits que representa a un símbolo en particular nunca es prefijo de la cadena de bits de un símbolo distinto) que representa los caracteres más comunes usando las cadenas de bits más cortas, y viceversa. Huffman fue capaz de diseñar el método de compresión más eficiente de este tipo: ninguna representación alternativa de un conjunto de símbolos de entrada produce una salida media más pequeña cuando las frecuencias de los símbolos coinciden con las usadas para crear el código. Posteriormente se encontró un método para llevar esto a cabo en un tiempo lineal si las probabilidades de los símbolos de entrada (también conocidas como "pesos") están ordenadas.

Para un grupo de símbolos con una distribución de probabilidad uniforme y un número de miembros que es potencia de dos, la codificación Huffman es equivalente a una codificación en bloque binaria, por ejemplo, la codificación ASCII. La codificación Huffman es un método para crear códigos prefijo tan extendido que el término "codificación Huffman" es ampliamente usado como sinónimo de "código prefijo", incluso cuando dicho código no se ha producido con el algoritmo de Huffman.

Aunque la codificación de Huffman es óptima para una codificación símbolo a símbolo dada una distribución de probabilidad, su optimalidad a veces puede verse accidentalmente exagerada. Por ejemplo, la codificación aritmética y la codificación LZW normalmente ofrecen mayor capacidad de compresión. Estos dos métodos pueden agrupar un número arbitrario de símbolos para una codificación más eficiente, y en general se adaptan a las estadísticas de entrada reales. Este último es útil cuando las probabilidades no se conocen de forma precisa o varían significativamente dentro del flujo de datos.

Historia

En 1951, a David Huffman y a sus compañeros de clase de la asignatura “Teoría de la Información” se les permitió optar entre la realización de un examen final o la presentación de un trabajo. El profesor Robert. M. Fano asignó las condiciones del trabajo bajo la premisa de encontrar el código binario más eficiente. Huffman, ante la imposibilidad de demostrar qué código era más eficiente, se rindió y empezó a estudiar para el examen final. Mientras estaba en este proceso vino a su mente la idea de usar árboles binarios de frecuencia ordenada y rápidamente probó que éste era el método más eficiente.

Con este estudio, Huffman superó a su profesor, quien había trabajado con el inventor de la teoría de la información Claude Shannon con el fin de desarrollar un código similar. Huffman solucionó la mayor parte de los errores en el algoritmo de codificación Shannon-Fano. La solución se basaba en el proceso de construir el árbol de abajo a arriba en vez de al contrario.

Definición del problema

Descripción informal

Dados
Un conjunto de símbolos y sus pesos (normalmente proporcionales a probabilidades).
Encontrar
Un código binario prefijo (un conjunto de elementos del código) con longitud de palabra esperada mínima (de forma equivalente, un árbol con longitud del camino mínima).

Descripción formal

Entradas

El alfabeto  , que es el alfabeto de símbolos de tamaño  .
El conjunto  , que es el conjunto de pesos (positivos) de los símbolos (normalmente proporcionales a probabilidades), es decir  .

Salida

El código  , que es el conjunto de elementos del código (binario), donde   es la palabra del código para  .

Objetivo

Sea   la longitud del camino ponderado del código  . Condición:   para cualquier código  .

Ejemplo

Entrada (A, W) Símbolo (ai) a b c d e Suma
Peso (wi) 0.10 0.15 0.30 0.16 0.29 = 1
Salida C Palabras del código (ci) 010 011 11 00 10  
Longitud de la palabra (en bits)
(li)
3 3 2 2 2
Longitud del camino ponderado
(li wi )
0.30 0.45 0.60 0.32 0.58 L(C) = 2.25
Optimalidad Probabilidad
(2-li)
1/8 1/8 1/4 1/4 1/4 = 1.00
Cantidad de información (en bits)
(−log2 wi) ≈
3.32 2.74 1.74 2.64 1.79  
Entropía
(−wi log2 wi)
0.332 0.411 0.521 0.423 0.518 H(A) = 2.205

Para cualquier código biunívoco, aquel código decodificable de forma única, la suma de las probabilidades de todos los símbolos es siempre menor o igual que uno. En este ejemplo, es exactamente igual a uno; por lo que decimos que es un código completo. Si no es el caso siempre se puede derivar un código equivalente añadiendo símbolos extra (con probabilidades nulas asociadas), para hacer el código completo a la vez que se mantiene biunívoco.

Tal como definió Shannon (1948), la cantidad de información h (en bits) de cada símbolo ai con probabilidad no nula wi es

 

La entropía H (en bits) es la suma ponderada, de todos los símbolos ai con probabilidad no nula wi, de la cantidad de información de cada símbolo:

 

(Nota: un símbolo con probabilidad cero tiene una contribución nula a la entropía. Cuando w = 0,   es una indeterminación; aplicando la regla de L'Hôpital :

 .

Por simplicidad, los símbolos con probabilidad nula han sido dejados fuera de la fórmula anterior).

Como consecuencia del teorema de codificación de fuente de Shannon, la entropía es una medida de la longitud de palabra más pequeña del código que es teóricamente posible para un alfabeto dado con unos pesos asociados. En este ejemplo, la longitud media de la palabra es 2,25 bits por símbolo, ligeramente mayor que la entropía calculada de 2,205 bits por símbolo. Así que no solo este código es óptimo en el sentido de que ningún otro código posible funciona mejor, sino que además está muy cercano al límite teórico establecido por Shannon.

Nótese que, en general, un código Huffman no necesita ser único, pero si lo es siempre es uno de los códigos que minimiza  .

Técnica básica

La técnica utilizada es el propio algoritmo de Huffman. Consiste en la creación de un árbol binario en el que se etiquetan los nodos hoja con los caracteres, junto a sus frecuencias, y de forma consecutiva se van uniendo cada pareja de nodos que menos frecuencia sumen, pasando a crear un nuevo nodo intermedio etiquetado con dicha suma. Se procede a realizar esta acción hasta que no quedan nodos hoja por unir a ningún nodo superior, y se ha formado el árbol binario.

Posteriormente se etiquetan las aristas que unen cada uno de los nodos con ceros y unos (hijo derecho e izquierdo, respectivamente, por ejemplo). El código resultante para cada carácter es la lectura, siguiendo la rama, desde la raíz hacia cada carácter (o viceversa) de cada una de las etiquetas de las aristas.

Construcción del árbol

Para obtener los códigos de Huffman hay que construir un árbol binario de nodos, a partir de una lista de nodos, cuyo tamaño depende del número de símbolos,  . Los nodos contienen dos campos, el símbolo y el peso (frecuencia de aparición).

Cada nodo del árbol puede ser o bien un nodo hoja o un nodo interno. Inicialmente se considera que todos los nodos de la lista inicial son nodos hoja del árbol. Al ir construyendo el árbol, los nodos internos tendrán un peso y dos nodos hijos, y opcionalmente un enlace al nodo padre que puede servir para recorrer el árbol en ambas direcciones. Por convención el bit '0' se asocia a la rama izquierda y el bit '1' a la derecha. Una vez finalizado el árbol contendrá   nodos hijo y   nodos internos.

El proceso de construcción del árbol comienza formando un nodo intermedio que agrupa a los dos nodos hoja que tienen menor peso (frecuencia de aparición). El nuevo nodo intermedio tendrá como nodos hijos a estos dos nodos hoja y su campo peso será igual a la suma de los pesos de los nodos hijos. Los dos nodos hijos se eliminan de la lista de nodos, sustituyéndolos por el nuevo nodo intermedio. El proceso se repite hasta que solo quede un nodo en la lista. Este último nodo se convierte en el nodo raíz del árbol de Huffman.

El algoritmo de construcción del árbol puede resumirse así:

  1. Crear un nodo hoja para cada símbolo, asociando un peso según su frecuencia de aparición e insertarlo en la lista ordenada ascendentemente.
  2. Mientras haya más de un nodo en la lista:
    1. Eliminar los dos nodos con menor probabilidad de la lista.
    2. Crear un nuevo nodo interno que enlace a los nodos anteriores, asignándole como peso la suma de los pesos de los nodos hijos.
    3. Insertar el nuevo nodo en la lista, (en el lugar que le corresponda según el peso).
  3. El nodo que quede es el nodo raíz del árbol.

Aquí hay un ejemplo de construcción del árbol a partir del texto en francés "j'aime aller sur le bord de l'eau les jeudis ou les jours impairs":

 

Propiedades principales

Las probabilidades usadas pueden ser genéricas para el dominio de la aplicación, que están basadas en el caso promedio, o pueden ser las frecuencias reales encontradas en el texto que se está comprimiendo. (Esta variación requiere que la tabla de frecuencias u otra estructura utilizada para la codificación deben ser almacenadas con el texto comprimido; las implementaciones emplean varios mecanismos para almacenar tablas de manera eficiente).

La codificación Huffman es óptima cuando la probabilidad de cada símbolo de entrada es una potencia negativa de dos. Los códigos prefijos tienden a ser ligeramente ineficientes en alfabetos pequeños, donde las probabilidades normalmente se encuentran entre esos puntos óptimos. El "empaquetado", o expansión del tamaño del alfabeto concatenando múltiples símbolos en "palabras" de tamaño fijo o variable antes de la codificación Huffman, normalmente ayuda, especialmente cuando símbolos adyacentes están correlacionados (como en el caso de un texto en lenguaje natural). El peor caso para una codificación Huffman puede darse cuando la probabilidad de un símbolo excede 2-1 = 0.5, haciendo el límite superior de ineficiencia ilimitado. Estas situaciones a menudo responden bien a una forma de paquete llamada codificación run-length.

La codificación aritmética produce una ligera ganancia sobre la codificación Huffman, pero en la práctica esta ganancia raramente ha sido lo bastante grande como para utilizar la codificación aritmética que posee una complejidad computacional más elevada y además requiere el pago de royalties. (A julio de 2006, IBM posee patentes de muchos métodos de codificación aritmética en varias jurisdicciones).

Variación

Existen muchas variaciones del código de Huffman, algunos que utilizan Huffman como algoritmo, y otros que encuentra el código prefijo óptimo. Tenga en cuenta que en este último caso el método no es necesariamente similar al de Huffmans y no tiene por qué terminar en tiempo polinómico.

Código Huffman n-ario

El algoritmo n-ario de Huffman usa el alfabeto {0,1,….,n-1} para codificar el mensaje y construir un árbol n-ario. Este enfoque fue considerado por Huffman en su enfoque originario.

Código Huffman adaptable

La variación llamada código de Huffman adaptable calcula dinámicamente la probabilidad de la frecuencia de la cadena de origen basada en antiguas apariciones. Está relacionado con la familia de algoritmos LZ.

Algoritmo de Huffman de plantilla

La mayoría de las veces, el tamaño de las implementaciones del código de Huffman están representadas por probabilidades numéricas, pero el algoritmo no lo exige; se requiere solo una manera de ordenar el tamaño y añadirle. El algoritmo de plantilla de Huffman permite utilizar cualquier tipo de tamaño (costos, frecuencias, los pares del tamaño, tamaños no numéricos) y uno de los muchos que combina métodos (no solo la adición). Tales algoritmos pueden resolver problemas de minimización, como la minimización de Max[Wi + C(i)], un problema que se aplicó por primera vez en el diseño de circuitos.

Código de Huffman de tamaño limitado

El Código de Huffman de tamaño de limitado es una variante donde el objetivo es lograr que el camino de coste mínimo con la restricción de que la longitud de cada palabra sea menor que una constante. El algoritmo de package-merge lo soluciona con un algoritmo voraz, muy similar al usado por el algoritmo de Huffman. Su complejidad es del orden de O (nL), siendo L el tamaño de la palabra más larga. No se conoce algoritmo para resolver este problema en tiempo lineal, a diferencia de los problemas convencionales de Huffman.

Codificación Huffman con costes desiguales

En el problema estándar de la codificación Huffman, se asume que cada símbolo del alfabeto con el que se construye cada palabra del código tiene igual costo de transmisión: una palabra del código cuya longitud sea N dígitos siempre tendrá un costo de N, sin importar cuántos de esos dígitos sean ceros, cuántos unos, etc. Cuando se trabaja bajo esta suposición, minimizar el costo total del mensaje y minimizar el número total de dígitos es lo mismo.

En la codificación Huffman con costes desiguales la suposición anterior ya no es verdadera: los símbolos del alfabeto pueden tener longitudes no uniformes, debido a características del medio de transmisión. Un ejemplo es el alfabeto del código Morse, donde una 'raya' requiere más tiempo para ser enviada que un 'punto', y por lo tanto el costo del tiempo de transmisión de una raya es mayor. El objetivo sigue siendo minimizar la longitud media de la palabra de código, pero no es suficiente con minimizar el número de símbolos usado en el mensaje. No se conoce un algoritmo para solucionar esto de la misma manera o con la misma eficiencia que la codificación Huffman convencional.

Árboles binarios alfabéticos óptimos (codificación Hu-Tucker)

En una situación de codificación Huffman estándar, se asume que cualquier código puede corresponderse con cualquier símbolo de entrada. En la versión alfabética, el orden alfabético de las entradas y salidas debe ser idéntico. Así, por ejemplo, a la entrada   no se le puede asignar  , sino que le correspondería   o  . Esto también se conoce como el problema de Hu-Tucker, por los autores de la publicación que contiene la primera solución linearítmica a este problema de optimalidad binaria alfabética, que es similar al algoritmo de Huffman, pero no es una variación del mismo. Estos árboles binarios alfabéticos óptimos son usados a menudo como árboles binarios de búsqueda.

Código canónico de Huffman

Si los pesos correspondientes a las entradas (ordenadas alfabéticamente) están en orden numérico, los códigos de Huffman tienen la misma longitud que los códigos alfabético óptimos, así que pueden calcularse como estas últimas, haciendo que la codificación Hu-Tucker sea innecesaria. El código resultante de las entradas (re) ordenadas numéricamente se conoce como código canónico de Huffman y es el código que normalmente se usa en la práctica, dada su facilidad para codificar y decodificar. La técnica para encontrar este código se conoce como codificación de Huffman-Shannon-Fano, ya que es óptima como la codificación de Huffman, y alfabética según la probabilidad de los pesos, como la codificación de Shannon-Fano.

De esta manera, el método de codificación de Huffman-Shannon-Fano ira asignando gradualmente los códigos prefijo más cortos a aquellos símbolos de mayor peso, y los más largos a los de menor peso. Es Decir, ordenará descendentemente los símbolos según su peso, luego codificará según el método de Codificación Shannon-Fano, una vez obtenida la codificación se procede al armado del un Diagrama de flujo que comienza preguntando si el valor del primer bit del prefijo obtenido para el símbolo buscado es 0, del cual salen las 2 ramas, una para la afirmación y otra para la negación; luego seguirá preguntando para el segundo bit y derivará, para cada rama, a otra decisión o a un símbolo, según corresponda.

Aplicaciones

La codificación aritmética puede considerarse como una generalización de la codificación de Huffman, de hecho, en la práctica la codificación Aritmética viene precedida por la codificación de huffman, pues es más fácil encontrar una aritmética para una entrada binaria que para una no binaria. Por otra parte aunque la codificación de compresión ofrece mejor rendimiento que la codificación de Huffman, la codificación de Huffman se encuentra todavía en uso generalizado debido a su simplicidad, alta velocidad, y falta de problemas de patentes.

La codificación de Huffman se utiliza a menudo en algún otro método de compresión. Como la deflación y códec multimedia como JPEG y MP3 que tienen una cuantificación digital basada en la codificación de Huffman.

Ejemplo

Una sonda espacial ha sido lanzada al espacio para contar cierto tipo de perturbaciones estelares. Ha de contar cuántas se producen en cada minuto, y tiene cada día una ventana de tiempo bastante reducida para enviar los datos a Tierra; por tanto, interesa reducir al máximo el tiempo de transmisión, y para ello se recurre a codificar las muestras mediante un código de Huffman.

En la siguiente tabla se muestran los valores a transmitir, junto con sus frecuencias relativas, su código en una codificación binaria de 3 bits, y su código en un posible código Huffman para estos valores.

Valor Frecuencia Código binario Código Huffman
0 10% 000 010
1 20% 001 10
2 30% 010 00
3 25% 011 11
4 10% 100 0110
5 o más 5% 101 0111

Puede observarse que, en la codificación binaria, todos los posibles valores reciben códigos del mismo número de bits, mientras que en la codificación Huffman, cada valor tiene un número diferente de bits: los códigos más frecuentes poseen dos bits, mientras que los menos frecuentes poseen cuatro bits.

A continuación se observa el código necesario para transmitir la siguiente serie de valores:

5,4,2,3,2,2,1,0,1,3,2,4,3,4,3,2,3,4,2,4 

Utilizando la codificación binaria, sería una serie de 60 bits; es decir, 3 bits por símbolo.

101100010011010010001000001011010100011100011010011100010100 

nota: se ha añadido la misma serie separada en bloques con la única razón de facilitar una transcripción manual libre de errores para un estudio por parte del lector interesado.

101.100.010.011.010.010.001.000.001.011.010.100.011.100.011.010.011.100.010.100 

Utilizando, en cambio, la codificación Huffman, se tendría que enviar una secuencia de 53 bits; es decir, 2,65 bits por símbolo.

01110110001100001001010110001101101101100110110000110 

nota: la misma serie dividida en bloques de 4 bits para la misma observación anterior.

0111.0110.0011.0000.1001.0101.1000.1101.1011.0110.0110.1100.0011.0 

En este ejemplo, la media de bits por símbolo que cabría esperar de esta codificación, en cadenas de valores más largas, es de 2,4.

Para su comparación, la entropía del conjunto de símbolos es de 2,366; es decir, el mejor método de compresión sería capaz de codificar estos valores utilizando 2,366 bits por símbolo.

Es posible, también, apreciar cómo se pueden extraer sin ninguna ambigüedad los valores originales a partir de la cadena codificada mediante Huffman.

Hay que añadir que la codificación de Huffman no puede ser aplicada a imágenes en blanco y negro porque es incapaz de producir compresión sobre un alfabeto binario.

Bibliografía

  • D.A. Huffman, "A method for the construction of minimum-redundancy codes", Proceedings of the I.R.E., sept 1952, pp 1098-1102

Véase también

Enlaces externos

  • Generador de árboles de Huffman
  • Huffman en PHP
  •   Datos: Q2647
  •   Multimedia: Huffman coding

codificación, huffman, sugerido, algoritmo, huffman, fusionado, este, artículo, sección, véase, discusión, hayas, realizado, fusión, artículos, pide, fusión, historiales, aquí, este, aviso, puesto, febrero, 2021, ciencias, computación, teoría, información, cod. Se ha sugerido que Algoritmo de Huffman sea fusionado en este articulo o seccion vease discusion Una vez que hayas realizado la fusion de articulos pide la fusion de historiales aqui Este aviso fue puesto el 14 de febrero de 2021 En ciencias de la computacion y teoria de la informacion la codificacion Huffman es un algoritmo usado para compresion de datos El termino se refiere al uso de una tabla de codigos de longitud variable para codificar un determinado simbolo como puede ser un caracter en un archivo donde la tabla ha sido rellenada de una manera especifica basandose en la probabilidad estimada de aparicion de cada posible valor de dicho simbolo Fue desarrollado por David A Huffman mientras era estudiante de doctorado en el MIT y publicado en A Method for the Construction of Minimum Redundancy Codes Arbol de Huffman generado para las frecuencias de apariciones exactas del texto ESTO ES UN EJEMPLO DE UN ARBOL DE HUFFMAN Las frecuencias y codigos de cada caracter se muestran abajo Codificar esta frase de 41 caracteres usando este codigo requiere 156 bits sin contar con el espacio para el arbol cuando con bytes de 8 bits requiere 328 bits Caracter Frecuencia CodigoEspacio 8 00E 6 100N 3 1100O 3 1110U 3 0100A 2 0101D 2 1010F 2 1011L 2 0110M 2 0111S 2 11010B 1 110110H 1 110111J 1 111100P 1 111101R 1 111110T 1 111111 La codificacion Huffman usa un metodo especifico para elegir la representacion de cada simbolo que da lugar a un codigo prefijo es decir la cadena de bits que representa a un simbolo en particular nunca es prefijo de la cadena de bits de un simbolo distinto que representa los caracteres mas comunes usando las cadenas de bits mas cortas y viceversa Huffman fue capaz de disenar el metodo de compresion mas eficiente de este tipo ninguna representacion alternativa de un conjunto de simbolos de entrada produce una salida media mas pequena cuando las frecuencias de los simbolos coinciden con las usadas para crear el codigo Posteriormente se encontro un metodo para llevar esto a cabo en un tiempo lineal si las probabilidades de los simbolos de entrada tambien conocidas como pesos estan ordenadas Para un grupo de simbolos con una distribucion de probabilidad uniforme y un numero de miembros que es potencia de dos la codificacion Huffman es equivalente a una codificacion en bloque binaria por ejemplo la codificacion ASCII La codificacion Huffman es un metodo para crear codigos prefijo tan extendido que el termino codificacion Huffman es ampliamente usado como sinonimo de codigo prefijo incluso cuando dicho codigo no se ha producido con el algoritmo de Huffman Aunque la codificacion de Huffman es optima para una codificacion simbolo a simbolo dada una distribucion de probabilidad su optimalidad a veces puede verse accidentalmente exagerada Por ejemplo la codificacion aritmetica y la codificacion LZW normalmente ofrecen mayor capacidad de compresion Estos dos metodos pueden agrupar un numero arbitrario de simbolos para una codificacion mas eficiente y en general se adaptan a las estadisticas de entrada reales Este ultimo es util cuando las probabilidades no se conocen de forma precisa o varian significativamente dentro del flujo de datos Indice 1 Historia 2 Definicion del problema 2 1 Descripcion informal 2 2 Descripcion formal 2 2 1 Ejemplo 3 Tecnica basica 3 1 Construccion del arbol 4 Propiedades principales 5 Variacion 5 1 Codigo Huffman n ario 5 2 Codigo Huffman adaptable 5 3 Algoritmo de Huffman de plantilla 5 4 Codigo de Huffman de tamano limitado 5 5 Codificacion Huffman con costes desiguales 5 6 Arboles binarios alfabeticos optimos codificacion Hu Tucker 5 7 Codigo canonico de Huffman 6 Aplicaciones 7 Ejemplo 8 Bibliografia 9 Vease tambien 10 Enlaces externosHistoria EditarEn 1951 a David Huffman y a sus companeros de clase de la asignatura Teoria de la Informacion se les permitio optar entre la realizacion de un examen final o la presentacion de un trabajo El profesor Robert M Fano asigno las condiciones del trabajo bajo la premisa de encontrar el codigo binario mas eficiente Huffman ante la imposibilidad de demostrar que codigo era mas eficiente se rindio y empezo a estudiar para el examen final Mientras estaba en este proceso vino a su mente la idea de usar arboles binarios de frecuencia ordenada y rapidamente probo que este era el metodo mas eficiente Con este estudio Huffman supero a su profesor quien habia trabajado con el inventor de la teoria de la informacion Claude Shannon con el fin de desarrollar un codigo similar Huffman soluciono la mayor parte de los errores en el algoritmo de codificacion Shannon Fano La solucion se basaba en el proceso de construir el arbol de abajo a arriba en vez de al contrario Definicion del problema EditarDescripcion informal Editar Dados Un conjunto de simbolos y sus pesos normalmente proporcionales a probabilidades Encontrar Un codigo binario prefijo un conjunto de elementos del codigo con longitud de palabra esperada minima de forma equivalente un arbol con longitud del camino minima Descripcion formal Editar EntradasEl alfabeto A a 1 a 2 a n displaystyle A left a 1 a 2 cdots a n right que es el alfabeto de simbolos de tamano n displaystyle n El conjunto W w 1 w 2 w n displaystyle W left w 1 w 2 cdots w n right que es el conjunto de pesos positivos de los simbolos normalmente proporcionales a probabilidades es decir w i p e s o a i 1 i n displaystyle w i mathrm peso left a i right 1 leq i leq n SalidaEl codigo C A W c 1 c 2 c n displaystyle C left A W right left c 1 c 2 cdots c n right que es el conjunto de elementos del codigo binario donde c i displaystyle c i es la palabra del codigo para a i 1 i n displaystyle a i 1 leq i leq n ObjetivoSea L C i 1 n w i l o n g i t u d c i displaystyle L left C right sum i 1 n w i times mathrm longitud left c i right la longitud del camino ponderado del codigo C displaystyle C Condicion L C L T displaystyle L left C right leq L left T right para cualquier codigo T A W displaystyle T left A W right Ejemplo Editar Entrada A W Simbolo ai a b c d e SumaPeso wi 0 10 0 15 0 30 0 16 0 29 1Salida C Palabras del codigo ci 010 011 11 00 10 Longitud de la palabra en bits li 3 3 2 2 2Longitud del camino ponderado li wi 0 30 0 45 0 60 0 32 0 58 L C 2 25Optimalidad Probabilidad 2 li 1 8 1 8 1 4 1 4 1 4 1 00Cantidad de informacion en bits log2 wi 3 32 2 74 1 74 2 64 1 79 Entropia wi log2 wi 0 332 0 411 0 521 0 423 0 518 H A 2 205Para cualquier codigo biunivoco aquel codigo decodificable de forma unica la suma de las probabilidades de todos los simbolos es siempre menor o igual que uno En este ejemplo es exactamente igual a uno por lo que decimos que es un codigo completo Si no es el caso siempre se puede derivar un codigo equivalente anadiendo simbolos extra con probabilidades nulas asociadas para hacer el codigo completo a la vez que se mantiene biunivoco Tal como definio Shannon 1948 la cantidad de informacion h en bits de cada simbolo ai con probabilidad no nula wi es h a i log 2 1 w i displaystyle h a i log 2 1 over w i La entropia H en bits es la suma ponderada de todos los simbolos ai con probabilidad no nula wi de la cantidad de informacion de cada simbolo H A w i gt 0 w i h a i w i gt 0 w i log 2 1 w i w i gt 0 w i log 2 w i displaystyle H A sum w i gt 0 w i h a i sum w i gt 0 w i log 2 1 over w i sum w i gt 0 w i log 2 w i Nota un simbolo con probabilidad cero tiene una contribucion nula a la entropia Cuando w 0 w log 2 1 w 0 displaystyle w log 2 1 w 0 cdot infty es una indeterminacion aplicando la regla de L Hopital lim w 0 log 2 1 w 1 w lim w 0 1 w ln 2 1 w 2 lim w 0 w ln 2 0 displaystyle lim w to 0 frac log 2 frac 1 w frac 1 w lim w to 0 frac frac 1 w ln 2 frac 1 w 2 lim w to 0 frac w ln 2 0 Por simplicidad los simbolos con probabilidad nula han sido dejados fuera de la formula anterior Como consecuencia del teorema de codificacion de fuente de Shannon la entropia es una medida de la longitud de palabra mas pequena del codigo que es teoricamente posible para un alfabeto dado con unos pesos asociados En este ejemplo la longitud media de la palabra es 2 25 bits por simbolo ligeramente mayor que la entropia calculada de 2 205 bits por simbolo Asi que no solo este codigo es optimo en el sentido de que ningun otro codigo posible funciona mejor sino que ademas esta muy cercano al limite teorico establecido por Shannon Notese que en general un codigo Huffman no necesita ser unico pero si lo es siempre es uno de los codigos que minimiza L C displaystyle L C Tecnica basica EditarLa tecnica utilizada es el propio algoritmo de Huffman Consiste en la creacion de un arbol binario en el que se etiquetan los nodos hoja con los caracteres junto a sus frecuencias y de forma consecutiva se van uniendo cada pareja de nodos que menos frecuencia sumen pasando a crear un nuevo nodo intermedio etiquetado con dicha suma Se procede a realizar esta accion hasta que no quedan nodos hoja por unir a ningun nodo superior y se ha formado el arbol binario Posteriormente se etiquetan las aristas que unen cada uno de los nodos con ceros y unos hijo derecho e izquierdo respectivamente por ejemplo El codigo resultante para cada caracter es la lectura siguiendo la rama desde la raiz hacia cada caracter o viceversa de cada una de las etiquetas de las aristas Construccion del arbol Editar Para obtener los codigos de Huffman hay que construir un arbol binario de nodos a partir de una lista de nodos cuyo tamano depende del numero de simbolos n displaystyle n Los nodos contienen dos campos el simbolo y el peso frecuencia de aparicion Cada nodo del arbol puede ser o bien un nodo hoja o un nodo interno Inicialmente se considera que todos los nodos de la lista inicial son nodos hoja del arbol Al ir construyendo el arbol los nodos internos tendran un peso y dos nodos hijos y opcionalmente un enlace al nodo padre que puede servir para recorrer el arbol en ambas direcciones Por convencion el bit 0 se asocia a la rama izquierda y el bit 1 a la derecha Una vez finalizado el arbol contendra n displaystyle n nodos hijo y n 1 displaystyle n 1 nodos internos El proceso de construccion del arbol comienza formando un nodo intermedio que agrupa a los dos nodos hoja que tienen menor peso frecuencia de aparicion El nuevo nodo intermedio tendra como nodos hijos a estos dos nodos hoja y su campo peso sera igual a la suma de los pesos de los nodos hijos Los dos nodos hijos se eliminan de la lista de nodos sustituyendolos por el nuevo nodo intermedio El proceso se repite hasta que solo quede un nodo en la lista Este ultimo nodo se convierte en el nodo raiz del arbol de Huffman El algoritmo de construccion del arbol puede resumirse asi Crear un nodo hoja para cada simbolo asociando un peso segun su frecuencia de aparicion e insertarlo en la lista ordenada ascendentemente Mientras haya mas de un nodo en la lista Eliminar los dos nodos con menor probabilidad de la lista Crear un nuevo nodo interno que enlace a los nodos anteriores asignandole como peso la suma de los pesos de los nodos hijos Insertar el nuevo nodo en la lista en el lugar que le corresponda segun el peso El nodo que quede es el nodo raiz del arbol Aqui hay un ejemplo de construccion del arbol a partir del texto en frances j aime aller sur le bord de l eau les jeudis ou les jours impairs Propiedades principales EditarLas probabilidades usadas pueden ser genericas para el dominio de la aplicacion que estan basadas en el caso promedio o pueden ser las frecuencias reales encontradas en el texto que se esta comprimiendo Esta variacion requiere que la tabla de frecuencias u otra estructura utilizada para la codificacion deben ser almacenadas con el texto comprimido las implementaciones emplean varios mecanismos para almacenar tablas de manera eficiente La codificacion Huffman es optima cuando la probabilidad de cada simbolo de entrada es una potencia negativa de dos Los codigos prefijos tienden a ser ligeramente ineficientes en alfabetos pequenos donde las probabilidades normalmente se encuentran entre esos puntos optimos El empaquetado o expansion del tamano del alfabeto concatenando multiples simbolos en palabras de tamano fijo o variable antes de la codificacion Huffman normalmente ayuda especialmente cuando simbolos adyacentes estan correlacionados como en el caso de un texto en lenguaje natural El peor caso para una codificacion Huffman puede darse cuando la probabilidad de un simbolo excede 2 1 0 5 haciendo el limite superior de ineficiencia ilimitado Estas situaciones a menudo responden bien a una forma de paquete llamada codificacion run length La codificacion aritmetica produce una ligera ganancia sobre la codificacion Huffman pero en la practica esta ganancia raramente ha sido lo bastante grande como para utilizar la codificacion aritmetica que posee una complejidad computacional mas elevada y ademas requiere el pago de royalties A julio de 2006 IBM posee patentes de muchos metodos de codificacion aritmetica en varias jurisdicciones Variacion EditarExisten muchas variaciones del codigo de Huffman algunos que utilizan Huffman como algoritmo y otros que encuentra el codigo prefijo optimo Tenga en cuenta que en este ultimo caso el metodo no es necesariamente similar al de Huffmans y no tiene por que terminar en tiempo polinomico Codigo Huffman n ario Editar El algoritmo n ario de Huffman usa el alfabeto 0 1 n 1 para codificar el mensaje y construir un arbol n ario Este enfoque fue considerado por Huffman en su enfoque originario Codigo Huffman adaptable Editar La variacion llamada codigo de Huffman adaptable calcula dinamicamente la probabilidad de la frecuencia de la cadena de origen basada en antiguas apariciones Esta relacionado con la familia de algoritmos LZ Algoritmo de Huffman de plantilla Editar La mayoria de las veces el tamano de las implementaciones del codigo de Huffman estan representadas por probabilidades numericas pero el algoritmo no lo exige se requiere solo una manera de ordenar el tamano y anadirle El algoritmo de plantilla de Huffman permite utilizar cualquier tipo de tamano costos frecuencias los pares del tamano tamanos no numericos y uno de los muchos que combina metodos no solo la adicion Tales algoritmos pueden resolver problemas de minimizacion como la minimizacion de Max Wi C i un problema que se aplico por primera vez en el diseno de circuitos Codigo de Huffman de tamano limitado Editar El Codigo de Huffman de tamano de limitado es una variante donde el objetivo es lograr que el camino de coste minimo con la restriccion de que la longitud de cada palabra sea menor que una constante El algoritmo de package merge lo soluciona con un algoritmo voraz muy similar al usado por el algoritmo de Huffman Su complejidad es del orden de O nL siendo L el tamano de la palabra mas larga No se conoce algoritmo para resolver este problema en tiempo lineal a diferencia de los problemas convencionales de Huffman Codificacion Huffman con costes desiguales Editar En el problema estandar de la codificacion Huffman se asume que cada simbolo del alfabeto con el que se construye cada palabra del codigo tiene igual costo de transmision una palabra del codigo cuya longitud sea N digitos siempre tendra un costo de N sin importar cuantos de esos digitos sean ceros cuantos unos etc Cuando se trabaja bajo esta suposicion minimizar el costo total del mensaje y minimizar el numero total de digitos es lo mismo En la codificacion Huffman con costes desiguales la suposicion anterior ya no es verdadera los simbolos del alfabeto pueden tener longitudes no uniformes debido a caracteristicas del medio de transmision Un ejemplo es el alfabeto del codigo Morse donde una raya requiere mas tiempo para ser enviada que un punto y por lo tanto el costo del tiempo de transmision de una raya es mayor El objetivo sigue siendo minimizar la longitud media de la palabra de codigo pero no es suficiente con minimizar el numero de simbolos usado en el mensaje No se conoce un algoritmo para solucionar esto de la misma manera o con la misma eficiencia que la codificacion Huffman convencional Arboles binarios alfabeticos optimos codificacion Hu Tucker Editar En una situacion de codificacion Huffman estandar se asume que cualquier codigo puede corresponderse con cualquier simbolo de entrada En la version alfabetica el orden alfabetico de las entradas y salidas debe ser identico Asi por ejemplo a la entrada A a b c displaystyle A left a b c right no se le puede asignar H A C 00 1 01 displaystyle H left A C right left 00 1 01 right sino que le corresponderia H A C 00 01 1 displaystyle H left A C right left 00 01 1 right o H A C 0 10 11 displaystyle H left A C right left 0 10 11 right Esto tambien se conoce como el problema de Hu Tucker por los autores de la publicacion que contiene la primera solucion linearitmica a este problema de optimalidad binaria alfabetica que es similar al algoritmo de Huffman pero no es una variacion del mismo Estos arboles binarios alfabeticos optimos son usados a menudo como arboles binarios de busqueda Codigo canonico de Huffman Editar Si los pesos correspondientes a las entradas ordenadas alfabeticamente estan en orden numerico los codigos de Huffman tienen la misma longitud que los codigos alfabetico optimos asi que pueden calcularse como estas ultimas haciendo que la codificacion Hu Tucker sea innecesaria El codigo resultante de las entradas re ordenadas numericamente se conoce como codigo canonico de Huffman y es el codigo que normalmente se usa en la practica dada su facilidad para codificar y decodificar La tecnica para encontrar este codigo se conoce como codificacion de Huffman Shannon Fano ya que es optima como la codificacion de Huffman y alfabetica segun la probabilidad de los pesos como la codificacion de Shannon Fano De esta manera el metodo de codificacion de Huffman Shannon Fano ira asignando gradualmente los codigos prefijo mas cortos a aquellos simbolos de mayor peso y los mas largos a los de menor peso Es Decir ordenara descendentemente los simbolos segun su peso luego codificara segun el metodo de Codificacion Shannon Fano una vez obtenida la codificacion se procede al armado del un Diagrama de flujo que comienza preguntando si el valor del primer bit del prefijo obtenido para el simbolo buscado es 0 del cual salen las 2 ramas una para la afirmacion y otra para la negacion luego seguira preguntando para el segundo bit y derivara para cada rama a otra decision o a un simbolo segun corresponda Aplicaciones EditarLa codificacion aritmetica puede considerarse como una generalizacion de la codificacion de Huffman de hecho en la practica la codificacion Aritmetica viene precedida por la codificacion de huffman pues es mas facil encontrar una aritmetica para una entrada binaria que para una no binaria Por otra parte aunque la codificacion de compresion ofrece mejor rendimiento que la codificacion de Huffman la codificacion de Huffman se encuentra todavia en uso generalizado debido a su simplicidad alta velocidad y falta de problemas de patentes La codificacion de Huffman se utiliza a menudo en algun otro metodo de compresion Como la deflacion y codec multimedia como JPEG y MP3 que tienen una cuantificacion digital basada en la codificacion de Huffman Ejemplo EditarUna sonda espacial ha sido lanzada al espacio para contar cierto tipo de perturbaciones estelares Ha de contar cuantas se producen en cada minuto y tiene cada dia una ventana de tiempo bastante reducida para enviar los datos a Tierra por tanto interesa reducir al maximo el tiempo de transmision y para ello se recurre a codificar las muestras mediante un codigo de Huffman En la siguiente tabla se muestran los valores a transmitir junto con sus frecuencias relativas su codigo en una codificacion binaria de 3 bits y su codigo en un posible codigo Huffman para estos valores Valor Frecuencia Codigo binario Codigo Huffman0 10 000 0101 20 001 102 30 010 003 25 011 114 10 100 01105 o mas 5 101 0111Puede observarse que en la codificacion binaria todos los posibles valores reciben codigos del mismo numero de bits mientras que en la codificacion Huffman cada valor tiene un numero diferente de bits los codigos mas frecuentes poseen dos bits mientras que los menos frecuentes poseen cuatro bits A continuacion se observa el codigo necesario para transmitir la siguiente serie de valores 5 4 2 3 2 2 1 0 1 3 2 4 3 4 3 2 3 4 2 4 Utilizando la codificacion binaria seria una serie de 60 bits es decir 3 bits por simbolo 101100010011010010001000001011010100011100011010011100010100 nota se ha anadido la misma serie separada en bloques con la unica razon de facilitar una transcripcion manual libre de errores para un estudio por parte del lector interesado 101 100 010 011 010 010 001 000 001 011 010 100 011 100 011 010 011 100 010 100 Utilizando en cambio la codificacion Huffman se tendria que enviar una secuencia de 53 bits es decir 2 65 bits por simbolo 01110110001100001001010110001101101101100110110000110 nota la misma serie dividida en bloques de 4 bits para la misma observacion anterior 0111 0110 0011 0000 1001 0101 1000 1101 1011 0110 0110 1100 0011 0 En este ejemplo la media de bits por simbolo que cabria esperar de esta codificacion en cadenas de valores mas largas es de 2 4 Para su comparacion la entropia del conjunto de simbolos es de 2 366 es decir el mejor metodo de compresion seria capaz de codificar estos valores utilizando 2 366 bits por simbolo Es posible tambien apreciar como se pueden extraer sin ninguna ambiguedad los valores originales a partir de la cadena codificada mediante Huffman Hay que anadir que la codificacion de Huffman no puede ser aplicada a imagenes en blanco y negro porque es incapaz de producir compresion sobre un alfabeto binario Bibliografia EditarD A Huffman A method for the construction of minimum redundancy codes Proceedings of the I R E sept 1952 pp 1098 1102Vease tambien EditarAlgoritmo de Huffman Codigo canonico de Huffman Codificacion aritmeticaEnlaces externos EditarGenerador de arboles de Huffman Huffman en PHP Datos Q2647 Multimedia Huffman coding Obtenido de https es wikipedia org w index php title Codificacion Huffman amp oldid 139348031, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos