2. Introducción
Algoritmos de Compresión sin Pérdida
Codificación de Huffman
Algoritmo de Huffman
Algoritmo de Burrows-Wheeler
Conclusiones
3. La compresión de datos es el proceso de convertir una cadena de
datos de entrada en otra cadena de datos que tenga un tamaño
menor.
La compresión de datos es útil y popular por los siguientes motivos:
A la gente le gusta acumular datos y odia tirar cualquier cosa.
Las personas detestan esperar mucho tiempo en la transferencia de sus datos.
Existen varios métodos de compresión pero el principio es el mismo:
tratar de eliminar la redundancia de los datos originales.
Es decir, cualquier dato que no sea aleatorio debe poseer una
estructura.
4. Tienen como objetivo representar cierta cadena de datos utilizando y ocupando
menor espacio y cuya reconstrucción sea exacta.
Este tipo de algoritmo son usados para comprimir archivos donde no se puede
permitir perder ninguna porción de información, tales como textos, imágenes y
sonido.
Modelo estático: lee y codifica utilizando la probabilidad de aparición de cada
carácter, representado de forma simple en una tabla estática de probabilidades
Modelo basado en diccionarios: usa código simple para reemplazar cadenas de
símbolos por una valor de un diccionario
5. Se diferencia de los demás métodos porque construye sus códigos mediante un
árbol de código y se lo recorre desde lo más profundo hacia arriba.
6. Es un algoritmo desarrollado en 1952 por David A. Huffman y es utilizado para la
construcción de códigos Huffman.
Toma un alfabeto de n-caracteres, los asocia junto a sus frecuencias de aparición.
El algoritmo de Huffman crea un árbol binario donde cada carácter es una hoja y
se construye de tal forma que siguiéndolo desde la raíz a cada una de las hojas se
obtiene el código de Huffman asociado a él.
7. 1. Se crea varios árboles, uno por cada carácter del alfabeto, consistiendo cada uno
de los árboles en nodo sin hijos y etiquetado cada uno con su carácter y con su
frecuencia de aparición.
2. Se toman los dos árboles de menor frecuencia y se unen al nuevo árbol. La
etiqueta de la raíz será la suma de las frecuencias de las raíces de los dos sub-
árboles que se unen, y cada uno de estos árboles será un hijo del nuevo árbol.
También se etiquetan las dos ramas del nuevo árbol: con un 1 la de la izquierda
y un 0 la de la derecha.
3. Se repite el paso 2 hasta que sólo quede un árbol.
8. a4 se combina con a5 y ambas se sustituyen por el
símbolo a45, cuya probabilidad es de 0,2.
Ahora quedan cuatro símbolos disponibles: a1—con
una probabilidad de 0,4— y a2, a3, a45 —con
probabilidades de 0,2 cada uno—. Se seleccionan de
forma arbitraria a3 y a45, combinándolos y
reemplazándolos por el símbolo auxiliar a345 —cuya
probabilidad es de 0,4—.
En este momento tenemos tres símbolos, a1, a2 y
a345 —con probabilidades 0,4, 0,2 y 0,4,
respectivamente—. Se seleccionan de forma arbitraria
a2 y a345, combinándolos y reemplazándolos por el
símbolo auxiliar a2345 —cuya probabilidad es de
0,6—.
Finalmente, combinamos los dos símbolos restantes,
a1 y a2345, sustituyéndolos por a12345 —con una
probabilidad de 1,0—.
9. 1. Comenzar con un código vacío.
2. Iniciar el recorrido del árbol en la hoja asociado al símbolo.
3. Comenzar un recorrido del árbol hacia arriba.
4. Cada vez que se suba de nivel, añadir al código la etiqueta de la rama que se ha
recorrido (1 o 0).
5. Al llegar a la raíz, invertir el código.
6. El resultado es el código de Huffman.
10. 1. Comenzar el recorrido del árbol desde la raíz.
2. Extraer el primer símbolo del código a descodificar
3. Descender por la rama etiquetada con ese símbolo.
4. Repetir desde el paso 2 hasta que se llegue a una hoja, que será el símbolo
asociado al código.
11. Para a1 la traducción 0
a2 10
a3 111
a4 1101
a5 1100
12. Trabaja en modo bloque, donde la cadena de datos se analiza y lee por bloques, y
cada bloque es codificado por separado de la cadena.
Funciona bien tanto para imágenes, audio y texto
Produce compresión con resultados muy buenos, en algunos casos la compresión es
de 1 bit por byte e inclusive mejor.
Comienza con una cadena S de n símbolos y la desorganiza, produciendo otra
cadena L que debe satisfacer dos condiciones:
Cualquier región de L tenderá a tener una concentración de sólo unos pocos símbolos.
Es posible reconstruir la cadena original S a partir de L.
13. Matemáticamente, se resolverá a través de una permutación, y que una cadena de
símbolos n tiene n! permutaciones.
El codificador de Burrows-Wheeler procede de la siguiente manera:
1. La cadena L es creada por el codificador como una permutación de S. El codificador
también genera información adicional denotada por I y que será utilizada en el paso 3.
2. El codificador comprime L e I, y escribe los resultados en la cadena de salida. Este paso
comienza típicamente con RLE, continua con la codificación mover al frente, y finalmente
aplica la codificación de Huffman.
3. El decodificador lee la cadena de salida y la decodifica aplicando los mismos métodos que
en el anterior paso, pero en orden inverso. El resultado es la cadena L y la variable I.
NOTA: Ambas L e I son usadas por el decodificador para reconstruir la cadena original.
14. Usaremos la cadena swiss_miss.
Creamos una matriz de n x n, donde
almacena la cadena S en la primera fila.
Seguida por n-1 copias de S, cada una
desplazada cíclicamente un símbolo a la
izquierda
15. A partir de esto la matriz se ordena
lexicográficamente por filas, produciendo la
matriz ordenada.
La permutación de L seleccionada por el
codificador es la última columna de la
matriz ordenada. La información necesaria
para reconstruir S a partir de L es el
número de la fila de cadena original en la
matriz ordenada, que es nuestro ejemplo es
8, este número se almacena en I.
8
16. El decodificador lee un flujo comprimido, lo descomprime utilizando
Huffman y mover-al-frene y luego re-construye la cadena S a partir de la L
descomprimida siguiendo estos pasos:
La primera columna de la matriz ordenada
(columna F) se construye a partir de L.
Mientras ordena L, el decodificador prepara una
matriz auxiliar T que muestra las relaciones entre
los elementos de L y F. El primer elemento de T
es 4 ya que el éste se encuentra en la posición 4
de F. El segundo elemento de T es 9, es decir
que este se encontrara en la 9 posición de F, y
así sucesivamente.
La cadena F ya no es necesaria. El decodificador
utiliza L, I y T para reconstruir S de acuerdo con:
17.
18. La utilización de RLE tiene sentido, pero solo
como un primer paso. El paso principal de la
compresión de L debe utilizar el método
mover-al-frente.
Se inicializa A con una lista de los símbolos
que aparecen en la cadena A = (_, i, m, s, w).
Para i = 0, …, n-1, se codifican el símbolo Li
como el número de símbolos que le preceden
en A, y luego se mueve el símbolo Li hasta el
comienzo de A
Se combina los códigos del paso 2 en una lista
C, que se comprime aún más utilizando
Huffman o la codificación aritmética.
19. El algoritmo de Huffman tiene muchas aplicaciones y es uno de los algoritmos más
importantes dentro la compresión de datos.
El algoritmo de Burrows-Wheeler es un algoritmo diferente a los tradiciones
porque éste trabaja en bloques, pero aún así necesita de más algoritmos para que
su funcionamiento sea eficiente.
El algoritmo de Burrows-Wheeler sirve particularmente para cadenas muy largas
dando resultados muy buenos y se ha demostrado que en cadena de datos
pequeñas resulta ineficiente.
21. El código se encuentra en los siguientes links:
Huffman: https://github.com/edwinnm/Codificaci-n-de-Huffman
Burrows-Wheeler: https://github.com/edwinnm/Burrows-Wheeler