Algoritmos voraces Códigos de Huffman
Descripción del problema <ul><li>Tenemos un  archivo de entrada . </li></ul><ul><li>Asumiremos que el archivo está compues...
Solución del problema <ul><li>Se podría decir que la solución se obtiene aplicando cuatro fases: </li></ul><ul><li>Crear u...
Vector de frecuencias <ul><li>Necesitamos conocer la  frecuencia  de aparición de cada byte en el archivo de entrada. </li...
Árbol óptimo de codificación (1) <ul><li>Se crea utilizando el  algoritmo de Huffman . </li></ul><ul><li>Este algoritmo se...
Árbol óptimo de codificación (2) <ul><li>Los  nodos hoja  del árbol de Huffman serán los bytes leídos en el archivo de ent...
Árbol óptimo de codificación (3) <ul><li>Nuestro “bosque” inicial podría consistir, por ejemplo, en una lista de nodos. </...
Árbol óptimo de codificación (4) <ul><li>A partir de los dos nodos con menor peso extraídos se construye un nuevo nodo. Su...
Árbol óptimo de codificación (5) <ul><li>El proceso es iterativo: </li></ul>índice  = 32 peso  = 8 índice  = 72 peso  = 3 ...
Árbol óptimo de codificación (6) <ul><li>Hasta que nos quedamos con un único nodo: </li></ul>(Vacío) índice  = 32 peso  = ...
Árbol óptimo de codificación (7) <ul><li>En la siguiente extracción, el bosque queda vacío y obtenemos el árbol de Huffman...
Árbol óptimo de codificación (8) <ul><li>Es posible que haya notado que son posibles varios árboles de codificación. </li>...
Árbol óptimo de codificación (9) <ul><li>El estudio de Huffman nos dice que si el número de entradas es  C , el número máx...
Tabla de codificación (1) <ul><li>La tabla de codificación es un paso intermedio entre el árbol de codificación y la verda...
Tabla de codificación (2) <ul><li>Un nodo de la tabla de codificación puede contener la información siguiente: </li></ul><...
Tabla de codificación (3) <ul><li>Se crear el array para indexar. </li></ul><ul><li>El árbol se recorre en  preorden . </l...
Codificación <ul><li>La codificación a partir de la tabla de codificación es casi inmediata. Es necesaria una segunda lect...
Complejidad <ul><li>Estudiemos la complejidad del algoritmo que crea el árbol de Huffman, que es el que nos interesa por s...
Consideraciones finales <ul><li>Para conseguir la  decodificación  es necesario almacenar en el archivo codificado más inf...
Bibliografía <ul><li>Estructuras de datos en Java </li></ul><ul><li>Mark Allen Weiss </li></ul><ul><li>Editorial: Addison-...
Upcoming SlideShare
Loading in...5
×

Código Huffman

