You are on page 1of 3

Algoritmo de Huffman

El algoritmo de Huffman es un algoritmo para la construccin de cdigos de Huffmann, desarrollado por David A. Huffmann en 1952 y descrito en A Method for the Construction of Minimum-Redundancy Codes. Este algoritmo toma un alfabeto de n smbolos, junto con sus frecuencias de aparicin asociadas, y produce un cdigo de Huffman para ese alfabeto y esas frecuencias. Contenidos: 1. Descripcin. 2. Limitaciones. 3. Variaciones del algoritmo

1. Descripcin
El algoritmo consiste en la creacin de un rbol binario que tiene cada uno de los smbolos por hoja, y construido de tal forma que siguindolo desde la raz a cada una de sus hojas se obtiene el cdigo Huffman asociado. 1. Se crean varios rboles, uno por cada uno de los smbolos del alfabeto, consistiendo cada uno de los rboles en un nodo sin hijos, y etiquetado cada uno con su smbolo asociado y su frecuencia de aparicin. 2. Se toman los dos rboles de menor frecuencia, y se unen creando un nuevo rbol. La etiqueta de la raz ser la suma de las frecuencias de las races de los dos rboles que se unen, y cada uno de estos rboles ser un hijo del nuevo rbol. Tambin se etiquetan las dos ramas del nuevo rbol: con un 0 la de la izquierda, y con un 1 la de la derecha. 3. Se repite el paso 2 hasta que slo quede un rbol. Con este rbol se puede conocer el cdigo asociado a un smbolo, as como obtener el smbolo asociado a un determinado cdigo. Para obtener el cdigo asociado a un smbolo se debe proceder del siguiente modo: Comenzar con un cdigo vaco Iniciar el recorrido del rbol en la hoja asociada al smbolo Comenzar un recorrido del rbol hacia arriba Cada vez que se suba un nivel, aadir al cdigo la etiqueta de la rama que se ha recorrido 5. Tras llegar a la raz, invertir el cdigo 6. El resultado es el cdigo Huffman deseado Para obtener un smbolo a partir de un cdigo se debe hacer as: 1. Comenzar el recorrido del rbol en la raz de ste 2. Extraer el primer smbolo del cdigo a descodificar 3. Descender por la rama etiquetada con ese smbolo 1. 2. 3. 4.

4. Volver al paso 2 hasta que se llegue a una hoja, que ser el smbolo asociado al cdigo En la prctica, casi siempre se utiliza el rbol para obtener todos los cdigos de una sola vez; luego se guardan en tablas y se descarta el rbol.

1. 1. Ejemplo de uso
La tabla describe el alfabeto a codificar, junto con las frecuencias de sus smbolos. En el grfico se muestra el rbol construido a partir de este alfabeto siguiendo el algoritmo descrito.

rbol para construir el cdigo Huffman del ejemplo SmboloFrecuencia A0,15 B0,30 C0,20 D0,05 E0,15 F0,05 G0,10 Se puede ver con facilidad cul es el cdigo del smbolo E: subiendo por el rbol se recorren ramas etiquetadas con 1, 1 y 0; por lo tanto, el cdigo es 011. Para obtener el cdigo de D se recorren las ramas 0, 1, 1 y 1, por lo que el cdigo es 1110. La operacin inversa tambin es fcil de realizar: dado el cdigo 10 se recorren desde la raz las ramas 1 y 0, obtenindose el smbolo C. Para descodificar 010 se recorren las ramas 0, 1 y 0, obtenindose el smbolo A.

2. Limitaciones
Para poder utilizar el algoritmo de Huffman es necesario conocer de antemano las frecuencias de aparicin de cada smbolo, y su eficiencia depende de lo prximas a las frecuencias reales que sean las estimadas. Algunas implementaciones del algoritmo de Huffman son adaptativas, actualizando las frecuencias de cada smbolo conforme recorre el texto. La eficiencia de la codificacin de Huffman tambin depende del balance que exista entre los hijos de cada nodo del rbol, siendo ms eficiente conforme menor sea la diferencia de frecuencias entre los dos hijos de cada nodo.

Ejemplos:

La codificacin binaria es un caso particular de la codificacin de Huffman que ocurre cuando todos los smbolos del alfabeto tienen la misma frecuencia. Se tiene pues que la codificacin binaria es la ms eficiente para cualquier nmero de smbolos equiprobables. El algoritmo de Huffman aplicado sobre un alfabeto de dos smbolos asignar siempre un 1 al primero y un 0 al segundo, independientemente de la frecuencia de aparicin de dichos smbolos. En este caso nunca se realiza compresin de los datos, mientras que otros algoritmos s podran conseguirlo.

Una manera de resolver este problema consiste en agrupar los smbolos en palabras antes de ejecutar el algoritmo. Por ejemplo, si se tiene la cadena de longitud 64 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB El algoritmo de Huffman aplicado nicamente a los smbolos devuelve el cdigo: 1111111111111111111111111111111111111111111111111111111111111110 Tambin de longitud 64. Sin embargo, si antes de utilizar el algoritmo, se agrupan los smbolos en las palabras "AA", "AB" y "B" (que se codifican como 1, 01 y 00), el algoritmo devuelve la siguiente cadena: 111111111111111111111111111111101 que tiene longitud 32, la mitad que si no se hubiera agrupado. Si observa el rbol de Huffman, se puede comprobar que la diferencia de frecuencias entre las ramas del rbol es menor que en el caso anterior.

3. Variaciones del algoritmo 3. 1. Cdigos Huffman n -arios


Es posible crear cdigos de Huffman ternarios, cuaternarios, y, en general, n-arios. Para ello slo es necesario realizar dos modificaciones al algoritmo: 1. Los rboles a crear tendrn tantos hijos como smbolos posibles puedan aparecer en los cdigos Huffman. Por ejemplo, si es ternario se crearn rboles con tres hijos; si es cuaternario, con cuatro. 2. Si se expresa como s el nmero de smbolos en el alfabeto a codificar, y n el nmero de smbolos que aparecen en el cdigo Huffman, entonces s-1 debe ser mltiplo de n-1. Es decir, para un cdigo ternario, s debe valer 3, 5, 7, etc. Si esta condicin no se cumple, entonces se deben aadir smbolos "nulos" con frecuencia 0, que servirn slo como relleno a la hora de construir el rbol.

You might also like