20
Algoritmos voraces Códigos de Huffman

Código Huffman

Embed Size (px)

DESCRIPTION

Explicación del funcionamiento del código de Huffman, uno de los métodos de codificación probabilista sin pérdida más conocidos

Citation preview

Page 1: Código Huffman

Algoritmos voraces

Códigos de Huffman

Page 2: Código Huffman

Descripción del problema

Tenemos un archivo de entrada. Asumiremos que el archivo está compuesto

de bytes (enteros de 8 bits sin signo). El problema consiste en codificar

(comprimir) el archivo de entrada utilizando el menor número posible de bits.

Existe un algoritmo que resuelve el problema, y que es conocido como el algoritmo de Huffman.

Page 3: Código Huffman

Solución del problema

Se podría decir que la solución se obtiene aplicando cuatro fases:

1. Crear un vector de frecuencias de aparición de cada byte en el archivo de entrada.

2. Crear el árbol óptimo de codificación de Huffman a partir del vector de frecuencias.

3. Crear una tabla de codificación a partir del árbol de codificación.

4. La codificación propiamente dicha.

Page 4: Código Huffman

Vector de frecuencias

Necesitamos conocer la frecuencia de aparición de cada byte en el archivo de entrada.

Por tanto, tenemos que hacer una primera lectura del archivo de entrada.

El objetivo es crear un vector de la forma:

-1 0 1 2 … 97 98 … 255 256

6 25 0 … 3 5 … 5

El índice es elvalor del byte

El contenido esla frecuencia

Si leemos un 255 …

6

Sumamos 1

Page 5: Código Huffman

Árbol óptimo de codificación (1)

Se crea utilizando el algoritmo de Huffman. Este algoritmo se puede clasificar como

algoritmo voraz. Las entradas del algoritmo son los bytes

presentes en el archivo de entrada. Trabaja con un conjunto de árboles. Es

decir, lo que se podría llamar un bosque. Nodo de un árbol de Huffman: índice

peso• Al enlace izquierdo se le asigna un valor 0• Al enlace derecho se le asigna un valor 1

Es lo que se llama un trie binario (leido “trai”)0 1

Page 6: Código Huffman

Árbol óptimo de codificación (2)

Los nodos hoja del árbol de Huffman serán los bytes leídos en el archivo de entrada. En ese caso: índice = valor del byte (entre 0 y 255) peso = frecuencia del byte

A partir del vector de frecuencias construimos un bosque de árboles que sólo tienen un nodo. Cada nodo representará a un byte, con su índice (valor) y su peso (frecuencia).

Un byte sólo está presente en este bosque inicial si aparece en el archivo de entrada con una frecuencia distinta de cero.

Page 7: Código Huffman

Árbol óptimo de codificación (3)

Nuestro “bosque” inicial podría consistir, por ejemplo, en una lista de nodos.

índice = 97peso = 10

índice = 32peso = 8

índice = 9peso = 10

índice = 72peso = 3

Ahora debemos extraer los dos nodos con menor peso.

Esto nos hace pensar que una lista no es la mejor opción posible, pero comentaremos esto más adelante.

Page 8: Código Huffman

Árbol óptimo de codificación (4)

A partir de los dos nodos con menor peso extraídos se construye un nuevo nodo. Su peso será la suma de los pesos de sus hijos.

El índice es indiferente por ahora. Sólo es importante para la construcción de la tabla de codificación. A partir de ahora tomará los valores 256, 257, 258, etc.

índice = 97peso = 10

índice = 9peso = 10

índice = 32peso = 8

índice = 72peso = 3

índice = 256peso = 11

El nodo así creado se debeintroducir en el bosque pararealizar una nueva selección.

Page 9: Código Huffman

Árbol óptimo de codificación (5)

El proceso es iterativo:

índice = 32peso = 8

índice = 72peso = 3

índice = 256peso = 11

índice = 9peso = 10

índice = 97peso = 10

índice = 257peso = 20

Page 10: Código Huffman

