Vous êtes sur la page 1sur 8

Algoritmo de Huffman

El algoritmo de Huffman es un algoritmo para la construcción de códigos de Huffman,


desarrollado por David A. Huffman en 1952 y descrito en A Method for the Construction of
Minimum-Redundancy Codes.1

Este algoritmo toma un alfabeto de n símbolos, junto con sus frecuencias de aparición


asociadas, y produce un código de Huffman para ese alfabeto y esas frecuencias.

Contenido
 [ocultar]

1 Descripción
o 1.1 Ejemplo de uso
2 Limitaciones
3 Variaciones del algoritmo
o 3.1 Códigos
Huffman n-arios
4 Véase también
5 Referencias

[editar]Descripción

El algoritmo consiste en la creación de un árbol binario que tiene cada uno de los


símbolos por hoja, y construido de tal forma que siguiéndolo desde la raíz a cada una de
sus hojas se obtiene el código Huffman asociado.

1. Se crean varios árboles, uno por cada uno de los símbolos del alfabeto,
consistiendo cada uno de los árboles en un nodo sin hijos, y etiquetado cada uno
con su símbolo asociado y su frecuencia de aparición.
2. Se toman los dos árboles de menor frecuencia, y se unen creando un nuevo árbol.
La etiqueta de la raíz será la suma de las frecuencias de las raíces de los dos
árboles que se unen, y cada uno de estos árboles será un hijo del nuevo árbol.
También 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 sólo quede un árbol.

Con este árbol se puede conocer el código asociado a un símbolo, así como obtener el
símbolo asociado a un determinado código.
Para obtener el código asociado a un símbolo se debe proceder del siguiente modo:

1. Comenzar con un código vacío


2. Iniciar el recorrido del árbol en la hoja asociada al símbolo
3. Comenzar un recorrido del árbol hacia arriba
4. Cada vez que se suba un nivel, añadir al código la etiqueta de la rama que se ha
recorrido
5. Tras llegar a la raíz, invertir el código
6. El resultado es el código Huffman deseado

Para obtener un símbolo a partir de un código se debe hacer así:

1. Comenzar el recorrido del árbol en la raíz de éste


2. Extraer el primer símbolo del código a descodificar
3. Descender por la rama etiquetada con ese símbolo
4. Volver al paso 2 hasta que se llegue a una hoja, que será el símbolo asociado al
código

En la práctica, casi siempre se utiliza el árbol para obtener todos los códigos de una sola
vez; luego se guardan en tablas y se descarta el árbol.

[editar]Ejemplo de uso
La tabla describe el alfabeto a codificar, junto con las frecuencias de sus símbolos. En el
gráfico se muestra el árbol construido a partir de este alfabeto siguiendo el algoritmo
descrito.
Árbol para construir el código Huffman del ejemplo.

Símbolo Frecuencia

A 0,15

B 0,30

C 0,20

D 0,05

E 0,15

F 0,05

G 0,10

Se puede ver con facilidad cuál es el código del símbolo E: subiendo por el árbol se
recorren ramas etiquetadas con 1, 1 y 0; por lo tanto, el código es 011. Para obtener el
código de D se recorren las ramas 0, 1, 1 y 1, por lo que el código es 1110.

La operación inversa también es fácil de realizar: dado el código 10 se recorren desde la


raíz las ramas 1 y 0, obteniéndose el símbolo C. Para descodificar 010 se recorren las
ramas 0, 1 y 0, obteniéndose el símbolo A.

[editar]Limitaciones

Para poder utilizar el algoritmo de Huffman es necesario conocer de antemano las


frecuencias de aparición de cada símbolo, y su eficiencia depende de lo próximas a las
frecuencias reales que sean las estimadas. Algunas implementaciones del algoritmo de
Huffman son adaptativas, actualizando las frecuencias de cada símbolo conforme recorre
el texto.
La eficiencia de la codificación de Huffman también depende del balance que exista entre
los hijos de cada nodo del árbol, siendo más eficiente conforme menor sea la diferencia
de frecuencias entre los dos hijos de cada nodo.

Ejemplos:

 La codificación binaria es un caso particular de la codificación de Huffman que


ocurre cuando todos los símbolos del alfabeto tienen la misma frecuencia. Se tiene
pues que la codificación binaria es la más eficiente para cualquier número de símbolos
equiprobables.
 El algoritmo de Huffman aplicado sobre un alfabeto de dos símbolos asignará
siempre un 1 al primero y un 0 al segundo, independientemente de la frecuencia de
aparición de dichos símbolos. En este caso nunca se realiza compresión de los datos,
mientras que otros algoritmos sí podrían conseguirlo.

Una manera de resolver este problema consiste en agrupar los símbolos en palabras
antes de ejecutar el algoritmo. Por ejemplo, si se tiene la cadena de longitud 64

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB

El algoritmo de Huffman aplicado únicamente a los símbolos devuelve el código:

1111111111111111111111111111111111111111111111111111111111111110

También de longitud 64. Sin embargo, si antes de utilizar el algoritmo, se agrupan los
símbolos 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.

[editar]Variaciones del algoritmo


