La Web del Programador: Comunidad de Programadores
 
    Pregunta:  344 - ALGORITMO DE HUFFMAN
Autor:  Milton Perez
necesito una direccion donde pueda bajar el algoritmo de huffman o si alguien me lo puede enviar, gracias

  Respuesta:  José Luis Torres Pantoja
No te compliques la vida con el método largo, existe una forma de hacerlo más sencillo, de lo contrario, con el método largo te acabarías muy fácilmente la memoria si usas imágenes de 256(o más)colores. Ahi te va:
Primero ordenas de mayor a menor según sus probabilidades, despues asignas un 1 al primer código (a1=1), después copias esta cadena al segundo código (a2=a2 -> a2=1) entonces le niegas el último bit (a2=0) y le añades otro bit igual a este (a2=00), despues copias esta cadena al siguiente código (a3=a2 -> a3=00), le niegas el ultimo bit (a3=01) y le añades otro bit igual (a3=011), despues copias esta cadena al siguiente código (a4=a3 -> a4=011), le niegas el ultimo bit (a4=010) y le añades otro bit igual (a4=0100), y así sucesivamente. Sólo tienes que checar que cuando llegues al último símbolo ya no agregues el último bit.

Si necesitas más información yo tengo bibliografía que te puedo enviar o incluso el ´procedimiento en C para DOS.

  Respuesta:  José Manuel Domínguez
Este es el algoritmo Huffman, espero que te ayude(lo escribo en algo parecido a pseudocódigo):
Todo lo que escriba con el simbolo // delante, es un comentario.

Procedimiento Comprimir
Comenzar
Calcular histograma del fichero
Ordenar histograma por probabilidad de aparición
//Si hay n bytes distintos, habrán n filas
Mientras n>2 hacer
Sumar probabilidades de dos últimas frecuencias
Marcar los predecesores de la nueva fila
Reordenar la tabla por probabilidades
FinMientras
//Quedan 2 filas
Asignar a una fila un 0 y a la otra un 1
//Formar los códigos siguiendo los punteros hacia atrás
Mientras queden filas con predecesores hacer
Desde i=0 hasta n hacer
//n número de filas en la tabla actual
Si fila[i] tiene un predecesor entonces
Asignar al predecesor el código de fila[i]
Sino //tiene 2 predecesores
comenzar
copiar código de fila[i] a predecesores
añadir un 0 a un predecesor y 1 al otro
fin
FinSi
FinDesde
FinMientras
FinComprimir

Si tienes alguna otra duda, ya sabes donde puedes obtener respuesta.