You are on page 1of 5

CENTRO UNIVERSITARIO DE CIENCIAS EXACTAS E INGENIERIAS

Actividad 8
Compresin Huffman.
Benuto Castaeda Marcos Giovanni
11/23/2014
Introduccin.

Se desarrollar un algoritmo para la compresin de un archivo de la extensin .txt mediante el rbol de Huffman y
se harn varias pruebas de compresin con criterio del tamao de los archivos originales y los comprimidos.

Contenido.

Escriba e implemente un algoritmo que sea capaz de realizar la compresin de un archivo mediante el
mtodo de compresin de Huffman. La entrada debe de ser un archivo de texto .txt y la salida debe de
ser un archivo binario .bin con la traduccin del texto a cdigo de Huffman.
Utilize 10 archivos de texto con diferente contenido y diferente longitud (puede copiar cualquier texto de
internet). Reporte la proporcin entre los tamaos del archivo de texto original y el generado por el
algoritmo implementado.
Reporte la complejidad algortmica del algoritmo propuesto.
Algoritmo de Huffman.

Definicin.

Se trata de un algoritmo que puede ser usado para compresin o encriptacin de datos. Este algoritmo se
basa en asignar cdigos de distinta longitud de bits a cada uno de los caracteres de un fichero. Si se
asignan cdigos ms cortos a los caracteres que aparecen ms a menudo se consigue una compresin del
fichero. Esta compresin es mayor cuando la variedad de caracteres diferentes que aparecen es menor.
Por ejemplo: si el texto se compone nicamente de nmeros o maysculas, se conseguir una compresin
mayor.
Para recuperar el fichero original es necesario conocer el cdigo asignado a cada carcter, as
como su longitud en bits, si sta informacin se omite, y el receptor del fichero la conoce, podr recuperar
la informacin original. De este modo es posible utilizar el algoritmo para encriptar ficheros.

Algoritmo

Contar cuantas veces aparece cada carcter en el fichero a comprimir. Y crear una lista
enlazada con la informacin de caracteres y frecuencias.
Ordenar la lista de menor a mayor en funcin 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 ms de un elemento:
Con los dos primeros rboles formar un nuevo rbol, cada uno de los rboles originales en
una rama.
Sumar las frecuencias de cada rama en el nuevo elemento rbol.
Insertar el nuevo rbol en el lugar adecuado de la lista segn la suma de frecuencias
obtenida.
Para asignar el nuevo cdigo binario de cada carcter slo hay que seguir el camino
adecuado a travs del rbol. Si se toma una rama cero, se aade un cero al cdigo, si se
toma una rama uno, se aade un uno.

Ejemplo

Tomemos un texto corto, por ejemplo:


"ata la jaca a la estaca"

1) Contamos las veces que aparece cada carcter 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 raz 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 despus de primera fusin


Y sucesivamente:

Estructura despus de varias fusiones


El resultado final es:
5) Asignamos los cdigos, 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
0 1110 0 10 1101 0 10 111111 0 1100 0 10 0 10 1101 0 10 111110 11110 1110 0 1100 0

Y slo queda empaquetar los bits en grupos de ocho, es decir en bytes:

01110010 11010101 11111011 00010010 11010101 11110111 10111001 10000000


0x72 0xD5 0xFB 0x12 0xD5 0xF7 0xb9 0x80

En total ocho bytes, y el texto original tena 23.


Pero no nos engaemos, tambin hay que almacenar la informacin relativa a la codificacin, por
lo que se puede ver que para textos cortos no obtendremos mucha reduccin de tamao.

Implementacin.

Para obtener la siguiente tabla se ha implementado el algoritmo de Huffman dentro de C++, utilizando
textos de diferente tamao y con distinta combinacin de caracteres. Se muestra el tamao del archivo
original y el tamao del archivo resultante.

Archivos originales.

Archivos comprimidos
Nmero De Prueba Tiempo de
Y Kilobytes del Peso Original Peso Comprimido Ejecucin
archivo (Bytes) (Bytes) (segundos)
1 1 kb 29 43 0.005
2 15 kb 14,774 9,200 0.019
3 29 kb 29,550 18,286 0.08
4 61 kb 61,624 34,795 0.062
5 404 kb 412,948 251,107 0.353
6 1189 kb 1,216,872 684,479 1.099
7 2147 kb 2,197,670 1,215,518 1.695
8 5660 kb 5,794,824 3,164,700 4.264
9 13377 kb 13,697,400 7,943,244 10.202
10 61710 kb 63,190,958 35,625,912 47.002
Promedio 8469.3 8,655,502.5 4894728.4 6.4781

Anlisis de complejidad.

Cada iteracin del algoritmo de Huffman reduce la medida del problema en 1, as que hay n iteraciones.
La iteracin consiste de localizar los dos valores mnimos de una longitud n-i+1. Esto es una operacin lineal y
por tanto el algoritmo tiene un tiempo de complejidad de O(n2)
Sin embargo podra ser ms rpido si los pesos inicialmente son ordenados y entonces mantiene dos listas. La
primera lista consiste de pesos que no han sido combinado y la segunda lista de rboles que han sido formados por
las combinaciones de los pesos. al realizar esta cambio se obtiene que la complejidad del algoritmo es O (n log(n))

Conclusin.
La compresin de Huffman es til para archivos cuyos datos sean muy repetitivos, y en archivos pequeos
tiene el problema de que aumenta el tamao del archivo debido a su algoritmo.

Datos de la prctica.
Las caractersticas de la computadora donde fueron implementados estos algoritmos son:

Procesador: AMD E2-1800 APU con Radeon HD Graphics 1.70 GHz.


RAM: 4.00 Gb (3.60 utilizable).
Sistema: Sistema operativo de 64 bits.
Disco Duro: 450 Gb.

Estos programas fueron utilizados para la realizacin de tablas y grficas.

Tablas y grficas: Microsoft Excel


Cdigo:

Libreras

You might also like