Está en la página 1de 13

Algoritmo de Hoffman

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:

Figura 1: Donde, entre los paréntesis () se encuentra la frecuencia y en los recuadros el


símbolo.
Análisis de algoritmos

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

Tamaño inicial vs Tamaño comprimido


6.00E+08

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.

Comparación Tamaño de archivo inicial y Tamaño de archivo


descomprimido

Tamaño inicial vs Tamaño de scom-


primido
6.00E+08
TAMAÑO DESCOMPRIMIDO

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

Como se puede notar, el tamaño disminuyó considerablemente o al menos igualó el


tamaño inicial.

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

Gráfica para la compresión

Polinomio para la compresión


−9
f ( x )=63.4792 ×10 x +1.1224

Grado 1

5
Análisis de algoritmos

Gráfica para la descompresión

Polinomio para la compresión


f ( x )=5.1896 x +11.3434

Grado 1

6
Análisis de algoritmos

7. Análisis de la cota O

Es importante mencionar que con esta función se crea un árbol amortizado.

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.

iii. ¿Cuál es la proporción temporal que guardan la codificación vs la decodificación?


El promedio que se tarda en codificar la implementación para las 20 muestras es
de 3.9622522831 y el tiempo promedio para la decodificación es de 4.2209469795,
así la relación entre la codificación y la decodificación es la siguiente:
4.2209469795
=1.06528981
3.9622522831

iv. ¿Ocurrieron perdidas de la información al codificar los archivos?


No, el tamaño inicial del archivo y el tamaño después de la descompresión es
exactamente el mismo.

v. ¿El comportamiento experimental de los algoritmos era el esperado? ¿Por qué?


Se puede considerar que sí, a pesar de que hay ciertas inconsistencias al momento
de graficar los resultados empíricos se puede observar que en lo general se
observa un comportamiento lineal al igual que en la cota del algoritmo.

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.

vii. ¿De 3 aplicaciones posibles en problemas de la vida real a la codificación de


codificación en menor espacio?
1. En las aplicaciones que utilizamos en la cotidianeidad solo se aceptan archivos
de hasta cierto tamaño, por lo que en ocasiones es necesario comprimir el
archivo para que pese menos y se pueda mandar por la aplicación.

11
Análisis de algoritmos

2. Si se quiere ahorrar espacio en un dispositivo de almacenamiento, se pueden


guardar los archivos comprimidos y en caso de necesitarlos solo se
descomprimen.
3. Si se tiene un conjunto de archivos que requieren ser empaquetados, se
pueden almacenar todos juntos y comprimirlos en un único archivo, lo que
reducirá el tamaño total del nuevo archivo creado, en el peor de los casos, el
tamaño será el mismo.
viii. ¿Existió un entorno controlado para realizar las pruebas experimentales? ¿Cuál
fue?
Hardware:
Marca del Equipo Dell
Procesador Intel(R) Core (TM) i7-10750H CPU @ 2.60GHz.
Memoria RAM Instalada 8.00 GB
Memoria RAM Total 7.80 GB
Memoria RAM Disponible 627 MB
Memoria Virtual Total 15.6 GB
Memoria Virtual Disponible 2.20 GB

Compilador: GCC (GNU Compiler Collection) en Linux.

Especificaciones de la Máquina Virtual:

Sistema operativo: Ubuntu 20.04.3 LTS, montado sobre una máquina virtual. El SO base
utilizado es Microsoft Windows 10 Home Single Language.

Memoria 1.9 GiB


Procesador Intel(R) Core (TM) i7-10750H CPU @ 2.60GHz.
ix. ¿Qué recomendaciones
Gráficos darían a nuevos
Llvmpipeequipos
(LLVMpara realizar
12.0.0 esta práctica?
256 bits)
Capacidad del disco 56.3 GB
Sistema Operativo Ubuntu 20.04.3 LTS
Tipo de SO 64 bits
Versión de GNOME 3.36.8
Virtualización Oracle
Primero deben entender el procedimiento, si no se entiende no será posible
implementar una solución. Lleva bastante tiempo, así que es importante no dejarla
al último y hay que pensar un poco abstracto.

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

También podría gustarte