[editar]Códigos Huffman n-arios
Es posible crear códigos de Huffman ternarios, cuaternarios, y, en general, n-arios. Para
ello sólo es necesario realizar dos modificaciones al algoritmo:
1. Los árboles a crear tendrán tantos hijos como símbolos posibles puedan aparecer
en los códigos Huffman. Por ejemplo, si es ternario se crearán árboles con tres
hijos; si es cuaternario, con cuatro.
2. Si se expresa como s el número de símbolos en el alfabeto a codificar, y n el
número de símbolos que aparecen en el código Huffman, entonces s-1 debe ser
múltiplo de n-1. Es decir, para un código ternario, s debe valer 3, 5, 7, etc. Si esta
condición no se cumple, entonces se deben añadir símbolos "nulos" con
frecuencia 0, que servirán sólo como relleno a la hora de construir el árbol.

Generalidades
^

Se trata de un algoritmo que puede ser usado para compresión o


encriptación de datos.
Este algoritmo se basa en asignar códigos de distinta longitud de bits a cada
uno de los caracteres de un fichero. Si se asignan códigos más cortos a los
caracteres que aparecen más a menudo se consigue una compresión del
fichero.
Esta compresión es mayor cuando la variedad de caracteres diferentes que
aparecen es menor. Por ejemplo: si el texto se compone únicamente de
números o mayúsculas, se conseguirá una compresión mayor.
Para recuperar el fichero original es necesario conocer el código asignado a
cada carácter, así como su longitud en bits, si ésta información se omite, y el
receptor del fichero la conoce, podrá recuperar la información original. De
este modo es posible utilizar el algoritmo para encriptar ficheros.
Mecanismo del algoritmo
^

 Contar cuantas veces aparece cada carácter en el fichero a


comprimir. Y crear una lista enlazada con la información de
caracteres y frecuencias.
 Ordenar la lista de menor a mayor en función de la frecuencia.
 Convertir cada elemento de la lista en un árbol.
 Fusionar todos estos árboles en uno único, para hacerlo se
sigue el siguiente proceso, mientras la lista de árboles contenga
más de un elemento:
o Con los dos primeros árboles formar un nuevo
árbol, cada uno de los árboles originales en una
rama.
o Sumar las frecuencias de cada rama en el nuevo
elemento árbol.
o Insertar el nuevo árbol en el lugar adecuado de la
lista según la suma de frecuencias obtenida.
 Para asignar el nuevo código binario de cada carácter sólo hay
que seguir el camino adecuado a través del árbol. Si se toma
una rama cero, se añade un cero al código, si se toma una rama
uno, se añade un uno.
 Se recodifica el fichero según los nuevos códigos.
Veamos un ejemplo
^

Tomemos un texto corto, por ejemplo:


"ata la jaca a la estaca"
1) Contamos las veces que aparece cada carácter y hacemos una lista
enlazada:
' '(5), a(9), c(2), e(1), j(1), l(2), s(1), t(2)
2) Ordenamos por frecuencia de menor a mayor
e(1), j(1), s(1), c(2), l(2), t(2), ' '(5), a(9)
3) Consideremos ahora que cada elemento es el nodo raíz de un árbol.

Estructura inicial
4) Fundimos los dos primeros nodos (árboles) en un nuevo árbol, sumamos
sus frecuencias y lo colocamos en el lugar correspondiente:

Estructura después de primera fusión


Y sucesivamente:
Estructura después de varias fusiones
El resultado final es:

Resultado final de la estructura


5) Asignamos los códigos, las ramas a la izquierda son ceros, y a la derecha
unos (por ejemplo), es una regla arbitraria.
a '' c l t s e j
0 10 1100 1101 1110 11110 111110 111111
6) Y traducimos el texto:
a t a'' l a'' j a c a''a'' l a'' e s t a c a
111 1 110 1 1111 110 1 1 110 1 1111 1111 111 110
0 0 0 0 0 0 0 0 0
0 0 1 0 11 0 0 0 1 0 10 0 0 0
Y sólo queda empaquetar los bits en grupos de ocho, es decir en bytes:
011100 110101 111110 000100 110101 111101 101110 100000
10 01 11 10 01 11 01 00
0x72 0xD5 0xFB 0x12 0xD5 0xF7 0xb9 0x80
En total ocho bytes, y el texto original tenía 23.
Pero no nos engañemos, también hay que almacenar la información relativa
a la codificación, por lo que se puede ver que para textos cortos no
obtendremos mucha reducción de tamaño.
Algoritmo de compresión de Huffman
Por:dario | En: audio, datos | 14 Abril 2009 

El algoritmo de Huffman puede ser usado para compresión o encriptar todo tipo de datos.

Este algoritmo se dedica a asignar códigos de diferente longitud de bits para cada uno de
los caracteres de un archivo. Esto quiere decir que si a menudo aparecen caracteres
iguales con un sólo código conseguiremos la compresión del fichero. La compresión resulta
más eficiente cuando la variedad de caracteres diferentes es menor. Es decir, que si el
texto únicamente contiene minúsculas y números la compresión será mayor.
A su vez para recuperar el archivo original deberemos conocer la tabla con los códigos
asignados por carácter, así como la longitud en bits, si ésto último se omite  y el receptor lo
conoce podremos recuperar la información original. De esta manera, usando este algoritmo
conseguiremos encriptar los ficheros.

Vous aimerez peut-être aussi