Você está na página 1de 21

TRABAJO PRACTICO FINAL

Materia: Comunicaciones

Temas a desarrollar: Cdigos de Huffman. Fundamentos tericos. Construccin. Aplicaciones.

Alumno: Soledad Paolina

Introduccin
En el ao 1951, a David A. Huffman1 y sus compaeros de clase de la asignatura Teora de la Informacin en el Instituto Tecnolgico de Massachusetts (MIT) se les permiti optar entre la realizacin de un exmen final o la presentacin de un trabajo. El profesor Robert. M. Fano asign las condiciones del trabajo bajo la premisa de encontrar el cdigo binario ms eficiente. Huffman, ante la imposibilidad de demostrar qu cdigo era ms 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 rpidamente prob que ste era el mtodo ms eficiente. Finalmente este trabajo fue publicado en el ao 1952 bajo el nombre "A Method for the Construction of Minimum Redundancy Codes". El cdigo de Huffman, tambin conocido como codificacin Huffman, puede ser usado en casi cualquier aplicacin, ya que es un sistema vlido para la compresin y posterior transmisin de cualquier dato en formato digital, pudiendo aplicarse a faxes, modems, redes de computadoras y televisin.

David Albert Huffman (naci el 9 de agosto de 1925 y muri el 7 de octubre de 1999) fue un personaje ilustre en el campo de ciencias de la computacin en general y en la codificacin de datos en particular, adems de ser profesor en los EE. UU. A lo largo de su vida hizo contribuciones importantes al estudio de aparatos finitos, circuitos aleatorios, sntesis de procedimientos, y diseo de seales. Sin embargo es ms conocido por su "cdigo de Huffman".

Cdigos de Huffman
Concepto del Algoritmo
Este algoritmo le asigna secuencias binarias (cdigos) a los smbolos de un alfabeto de forma tal de utilizar la menor cantidad de bits posibles. El algoritmo de Huffman define un cdigo variable para cada carcter sin la necesidad de utilizar un cdigo prefijo. De esta manera es posible que aquellos caracteres que son ms frecuentes dentro de un alfabeto se codifiquen con la menor cantidad de bits posibles mientras que aquellos que no sean tan frecuentes podrn tener una codificacin un poco ms amplia, pero siempre tendiendo a ser la menor posible. Es obvio pensar que en el alfabeto del lenguaje castellano la letra a es usada con mucha ms frecuencia que la letra x. Este concepto se optimizara si en lugar de aplicarlo a un alfabeto se aplicara a cada texto en particular, es decir, conocer con exactitud cuntas veces se repite un carcter dentro del texto para, de esa manera, darle un cdigo variable que sea el menor posible para aquellos que se repitan con mayor frecuencia y, a medida que sea necesario, utilizar ms bits para codificar un carcter que la frecuencia con que el carcter se usa en el texto sea menor. Para ello, Huffman hace uso de una tabla de frecuencias donde se guardan los caracteres empleados en el texto y la cantidad de veces que son utilizados y de un rbol binario como estructura de datos.

Fundamentos tericos
Una de las formas de transmitir mensajes es transmitir en su lugar secuencias de smbolos. Si hay mayor cantidad de mensajes a ser enviados que smbolos disponibles algunos mensajes debern utilizar ms de un smbolo. Si se asume que cada smbolo requiere la misma cantidad de tiempo para su transmisin, entonces el tiempo de transmisin (longitud) de un mensaje es directamente proporcional a la cantidad de smbolos asociados a l. En adelante, la secuencia de smbolos asociados a un determinado mensaje ser llamada cdigo de mensaje, la cantidad total de mensajes a transmitir ser denominada coleccin de mensajes y al acuerdo entre transmisor y emisor con respecto al significado del cdigo para cada mensaje de la coleccin ser coleccin de cdigo. Para formalizar los requerimientos de una coleccin de cdigo (es decir un mensaje que pueda ser interpretado tanto por transmisor como por receptor), los smbolos codificados sern representados por nmeros. Por lo tanto, si hay D tipos diferentes de smbolos a ser utilizados en la codificacin estarn representados por 0, 1, 2..., (D-1). Por ejemplo, un cdigo ternario se construir utilizando los tres dgitos 0, 1 y 2 como smbolos codificadores.

Siendo N el nmero de mensajes en la coleccin y P(i) la probabilidad del mensaje ith, entonces:

La longitud de un mensaje, L(i), es el nmero de dgitos de cdigo asignados a l. Por lo tanto la longitud promedio de un mensaje es:

Huffman considero 2 restricciones bsicas para una coleccin de cdigo:

a) No habr dos mensajes con igual combinacin de dgitos. b) Los cdigos de mensaje sern construidos de manera tal que no ser
necesario agregar informacin para indicar donde comienza y termina un mensaje una vez conocido el punto de inicio.

