Algoritmos voraces Códigos de Huffman. Descripción del problema Tenemos un archivo de entrada. Asumiremos que el archivo está compuesto de bytes (enteros.

Slides:



Advertisements
Presentaciones similares
Arreglos Unidimensionales y Bidimensionales ESTRUCTURAS DE DATOS I
Advertisements

ALGORITMOS GENETICOS EVOLUCIÓN DE UNA POBLACIÓN DE
Diseño y análisis de algoritmos
Diseño y análisis de algoritmos
IBD Clase 7.
ESTRUCTURA DE DATOS Unidad 04 Árboles BINARIOS.
Árboles Grafo que no contiene ciclos, es decir es un grafo también acíclico, pero a su vez es conexo.
ÁRBOLES EN C UNIVERSIDAD “ALONSO DE OJEDA” Facultad de Ingeniería
BENEMERITA UNIVERSIDAD AUTONOMA DE PUEBLA
MATRIZ DE CHEQUEO DE PARIDAD
DOM ( Document Object Model) Prof. Franklin Cedeño.
Investigación de Operaciones II
PROGRAMACION DE ESTRUCTURAS DE DATOS
Windows XP sp3.
Unidad aritmético-lógica
Arquitectura de Conjunto de Instrucciones (ISA)
Solución de problemas por búsqueda inteligente
CLASIFICACION DE LAS MAQUINAS DE TURING
ÁRBOLES DE EXPRESION.
Cont. Arbol Binario de Búsqueda (2). Sobre los recorridos Las versiones recursivas de los recorridos son costosas debido a la gran cantidad de llamadas.
Tema Nº4.
Arboles Binarios de expresiones
ALGORITMOS es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos.
ESTRUCTURAS DE CONTROL
Introducción a la Informática Clase 5
Estructura de Datos Lineales
Departamento de Informática Universidad Técnica Federico Santa María Capítulo 2 “Subprogramas/Funciones - Arreglos” Arreglos-Arrays.
Estructuras de Datos MC Beatriz Beltrán Martínez.
Programación en Matlab
Árboles, montículos y grafos Cola de prioridades, montículos
PILAS, COLAS, RECURSIVIDAD.
Heaps Mauro Maldonado Abril/2005. Introducción La estructura heap es frecuentemente usada para implementar colas de prioridad. En este tipo de colas,
Índice. Revisando conceptos acerca de la memoria.
Estructura de Datos y Algoritmos
Diseño y análisis de algoritmos
Programación dinámica: Introducción
Diseño y análisis de algoritmos
Arboles M.C. José Andrés Vázquez FCC/BUAP

Programación IMC José Andrés Vázquez Flores. Definición Un arreglo es un conjunto finito e indexado de elementos homogéneos, que se referencian por un.
Seguridad y encriptación Compresión de archivos
CÓDIGOS DE HUFFMAN. Códigos de Huffman Los códigos de Huffman, que representan caracteres por cadenas de bits de longitud variable, proporcionan alternativas.
Sistema de archivos Sistemas operativos.
Tipos de campos de una base de datos Campos numéricos Fechas Campos de texto.
Diseño y análisis de algoritmos
Aplicación de estructuras de datos
Codificadores y Decodificadores

Árboles Recomendado: 1. Nivelación Funciones
Unidad aritmético-lógica
Algoritmos genéticos Introducción Esquema básico Codificación
INTRODUCCIÓN A LA INFORMÁTICA
Análisis y Diseño de Algoritmos
Unidad 1: FUNDAMENTOS DE COMPUTACIÓN Y PSEUDOLENGUAJE
TEMA 5: El problema del flujo con costo mínimo
Punteros Recomendado: 1. Nivelación Funciones
Objetivo Mostrar los fundamentos de la programación a través de ejemplos y prácticas utilizadas cotidianamente en el desarrollo de aplicaciones.
COLEGIO DE BACHILLERES “XOCHIMILCO TEPEPAN” Nº13  Tecnologías de la Información y comunicación 3.  Profa. Gabriela Pichardo Lazardo EQUIPO 25  Emmanuel.
ARBOLES GENERALIZADOS
METODOS DE BUSQUEDA EN C++ Oscar Michel Ruiz León
A YUDANTÍA 5: A RBOLES Carlos Pulgar R. Mail: Página Ayudantía:
Capítulo 8: Árboles Autor: José Alfredo Jiménez Murillo.

Matemáticas Discretas MISTI
Programación I Prof. Carolina Cols. Algoritmo es una lista bien definida, ordenada y finita de operaciones que permite hallar la solución a un problema.
CODIFICACION DE HUFFMAN
Circuitos Combinacionales I
Bases de datos II Universidad del Cauca Ing. Wilson Ortega.
UNIVERSIDAD TECNOLÓGICA DE PANAMÁ Facultad de Ingeniería de Sistemas Computacionales Programa de Lic. en Informática Educativa Computación.
Sistema Numérico Binario Prof. Carlos Ortiz Muñoz.
Transcripción de la presentación:

Algoritmos voraces Códigos de 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.

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.

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: 012…9798… …35…5 El índice es el valor del byte El contenido es la frecuencia Si leemos un 255 … 6 Sumamos 1

Á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”) 01

Á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.

Árbol óptimo de codificación (3) Nuestro “bosque” inicial podría consistir, por ejemplo, en una lista de nodos. índice = 97 peso = 10 índice = 32 peso = 8 índice = 9 peso = 10 índice = 72 peso = 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.

Á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 = 97 peso = 10 índice = 9 peso = 10 índice = 32 peso = 8 índice = 72 peso = 3 índice = 256 peso = 11 El nodo así creado se debe introducir en el bosque para realizar una nueva selección.

Á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

Árbol óptimo de codificación (6) Hasta que nos quedamos con un único nodo: í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 (Vacío)

Á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 = 255 peso = 11 índice = 9 peso = 10 índice = 97 peso = 10 índice = 256 peso = 20 índice = 257 peso = 31 (Vacío) ¿Codificación de 97?

Á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.

Á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).

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).

Tabla de codificación (2) Un nodo de la tabla de codificación puede contener la información siguiente: pesoindicePadretipoHijo 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.

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 = 255 peso = 11 índice = 9 peso = 10 índice = 97 peso = 10 índice = 256 peso = 20 índice = 257 peso =

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 … 01

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).

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 …

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