Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción
En el año 1952, David Albert Huffman desarrolló un algoritmo que es utilizado para
la compresión y encriptación de datos haciendo uso de la frecuencia de aparición
de caracteres. El algoritmo funciona a partir de un conjunto de un conjunto de
dado de símbolos con sus respectivos pesos. Los pesos hacen referencia a la
frecuencia de aparición de los símbolos en una cadena, información necesaria para
poder construir el llamado código de Huffman.
El código de Huffman para la codificación necesita saber la aparición de cada
símbolo, para posteriormente construir el árbol de frecuencia. Se considera un
árbol binario, en donde cada nodo contendrá el símbolo y la cantidad de veces que
este aparece en el archivo. Posteriormente se acomodarán de manera ascendente
para crear un mega árbol, como el que se muestra a continuación:
Así es posible observar que en nodo raíz se encontrará el número total de símbolos
existentes en el archivo.
Este árbol reflejará que hemos obtenido una codificación exitosa, cabe destacar
que el hecho de que hayamos realizado esta codificación generará una compresión
del archivo/cadena con la que se estará trabajando, pero el objetivo de esta
práctica no queda solo en eso. Una vez obtenido dicho árbol de codificación se
deberá recorrer el mismo de tal manera que al llegar a un nodo hoja se obtenga el
símbolo almacenado. Esta acción se deberá repetir hasta que se hayan recorrido
todos los caminos posibles del árbol, lo cual nos dará como resultado una
decodificación del archivo o cadena con la que estemos trabajando, cumpliendo
con los objetivos de esta práctica.
Figura 2: Representación del proceso de descompresión del archivo, recorrido del árbol.
2
Análisis de algoritmos
Estadísticas
Comparación Tamaño de archivo inicial y Tamaño de archivo comprimido
5.00E+08
Yamaño comprimido
4.00E+08
3.00E+08
2.00E+08
1.00E+08
0.00E+00
0.00E+00 1.00E+08 2.00E+08 3.00E+08 4.00E+08 5.00E+08 6.00E+08
Tamaño inicial
Se puede observar que el tamaño del archivo comprimido es menor o al menos igual al
tamaño del archivo inicial, por lo que se considera que es una compresión exitosa, pues si
se logra disminuir el tamaño del archivo inicial.
5.00E+08
4.00E+08
3.00E+08
2.00E+08
1.00E+08
0.00E+00
0.00E+00 1.00E+08 2.00E+08 3.00E+08 4.00E+08 5.00E+08 6.00E+08
TAMAÑO INICIAL
Es posible observar que el tamaño del archivo inicial es exactamente igual al tamaño del
archivo final, por lo que no hay perdida ni ganancias de bytes.
3
Análisis de algoritmos
Porcentaje de compresión
Extensión del Tamaño de
Tamaño original % Alcanzado
archivo compresión
.txt 2b 1b 50%
.pdf 177b 75b 42.3728%
.png 116.1Kb 116.1Kb 0%
.rar 149b 109b 73.1543%
.zip 205b 107b 52.1951%
.bmp 196.3Kb 75.9Kb 38.6653%
.ppt 62.5Kb 60.8kb 97.28%
Tabla 1
Obtención de polinomio
Tamaño y Tamaño del archivo Tiempo en Tiempo en
extensión .dat compresión descompresión
2bytes.txt 1 byte 0.0030639172 0.0002679825
149bytes.rar 109 bytes 0.0014650822 0.0004110336
177bytes.pdf 75 bytes 0.0016441345 0.0004041195
205bytes.zip 107 bytes 0.0063889027 0.0006248951
612bytes.cpp 305 bytes 0.0029900074 0.0005750656
19.9KBytes.rar 19.8 KB 0.0019338131 0.0019781590
48KBytes.zip 46.6 KB 0.0126461983 0.0060131550
62.5KBytes.pptx 60.8 KB 0.0087769032 0.0106539726
116.1KBytes.png 116.1 KB 0.0335199833 0.0127840042
196.3KBytes.bmp 75.9 KB 0.0244240761 0.0108850002
276.7MB.pdf 268.9 MB 18.7059020996 20.3214540482
36.7MB.rar 36.7 MB 2.4674899578 2.3642840385
1.5MB.png 1.5 MB 0.2784368992 0.1242141724
31.2MB.pptx 30.4 MB 2.2290859222 2.3037059307
114.8MB.txt 52 MB 5.3630490303 4.0263829231
528.6MB.mp4 525.3 MB 35.9898269176 40.4018449783
5.9MB.rar 5.9 MB 0.6568350792 0.3897089958
8.7MB.zip 8.7 MB 0.8025069237 0.5683510303
58.4MB.pdf 57 MB 4.1060309410 4.7955780029
Tabla 2
No se pudieron hacer pruebas en Linux con archivos cuyo tamaño es de gigabytes, ya que el
computador utilizado no lo soportó, pero cuando se realizaron en Windows el tiempo para
archivos de un tamaño sobre los gigabytes fue muy bajo.
4
Análisis de algoritmos
Grado 1
5
Análisis de algoritmos
Grado 1
6
Análisis de algoritmos
7. Análisis de la cota O
7
Análisis de algoritmos
8
Análisis de algoritmos
Se puede notar que la cota más grande presente en todo el algoritmo es lineal, por lo que
se considera que la cota que representa la compresión es O(n). A pesar de que hay dos
ciclos while anidados uno se hace n veces y el otro se hace un número constante de veces,
así, aunque aparenta de cuadrático, es lineal.
9
Análisis de algoritmos
Finalmente, por la Regla de la Suma es posible observar que la cota que representa la
descompresión es la cota lineal O(n). Es importante mencionar que a pesar de que hay
dos for anidados uno de ellos tiene una cota constante, por lo que la complejidad es lineal
y no cuadrática.
10
Análisis de algoritmos
Cuestionario
i. ¿Los niveles de codificación de archivos proporcionan una ventaja respecto al
tamaño del archivo original en el promedio de los casos?
Sí, ya que baja su tamaño o al menos lo iguala como se puede observar en las
Tabla 1 y Tabla 2.
ii. ¿Los tiempos de codificación o decodificación del archivo son muy grandes?
No, se puede observar en la Tabla 2 que los tiempos tanto para descompresión y
compresión son muy pequeños, a excepción de uno que tarda 40 segundos y 20
segundos.
vi. ¿Qué características deberá de tener un archivo de texto para tener una
codificación en menor espacio?
Entre más grande sea la frecuencia de los símbolos existentes en el archivo, la
compresión será mejor.
11
Análisis de algoritmos
Sistema operativo: Ubuntu 20.04.3 LTS, montado sobre una máquina virtual. El SO base
utilizado es Microsoft Windows 10 Home Single Language.
12
Análisis de algoritmos
Conclusiones
El propósito principal de esta práctica consiste en realizar la implementación del algoritmo
de Huffman en código C++, el cual tiene como finalidad realizar la compresión de datos a
través de la generación de una codificación en binario de los distintos caracteres que
conforman a un archivo, tomando en cuenta la cantidad de veces que aparece cada uno,
por lo cual podemos decir que se ha cumplido el objetivo principal ya que se tiene el
código funcionando correctamente y de manera eficiente. Anteriormente se nos había
solicitado realizar la codificación en lenguaje ANSI C, sin embargo, debido a las diferentes
funcionalidades que ofrece C++ para hacer más eficiente el algoritmo, se nos ha permitido
utilizar este lenguaje. El aspecto principal por el cual se ha optado por utilizar C++ lo
podemos observar al momento de realizar la combinación y el ordenamiento de los
árboles ya que se ha utilizado un “multiset” el cual basa su funcionamiento mediante la
utilización de árboles rojo negro con hilos; esta función nos ha permitido mejorar la
complejidad en el ordenamiento y fusión de los árboles llegando casi a un orden lineal.
Por otro lado, mediante la realización de las tablas comparativas sobre los distintos tipos
de archivos que se utilizaron para las pruebas de compresión, podemos concluir en que el
tipo de archivo no es un parámetro del todo fiable para poder determinar el porcentaje
de compresión que tenga cada uno, ya que entre archivos del mismo tipo pero con
diferente magnitud arrojaron porcentajes de compresión distintos, lo que nos llevó a
pensar que posiblemente se deba a como este conformado el archivo, por la varianza en
la cantidad de caracteres que tenga cada uno. Finalmente, la práctica nos ha servido tanto
para comprender el funcionamiento y la utilidad de este algoritmo como para conocer
funciones nuevas en el lenguaje C++ , las cuales mejoran de gran manera la eficiencia del
algoritmo.
13