Shannon2 y Fano3 han desarrollado procedimientos para codificacin con el propsito de probar que el promedio de dgitos binarios requeridos por mensaje es apenas superior a la cantidad media de informacin por mensaje. Sus procedimientos de codificacin no son ptimos pero se acercan al comportamiento ptimo cuando N tiende a infinito. Kraft4 realizo algunos trabajos que permitieron una longitud de codificacin ms cercana a la ideal, permitiendo a Huffman lograr la codificacin ptima. Para una codificacin optima, la longitud de un cdigo de mensaje dado no puede ser menor que la longitud de un cdigo de mensaje ms probable. Sin este requisito una reduccin en longitud promedio puede obtenerse intercambiando los cdigos para los dos mensajes en cuestin.

Construccin
Veamos cmo se construye un cdigo Huffman a partir de un ejemplo
2

Claude Elwood Shannon (30 de abril de 1916, Mchigan - 24 de febrero de 2001), ingeniero electricista y matemtico estadounidense, recordado como "el padre de la teora de la informacin".
3

Roberto Mario Fano (Naci en el ao 1917 en Turn, Italia) es un cientfico de la computacin, actualmente es profesor emrito de Ingeniera Elctrica y Ciencias de Computacin del Instituto de Tecnologa de Massachusetts. Es reconocido principalmente por su trabajo en teora de la informacin, inventor (junto a Claude Shannon) del cdigo Shannon-Fano.
4

En el ao1949, Len G. Kraft descubre la Desigualdad de Kraft, la cual pone en evidencia los lmites de los cdigos prefijos.

Dado un archivo que contiene la siguiente frase:

TOMAMOS COMO EJEMPLO ESTA FRASE


Se proceder a implementar el algoritmo de Huffman, generando la tabla de frecuencias y el rbol binario de bsqueda. Luego de ello se compactar dicho archivo. La implementacin del mismo consta de cuatro etapas, Generacin de la tabla de Frecuencias

Generacin del rbol Binario


Compresin o compactacin de datos. Descompresin o descompactacin de datos.

Las dos primeras etapas hacen a la construccin de las estructuras de memoria, y las dos ltimas al tratamiento de los datos.

Generacin de la tabla de frecuencias


Se realiza un proceso de conteo de los caracteres del archivo y se van cargando en una estructura de memoria que contiene a la tabla de frecuencias (puede ser una lista linkeada en la cual cada nodo cuenta con los campos necesarios de la tabla). Para facilitar la explicacin, procedimos a ordenar los elementos de la tabla de frecuencia de mayor a menor.

La cantidad total de caracteres es 32 x 8 bits = 256 bits.

Generacin del rbol Binario


Para armar el rbol se respet el concepto de tomar de la tabla de frecuencias los elementos ms chicos inicialmente, pero se definieron adems las siguientes reglas: 1. Se toman primero los menores caracteres tomados de a pares, comenzando por los dos ltimos. 2. El par de valores se toman de la sig. manera: Si ambos tienen igual frecuencia, se toma como hijo izquierdo el primero y como hijo derecho al ltimo. Si uno tiene mayor frecuencia, se toma como hijo izquierdo el de menor frecuencia y como hijo derecho el de mayor frecuencia.

3. Siempre se toman primero los caracteres originales del archivo de menor frecuencia, sin no hubiesen ms o hubiesen de frecuencia mayor, se procedern a tomar los caracteres ax.

Paso 1
Tomo los dos primeros caracteres de menor frecuencia F y R. Armo un sub-rbol con raz 1 en memoria con ambos nodos F como hijo izq. y R como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 1 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones de los tres nodos y el status de F y R.

Paso 2 Tomo los prximos dos caracteres de menor frecuencia, P y L. Armo un sub-rbol con raz 2 en memoria con ambos nodos P como hijo izq. y L como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 2 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones de los tres nodos y el status de P y L.

Paso 3 Tomo los prximos dos caracteres de menor frecuencia, C y J. Armo un sub-rbol con raz 3 en memoria con ambos nodos C como hijo izq. y J como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 3 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones de los tres nodos y el status de C y J.

Paso 4 Tomo los prximos dos caracteres de menor frecuencia, T y 3. Armo un sub-rbol con raz 4 en memoria con ambos nodos T como hijo izq. y 3 como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 4 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones del nodo raz y T, y el status de T y 3.

Paso 5 Tomo los prximos dos caracteres de menor frecuencia, 1 y 2. Armo un sub-rbol con raz 5 en memoria con ambos nodos 1 como hijo izq. y 2 como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 5 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones del nodo raz y el status de 1 y 2.

Paso 6 Tomo los prximos dos caracteres de menor frecuencia, A y S. Armo un sub-rbol con raz 6 en memoria con ambos nodos A como hijo izq. y S como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 6 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones de los tres nodos y el status de A y S.

Paso 7 Tomo los prximos dos caracteres de menor frecuencia, M y E. Armo un sub-rbol con raz 7 en memoria con ambos nodos M como hijo izq. y E como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 7 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones de los tres nodos y el status de M y E.

