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.