16,804

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
16,804
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
513
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Código Huffman

  1. 1. Algoritmos voraces Códigos de Huffman
  2. 2. Descripción del problema <ul><li>Tenemos un archivo de entrada . </li></ul><ul><li>Asumiremos que el archivo está compuesto de bytes (enteros de 8 bits sin signo). </li></ul><ul><li>El problema consiste en codificar (comprimir) el archivo de entrada utilizando el menor número posible de bits. </li></ul><ul><li>Existe un algoritmo que resuelve el problema, y que es conocido como el algoritmo de Huffman . </li></ul>
  3. 3. Solución del problema <ul><li>Se podría decir que la solución se obtiene aplicando cuatro fases: </li></ul><ul><li>Crear un vector de frecuencias de aparición de cada byte en el archivo de entrada. </li></ul><ul><li>Crear el árbol óptimo de codificación de Huffman a partir del vector de frecuencias. </li></ul><ul><li>Crear una tabla de codificación a partir del árbol de codificación. </li></ul><ul><li>La codificación propiamente dicha. </li></ul>
  4. 4. Vector de frecuencias <ul><li>Necesitamos conocer la frecuencia de aparición de cada byte en el archivo de entrada. </li></ul><ul><li>Por tanto, tenemos que hacer una primera lectura del archivo de entrada. </li></ul><ul><li>El objetivo es crear un vector de la forma: </li></ul>Si leemos un 255 … 5 … 5 3 … 0 25 6 256 255 … 98 97 … 2 1 0 -1 El índice es el valor del byte El contenido es la frecuencia 6 Sumamos 1
  5. 5. Árbol óptimo de codificación (1) <ul><li>Se crea utilizando el algoritmo de Huffman . </li></ul><ul><li>Este algoritmo se puede clasificar como algoritmo voraz . </li></ul><ul><li>Las entradas del algoritmo son los bytes presentes en el archivo de entrada. </li></ul><ul><li>Trabaja con un conjunto de árboles . Es decir, lo que se podría llamar un bosque . </li></ul><ul><li>Nodo de un árbol de Huffman: </li></ul><ul><li>Al enlace izquierdo se le asigna un valor 0 </li></ul><ul><li>Al enlace derecho se le asigna un valor 1 </li></ul>Es lo que se llama un trie binario (leido “trai”) índice peso 0 1
  6. 6. Árbol óptimo de codificación (2) <ul><li>Los nodos hoja del árbol de Huffman serán los bytes leídos en el archivo de entrada. En ese caso: </li></ul><ul><ul><li>índice = valor del byte (entre 0 y 255) </li></ul></ul><ul><ul><li>peso = frecuencia del byte </li></ul></ul><ul><li>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). </li></ul><ul><li>Un byte sólo está presente en este bosque inicial si aparece en el archivo de entrada con una frecuencia distinta de cero. </li></ul>
  7. 7. Árbol óptimo de codificación (3) <ul><li>Nuestro “bosque” inicial podría consistir, por ejemplo, en una lista de nodos. </li></ul><ul><li>Ahora debemos extraer los dos nodos con menor peso . </li></ul><ul><li>Esto nos hace pensar que una lista no es la mejor opción posible, pero comentaremos esto más adelante. </li></ul>índice = 97 peso = 10 índice = 32 peso = 8 índice = 9 peso = 10 índice = 72 peso = 3
  8. 8. Árbol óptimo de codificación (4) <ul><li>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. </li></ul><ul><li>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. </li></ul>El nodo así creado se debe introducir en el bosque para realizar una nueva selección. índice = 97 peso = 10 índice = 9 peso = 10 índice = 32 peso = 8 índice = 72 peso = 3 índice = 256 peso = 11
  9. 9. Árbol óptimo de codificación (5) <ul><li>El proceso es iterativo: </li></ul>índice = 32 peso = 8 índice = 72 peso = 3 índice = 256 peso = 11 índice = 9 peso = 10 índice = 97 peso = 10 índice = 257 peso = 20
  10. 10. Árbol óptimo de codificación (6) <ul><li>Hasta que nos quedamos con un único nodo: </li></ul>(Vacío) índice = 32 peso = 8 índice = 72 peso = 3 índice = 256 peso = 11 índice = 9 peso = 10 índice = 97 peso = 10 índice = 257 peso = 20 índice = 258 peso = 31
  11. 11. Árbol óptimo de codificación (7) <ul><li>En la siguiente extracción, el bosque queda vacío y obtenemos el árbol de Huffman: </li></ul>índice = 32 peso = 8 índice = 72 peso = 3 índice = 9 peso = 10 índice = 97 peso = 10 (Vacío) ¿Codificación de 97 ? 0 1 10 índice = 255 peso = 11 índice = 256 peso = 20 índice = 257 peso = 31 1 0 1 0
  12. 12. Árbol óptimo de codificación (8) <ul><li>Es posible que haya notado que son posibles varios árboles de codificación. </li></ul><ul><li>Todos son óptimos en el sentido de que proporcionan una codificación con el menor número de bits. </li></ul><ul><li>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. </li></ul><ul><li>Esto nos permite extraer el mínimo de una manera eficaz. </li></ul>
  13. 13. Árbol óptimo de codificación (9) <ul><li>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 . </li></ul><ul><li>Esto nos permite utilizar como cola de prioridad un montículo binario . Recordar que un montículo binario se implementa con un array. </li></ul><ul><li>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). </li></ul>
  14. 14. Tabla de codificación (1) <ul><li>La tabla de codificación es un paso intermedio entre el árbol de codificación y la verdadera codificación. </li></ul><ul><li>Se construye para que la codificación sea más sencilla y rápida. </li></ul><ul><li>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). </li></ul>
  15. 15. Tabla de codificación (2) <ul><li>Un nodo de la tabla de codificación puede contener la información siguiente: </li></ul><ul><li>La tabla consiste en un array que sirve para indexar nodos de codificación. </li></ul><ul><li>El tamaño de este array nos lo indica el índice del nodo raíz del árbol Huffman. </li></ul>tipoHijo indicePadre peso
  16. 16. Tabla de codificación (3) <ul><li>Se crear el array para indexar. </li></ul><ul><li>El árbol se recorre en preorden . </li></ul><ul><li>Y así hasta recorrer todo el árbol … </li></ul>índice = 32 peso = 8 índice = 72 peso = 3 índice = 9 peso = 10 índice = 97 peso = 10 0 1 257 256 255 72 32 índice = 255 peso = 11 índice = 256 peso = 20 índice = 257 peso = 31 1 0 1 0 -1 31 0 257 11 0 255 3 1 255 8
  17. 17. Codificación <ul><li>La codificación a partir de la tabla de codificación es casi inmediata. Es necesaria una segunda lectura del archivo. </li></ul>¿Codificación de 32 ? 1 0 fin Por tanto, la codificación es … 0 1 257 256 255 72 32 -1 31 0 257 11 0 255 3 1 255 8
  18. 18. Complejidad <ul><li>Estudiemos la complejidad del algoritmo que crea el árbol de Huffman, que es el que nos interesa por ser voraz. </li></ul><ul><li>La extracción en una cola de prioridad tiene una complejidad O(logn) . </li></ul><ul><li>Por tanto, la complejidad de todo el algoritmo, que es iterativo, será O(n logn) . </li></ul>
  19. 19. Consideraciones finales <ul><li>Para conseguir la decodificación es necesario almacenar en el archivo codificado más información que los bits de los códigos. </li></ul><ul><li>Evidentemente nos interesa que esa información ocupe el menor espacio posible. </li></ul><ul><li>¿Quizás la tabla de codificación? </li></ul><ul><li>Pero esta, es otra historia … </li></ul>
  20. 20. Bibliografía <ul><li>Estructuras de datos en Java </li></ul><ul><li>Mark Allen Weiss </li></ul><ul><li>Editorial: Addison-Wesley </li></ul><ul><li>Técnicas de Diseño de Algoritmos </li></ul><ul><li>Rosa Guerequeta y Antonio Vallecillo </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×