You are on page 1of 1

Algoritmia - Pr

actica de Divide y Vencer


as y Algoritmos Voraces - Curso 2013-14
Se trata de hacer un programa para codificar mensajes mediante el metodo de Huffman.
El programa recibira como parametro una lista de parejas (l, f ), siendo l el codigo ASCII de una
letra y f su frecuencia, que contendra todas las letras empleadas en el mensaje a codificar y devolvera
una lista de parejas (l, h), siendo l el codigo ASCII anterior y h su codigo de Huffman.
El algoritmo de Huffman consiste en juntar dos letras en una nueva, cuya frecuencia es la suma de
las frecuencias de las dos letras que se juntan, eliminar esas dos letras de la lista, a
nadir la nueva y
hacer una llamada recursiva con la lista que ha quedado.
Para seleccionar las letras a juntar se usa un algoritmo voraz: Las dos que tienen menor frecuencia.
Tambien se emplea divide y venceras, ya que se reduce el problema de partida: obtener los codigos
de Huffman de N letras, a otro de igual tipo pero mas simple: obtener los codigos de Huffman de
las N 1 letras que quedan al eliminar las dos seleccionadas y crear una nueva a partir de ellas. La
solucion del problema de partida se obtiene a partir de la solucion del problema reducido, como veremos
a continuacion.
El caso trivial es que tengamos una sola letra (l,f ), y la solucion trivial es (l,).
En el caso recursivo, si en una etapa se juntan las letras (l1 , f1 ) y (l2 , f2 ) en la letra (l3 , f1 + f2 )
y la llamada recursiva nos devuelve una lista de codigos de Huffman que contiene (l3 ,h3 ), los codigos
respectivos de l1 y l2 son respectivamente h1 = h3 +0 y h2 = h3 +1, por lo que la solucion del
problema de partida consiste en eliminar (l3 ,h3 ) de la lista y a
nadir en su lugar (l1 ,h1 ) y (l2 ,h2 ).
Se pide:
1. Escribir el pseudocodigo de la funcion que calcula los codigos de Huffman.
2. Demostrar que dicho algoritmo es optimo, es decir que la codificacion resultante tiene un n
umero
mnimo de bits.
3. Calcular el tiempo del peor caso en funcion de N . Para ello se deben poner justificadamente los
tiempos de las funciones auxiliares precisas (extraer el menor elemento de la lista y a
nadir un
elemento a la lista) en funcion de la estructura de datos empleada para almacenar la lista, pero
no hace falta poner el pseudocodigo de dichas funciones auxiliares.
4. Realizar un programa en C o Java, llamado huffman que necesite un parametro de tipo cadena de
caracteres, con el mensaje a codificar. El programa debera calcular la tabla de codigos de cada
letra y la codificacion final del mensaje, un ejemplo podra ser:
$ java huffman "veni, vidi, vinci"
C
odigos de huffman para cada c
odigo ASCII:
32->001
44->010
99->1100
100->1101
101->000
105->10
110->011
118->111
Codif.: 111000011100100011111011011001000111110011110010
Se debera subir un u
nico archivo en formato zip o similar, conteniendo un documento electronico
en formato abierto (pdf, odt, etc.) con la respuesta a las tres primeras preguntas y el codigo fuente del
programa correspondiente a la cuarta.

You might also like