Árbol óptimo de codificación (6)

Hasta que nos quedamos con un único nodo:

índice = 32peso = 8

índice = 72peso = 3

índice = 256peso = 11

índice = 9peso = 10

índice = 97peso = 10

índice = 257peso = 20

índice = 258peso = 31

(Vacío)

Page 11: Código Huffman

Árbol óptimo de codificación (7)

En la siguiente extracción, el bosque queda vacío y obtenemos el árbol de Huffman:

índice = 32peso = 8

índice = 72peso = 3

índice = 255peso = 11

índice = 9peso = 10

índice = 97peso = 10

índice = 256peso = 20

índice = 257peso = 31

(Vacío)

¿Codificación de 97?

0

1

10 1

0

10

Page 12: Código Huffman

Árbol óptimo de codificación (8)

Es posible que haya notado que son posibles varios árboles de codificación.

Todos son óptimos en el sentido de que proporcionan una codificación con el menor número de bits.

La mejor estructura para almacenar los nodos del bosque (conjunto de candidatos) es una cola de prioridad, donde la prioridad es el peso del nodo.

Esto nos permite extraer el mínimo de una manera eficaz.

Page 13: Código Huffman

Árbol óptimo de codificación (9)

El estudio de Huffman nos dice que si el número de entradas es C, el número máximo de nodos del árbol de codificación es 2C – 1.

Esto nos permite utilizar como cola de prioridad un montículo binario. Recordar que un montículo binario se implementa con un array.

En nuestro caso C es, como máximo, igual a 256. El montículo binario puede tener un tamaño seguro de (2 * 256 – 1).

Page 14: Código Huffman

Tabla de codificación (1)

La tabla de codificación es un paso intermedio entre el árbol de codificación y la verdadera codificación.

Se construye para que la codificación sea más sencilla y rápida.

Sin embargo, para construirla es necesario que cada nodo del árbol de Huffman pueda referenciar a su padre, y que almacene información sobre el tipo de hijo que es él mismo (0 ó 1).

Page 15: Código Huffman

Tabla de codificación (2)

Un nodo de la tabla de codificación puede contener la información siguiente:

peso indicePadre tipoHijo

La tabla consiste en un array que sirve para indexar nodos de codificación.

El tamaño de este array nos lo indica el índice del nodo raíz del árbol Huffman.

Page 16: Código Huffman

Tabla de codificación (3) Se crear el array para indexar. El árbol se recorre en preorden. Y así hasta recorrer todo el árbol … 32

72

255

256

257

índice = 32peso = 8

índice = 72peso = 3

índice = 255peso = 11

índice = 9peso = 10

índice = 97peso = 10

índice = 256peso = 20

índice = 257peso = 31

0

1

10 1

0

31 -1

11 257 0

3 255 0

8 255 1

Page 17: Código Huffman

Codificación

La codificación a partir de la tabla de codificación es casi inmediata. Es necesaria una segunda lectura del archivo.

32

72

255

256

257 31 -1

11 257 0

3 255 0

8 255 1

¿Codificación de 32?

1

0

fin

Por tanto, la codificación es …

0 1

Page 18: Código Huffman

Complejidad

Estudiemos la complejidad del algoritmo que crea el árbol de Huffman, que es el que nos interesa por ser voraz.

La extracción en una cola de prioridad tiene una complejidad O(logn).

Por tanto, la complejidad de todo el algoritmo, que es iterativo, será O(n logn).

Page 19: Código Huffman

Consideraciones finales

Para conseguir la decodificación es necesario almacenar en el archivo codificado más información que los bits de los códigos.

Evidentemente nos interesa que esa información ocupe el menor espacio posible.

¿Quizás la tabla de codificación? Pero esta, es otra historia …

Page 20: Código Huffman

Bibliografía

Estructuras de datos en Java

Mark Allen Weiss

Editorial: Addison-Wesley

Técnicas de Diseño de Algoritmos

Rosa Guerequeta y Antonio Vallecillo