Paso 8 Tomo los prximos dos caracteres de menor frecuencia, 4 y 5. Armo un sub-rbol con raz 8 en memoria con ambos nodos 4 como hijo izq. y 5 como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 8 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones del nodo raz y el status de 4 y 5.

Paso 9 Tomo los prximos dos caracteres de menor frecuencia, Blanco y O. Armo un sub-rbol con raz 9 en memoria con ambos nodos Blanco como hijo izq. y O como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 9 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones de los tres nodos y el status de Blanco y O.

Paso 10 Tomo los prximos dos caracteres de menor frecuencia, 6 y 7. Armo un sub-rbol con raz 10 en memoria con ambos nodos 6 como hijo izq. y 7 como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 10 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones del nodo raz y el status de 6 y 7.

Paso 11 Tomo los prximos dos caracteres de menor frecuencia, 8 y 9. Armo un sub-rbol con raz 11 en memoria con ambos nodos 8 como hijo izq. y 9 como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 11 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones del nodo raz y el status de 8 y 9.

Paso 12 Tomo los prximos dos caracteres de menor frecuencia, 10 y 11. Armo un sub-rbol con raz 12 en memoria con ambos nodos 10 como hijo izq. y 11 como hijo derecho. Actualizo la tabla de frecuencias con el nuevo nodo 12 y con su frecuencia como la suma de frecuencias de sus hijos, las direcciones del nodo raz y el status de 10 y 11.

Paso 13

Al querer tomar los prximos dos caracteres de menor frecuencia, se observa que queda un nico carcter con status null y que su frecuencia es la suma de todas las frecuencias de los caracteres originales. Por lo tanto se da por finalizado la generacin del rbol.

Compresin o Compactacin de Datos.


Este proceso comprende la lectura del archivo original, la bsqueda en la tabla de frecuencias de dicho carcter ledo, y el acceso con la direccin del rbol a la hoja correspondiente a dicho carcter. A partir de ello se va ascendiendo por el rbol con el puntero al padre (utilizando para almacenar un 0 si asciendo desde un hijo izq. un 1 si asciendo del hijo derecho) hasta llegar al nodo raz (padre en null). En ese momento se desapilar la pila en una estructura de salida, y se ingresar slo para la primera lectura de cada carcter el cdigo comprimido en la tabla de frecuencias, para optimizar el algoritmo. Al finalizar este proceso la tabla de frecuencias quedar con la siguiente informacin:

El archivo comprimido sera:

100011101000001011100111010010111010111110011100110110101011010 11111111001100110000001101010010101000001011 En total seran 110 bits, que en comparacin con los 256 bits originales observamos una compactacin de aprx. 43%.

Descompresin o Descompactacin de datos


Este proceso consiste en ir leyendo los bits del archivo compactado y accediendo desde la raz del rbol ir descendiendo por el mismo, de la siguiente forma: si leo un bit 0 se deber descender por el hijo izquierdo, si en cambio, leo un bit 1 se deber descender por el hijo derecho. Este descenso ser hasta llegar a una hoja (hijos en null), en dicho caso se informar su Id. Y se volver a la raz para seguir parseando los prximos bits.

Aplicaciones
Si bien existen varias tcnicas de compresin que ofrecen mejor rendimiento que la codificacin de Huffman, esta se encuentra todava en uso generalizado debido a su simplicidad, alta velocidad, y falta de problemas de patentes. La deflacin y cdec multimedia como JPEG y MP3 tienen una cuantificacin digital5 basada en la codificacin de Huffman.
5

El proceso de cuantificacin es uno de los pasos que se siguen para lograr la digitalizacin de una seal analgica.

Codificacin Aritmtica
Es un mtodo que, al igual que la codificacin Huffman, se basa en reducir el nmero medio de bits requeridos para representar un smbolo pero que, a diferencia de sta, permite representar smbolos con un nmero de bits fraccionario. Con esta tcnica de codificacin no es necesario que las probabilidades de los smbolos del alfabeto fuente sean potencias de dos para obtener una eficiencia ptima.

Algoritmo Deflacin
Es un algoritmo de compresin de datos sin prdidas que usa una combinacin del algoritmo LZ77 y la codificacin Huffman. El algoritmo deflacin est libre de todo tipo de patentes subsistentes, ha llevado a su popularizacin y su uso en archivos comprimidos bajo gzip y archivos de imagen PNG, adems del formato de compresin ZIP para el cual fue diseado originalmente.

JPEG
Este es un mtodo de compresin con prdidas, pero en parte de su implementacin se utiliza Cdigo Huffman. Es a menudo considerado como un formato de archivo. JPEG es el formato de imagen ms comn utilizado por las cmaras fotogrficas digitales y la transmisin de imgenes fotogrficas en la World Wide Web.

MP3
MPEG-1 o 2 Audio Layer III ms comnmente conocido como MP3, es un formato de compresin de audio digital patentado que usa un algoritmo con prdida para conseguir un menor tamao de archivo. Usa como algoritmo de cuantificacin digital cdigo Huffman. Es un formato de audio comn usado para msica tanto en ordenadores como en reproductores de audio porttil.