Your SlideShare is downloading. ×
Código Huffman
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Código Huffman

16,493
views

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

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,493
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
511
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Algoritmos voraces Códigos de Huffman
  • 2. 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 .
  • 3. Solución del problema
    • Se podría decir que la solución se obtiene aplicando cuatro fases:
    • Crear un vector de frecuencias de aparición de cada byte en el archivo de entrada.
    • Crear el árbol óptimo de codificación de Huffman a partir del vector de frecuencias.
    • Crear una tabla de codificación a partir del árbol de codificación.
    • La codificación propiamente dicha.
  • 4. 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:
    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. Á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:
    • 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”) índice peso 0 1
  • 6. Á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.
  • 7. Árbol óptimo de codificación (3)
    • Nuestro “bosque” inicial podría consistir, por ejemplo, en una lista de nodos.
    • 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.
    índice = 97 peso = 10 índice = 32 peso = 8 índice = 9 peso = 10 índice = 72 peso = 3
  • 8. Á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.
    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. Árbol óptimo de codificación (5)
    • El proceso es iterativo:
    í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. Árbol óptimo de codificación (6)
    • Hasta que nos quedamos con un único nodo:
    (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. Árbol óptimo de codificación (7)
    • En la siguiente extracción, el bosque queda vacío y obtenemos el árbol de Huffman:
    í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. Á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.
  • 13. Á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).
  • 14. 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).
  • 15. Tabla de codificación (2)
    • Un nodo de la tabla de codificación puede contener la información siguiente:
    • 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.
    tipoHijo indicePadre peso
  • 16. Tabla de codificación (3)
    • Se crear el array para indexar.
    • El árbol se recorre en preorden .
    • Y así hasta recorrer todo el árbol …
    í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. Codificación
    • La codificación a partir de la tabla de codificación es casi inmediata. Es necesaria una segunda lectura del archivo.
    ¿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. 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) .
  • 19. 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 …
  • 20. 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