Вы находитесь на странице: 1из 11

Métodos de compresión Huffman y LZ77

José Roberto Pérez Cruz


Compresión de Datos y Criptografía
1
Codificación Huffman

Codificación basada en la asignación de códigos de


longitud variable desarrollada por David A. Huffman en
1952.

Tiene la capacidad de conseguir un mayor nivel de compresión


si se asignan códigos más cortos a los símbolos que aparecen
más a menudo y si la variedad de símbolos es reducida.

2
Algoritmo de Huffman (1)

1. Contar cuantas veces aparece cada símbolo en el archivo a comprimir


y crear una lista enlazada con la información de caracteres y
frecuencias.

2. Convertir cada elemento de la lista en un árbol.

3. Fusionar todos los árboles en uno único


Mientras la lista de árboles contenga más de un elemento hacer:
a) Con los dos primeros árboles formar un nuevo árbol,
cada uno de los árboles originales en una rama
b) Sumar las frecuencias de cada rama en el nuevo árbol
c) Insertar el nuevo árbol en el lugar adecuado de la lista
según la suma de frecuencias obtenida, registradas en
en el nodo padre del nuevo árbol.
3
Algoritmo de Huffman (2)

4.Asignar el código de cada símbolo siguiendo la rama del árbol


adecuada, si se toma una rama izquierda, se añade un cero al código,
si se toma una rama derecha, se añade un uno.

5.Se recodifica el archivo sustituyendo cada símbolo con los nuevos


códigos.

Nota: cada nodo hoja del árbol generado será un símbolo, siendo las
hojas del nivel más bajo, los símbolos con una frecuencia de aparición
menor.

4
Ejemplo de codificación Huffman (1)

Comprimir la cadena: “anita lava la tina”

1) Se forma la lista enlazada con caracteres y frecuencias:

donde el espacio es representado por ' '

2) Cada elemento de la lista se convierte en un árbol

5
Ejemplo de codificación Huffman (2)

3) Se fusionan los árboles

6
Ejemplo de codificación Huffman (3)

4) Recorriendo las ramas del árbol, se asignan los códigos para cada
uno de los caracteres:
a=10, ' '=00, n=010, l=011, t=110, i=1111, v=1110

7
Ejemplo de codificación Huffman (4)

5) Se recodifica la cadena utilizando los códigos generados al recorrer


el árbol

anita lava la tina

10010111 11101000 01110111 01000011 10001101 11101010

8
Algoritmo LZ77 (1)

Algoritmo de compresión sin pérdida basado en


diccionario publicado en 1977 por Abraham Lempel y
Jacob Ziv.

Usa una “ventana deslizable” que se mueve a lo largo de


la cadena de símbolos junto con el cursor para la
codificación.

La ventana se divide en dos partes: el diccionario que es


la parte anterior al cursor y el “buffer predictivo” que es la
parte posterior al cursor.
9
Algoritmo LZ77 (2)

1. Encontrar la cadena de mayor coincidencia comenzando


en la posición del cursor, contenida completamente en el
buffer predictivo a partir de una cadena contenida en el
diccionario.

2. Codificar mediante la 3-tupla (p, n, c) la posición p de la


ocurrencia en la ventana, la longitud n de la cadena
coincidente y el carácter c posterior a la coincidencia.

3. Mover el cursor n + 1 posiciones hacia adelante.

10
Ejemplo de compresión LZ77

Codificar la cadena: “aacaacabcabaabc”

Paso Cadena de entrada Código


de salida
1 a a c a a c a b c a b a a b c (0, 0, a)
2 a a c a a c a b c a b a a b c (1, 1, c)
3 a a c a a c a b c a b a a b c (3, 4, b)
4 a a c a a c a b c a b a a b c (3, 3, a)
5 a a c a a c a b c a b a a b c (1, 2, c)

11

Вам также может понравиться