APLICACIÓN DE ÁRBOLES BINARIOS

Documentos relacionados
GENERACIÓN DE ÍNDICES ANALÍTICOS DE DOCUMENTOS

Estructura de datos y de la información Boletín de problemas - Tema 2

DaVinciTEXTIL. Codificación de artículos

Problemas de Recursividad

Tablas Hash y árboles binarios

Estructura de datos y de la información Boletín de problemas - Tema 10

Estructura de Datos. Códigos de Huffman. Primer Semestre, Compresión de Archivos. Compresión de Archivos

F. Javier Gil Chica 2010

Prof. Dr. Paul Bustamante

SISTEMAS DE NUMERACIÓN Y CODIFICACIÓN

Tema 14: ÁRBOLES Algoritmos y estructuras de datos I - Tema 14 1

REPRESENTACIÓN INTERNA DE LA INFORMACIÓN

Compresión de Datos. Método de Huffman. Dpto. Informática

EJERCICIOS DE PROGRAMACIÓN EN C. DIBUJAR UN ROMBO O DIAMANTE. CALCULAR SUMATORIOS. (CU00542F)

Programación I. Práctica parcial: el juego de los barquitos (ENTREGA OBLIGATORIA)

Programación 1. Diseño modular de nuevos tipos de datos en un programa. Diseño modular de un tipo de dato con estructura de conjunto

INFORMATICA II PRIMER PARCIAL

Uso de centinelas para la toma de decisiones. Esquemas y diagramas de flujo. Ejemplos resueltos. (CU00167A)

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

PRÁCTICA Nº 5: 2 sesiones (del 11 de Abril al 17 de Abril de 2003) Listas con punto de interés para la composición de melodías musicales

Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Organización del Computador CI-3815

Centro Asociado Palma de Mallorca. Tutor: Antonio Rivero Cuesta

Tema 3 Constantes, Variables y Tipos

Conjuntos disjuntos (Relaciones de equivalencia)

Práctica 2 Estadística Descriptiva

Probabilidad. La probabilidad mide la frecuencia con la que aparece un resultado determinado cuando se realiza un experimento.

Represent. Información. Caracteres Alfanuméricos

Tema 05: Tablas hash. M. en C. Edgardo Adrián Franco Martínez edgardoadrianfrancom

Tipos Recursivos de Datos

La herramienta ArtEM: Aritmética Entera y Modular

Tipos de Datos Recursivos

Tecnologías para el Desarrollo de Aplicaciones para Dispositivos Móviles. Parte 2

ESTRUCTURAS DE DATOS Y ALGORITMOS

Ejercicios del tema 5. Jerarquía de de Memoria

2. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS

Tipos de campos en MySQL

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

Tema 10. Árboles. José M. Badía, Begoña Martínez, Antonio Morales y José M. Badía

SUBCONJUNTOS y CONJUNTO POTENCIA. COMP 2501: Estructuras Computacionales Discretas I Dra. Madeline Ortiz Rodríguez 3 de septiembre de 2013

La sintaxis básica para definir una clase es la que a continuación se muestra:

SISTEMAS OPERATIVOS SISTEMA DE ARCHIVOS

PROBLEMA 1. Rellena el hueco 1 (línea 23). Realiza la reserva de memoria para almacenar los n puntos.

Para la resolución de los ejercicios, se dispone de una implementación de árbol binario a través de la clase BinTree con la siguiente especificación.

MAGNITUD VECTORIAL. Veamos un ejemplo sencillo: Es un segmento de línea recta orientada que sirve para representar a las magnitudes vectoriales.

Introducción Programación Modular y a Métodos: Consideremos el siguiente ejercicio:

Manual del Usuario de Microsoft Access Consultas - Página 1. Tema IV: Consultas. IV.1. Creación de Consultas

Una clave Definición informal La clave debe contener una secuencia de una o más letras seguidas por uno o más dígitos

324 MR Versión 1 Prueba Integral 1/3 Semana 10 Lapso

Expresión, Operador, Operando, Asignación, Prioridad

Algoritmos glotones 2 (código de Huffman) mat-151

REPASO ARRAYS MULTIDIMENSIONALES EN JAVA. DECLARACIÓN Y USO. EJEMPLOS Y EJERCICIOS RESUELTOS. (CU00905C)

Lenguajes de programación LPSI EUI UPM CADENAS DE CARACTERES

SISTEMAS DE NUMERACIÓN

Algo sobre Compresión de Datos

Codificador Decodificador ISBN EAN13 (GTK2.0,GdkPixbuf,GDK & GCC)

Benemérita Universidad Autónoma de Puebla Facultad de Ciencias de la Computación Área de Programación

EJERCICIOS EXCEL. Guardar el libro en tu pen drive, con el nombre PRACTICA1_ALUMNO_GRUPO.

NORMA INFORMACIÓN Y DOCUMENTACIÓN. FORMATOS PARA EL INTERCAMBIO DE LA INFORMACIÓN. International Standard ISO Campo de aplicación

Declaración de variables (integer, single, double, boolean, etc.) en Visual Basic. Dim. Ejemplos. (CU00309A)

TEMA 2: Control combinacional. 1.- Introducción. Esquema:

2. ESTRUCTURAS BÁSICAS

No tienen componente en continua: Lo que implica todas las ventajas mencionadas anteriormente.

Gestión de datos con STATGRAPHICS

Tema 7: Polimorfismo. Índice

FUNDAMENTOS DE INFORMÁTICA

APELLIDOS NOMBRE GRUPO CALIFICACIÓN FECHA

Sistemas Electrónicos Digitales

ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS Tipos de datos Expresiones Operadores y operandos Identificadores como localidades de memoria

UNIDAD I. ALGORITMOS

Programación 1. Tema V Clase de problemas. Desarrollo de un módulo de biblioteca C++ para trabajar con conjuntos de letras

Examen escrito de Programación 1

ESCUELA SUPERIOR POLITECNICA DE CHIMBORAZO TEMA: TIPOS DE DATOS DE EXCEL

Este material es de uso exclusivo para clase de algoritmos y estructura de datos, la

Contenido PARTE II: ESTRUCTURAS DE DATOS AVANZADAS

PRÁCTICA 4. EL ENTORNO DE UN ROBOT EN C++

Álgebra Lineal Ma1010

Laboratorio 7 Motor de búsqueda web basado en el TAD Árbol Binario de Búsqueda GUIÓN DEL LABORATORIO

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

Definición(2) La base (r) de un sistema de numeración especifica el número de dígitos o cardinal* de dicho conjunto ordenado. Las bases más utilizadas

EJEMPLO DE CÓDIGO JAVA BÁSICO. CREAR CLASES CON CAMPOS, CONSTRUCTOR Y MÉTODOS. LA PALABRA CLAVE THIS (CU00652B)

MICROSOFT EXCEL QUÉ ES MICROSOFT EXCEL?

Se utilizarán las letras mayúsculas, tales como A, B y C para nombrar conjuntos. Por ejemplo: a i. o e

Capacidad : Número de valores diferentes que puede representar un código. Depende del número de dígitos usados.

Los números naturales

Funcionamiento del algoritmo XS3 para conversión binario-bcd

Se debe disponer sobre la mesa un documento de identificación con fotografía.

Unidad IV Arreglos y estructuras. M.C. Juan Carlos Olivares Rojas

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

RELACIONES ACCESS TIPOS DE RELACIONES QUE PODEMOS UTILIZAR

TEMA I: LOS CONCEPTOS FUNDAMENTALES DE LA TEORÍA DE LA COMPUTABILIDAD

ACTIVIDAD: 1.- Convierte de Sistema Decimal a Sistema Binario los siguientes números:

Estructura de Datos Tema 6. Árboles. Contenido 14/06/2018

Estadística aplicada a las ciencias sociales Curso para la Universidad de Chapultepec Doctorado en Ciencias Sociales y Administrativas

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

CAPITULO II. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS

GUIA PRACTICA PARA LA APLICACIÓN DE MS EXCEL TECNOLOGIA/ INFORMATICA

BASES DE DATOS. En Access hay una serie de herramientas u objetos que facilitan enormemente el tratamiento de la información:

CICLO DE GRADO MEDIO TÉCNICO EN SISTEMAS MICROINFORMÁTICOS Y REDES

NUEVAS TECNOLOGÍAS APLICADAS A LA GESTIÓN (E66) 5º INGENIERÍA EN INFORMÁTICA. Tema 5. Estructura Lógica de la Memoria.

Apuntadores en C y C++

Transcripción:

PRÁCTICA Nº 6: 2 sesiones (del 22 al 31 de Mayo de 2002) APLICACIÓN DE ÁRBOLES BINARIOS A LA COMPRESIÓN DE FICHEROS DE TEXTO MEDIANTE LA UTILIZACIÓN DE LOS CÓDIGOS DE HUFFMAN 0.- OBJETIVOS El objetivo de esta práctica es la utilización de los códigos de Huffman para la compresión de ficheros de texto. 1.- LOS CÓDIGOS DE HUFFMAN Para mostrar la forma en que pueden usarse los árboles binarios como estructuras de datos, se va a ver en esta práctica el problema de la construcción de los llamados "códigos de Huffman": Supóngase que se tienen mensajes formados por secuencias de caracteres (un texto cualquiera tendría esta forma). En cada mensaje, los caracteres son independientes entre sí y aparecen con una determinada probabilidad conocida a priori. Se desea codificar cada carácter mediante una secuencia de ceros y unos, de manera que ningún código de un carácter sea prefijo del código de otro carácter, esta propiedad de prefijos evitará cualquier tipo de ambigüedad en el proceso de decodificación del mensaje. El problema de codificación que se plantea sería: dado un conjunto de caracteres, en nuestro caso supongamos que todo el código ASCII (256 valores), y sus probabilidades de aparición en un texto (este dato no es conocido a priori y tendremos que hacer un estudio previo), encontrar un código para esos caracteres que cumpla la propiedad de prefijos, tal que la longitud media del código de un carácter sea mínima. La razón por la que se desea minimizar la longitud media de un código es que ello permitirá comprimir la longitud del mensaje codificado. El algoritmo de Huffman permite encontrar un código con las propiedades especificadas. La idea del algoritmo consiste en llegar a formar un árbol binario que represente el código. En los nodos terminales (hojas) de este árbol se almacenarán los caracteres que se desea codificar junto con la probabilidad de aparición de cada uno de ellos, cumpliéndose que los caracteres más probables están más próximos a la raíz que los menos probables. De manera que el camino desde la raíz del árbol a cualquier hoja del mismo representará el código para el carácter de esa hoja, de acuerdo con el criterio de que los subárboles izquierdos se etiquetan con un 0 y los subárboles derechos lo hacen con un 1. Según este criterio, los caracteres con mayor probabilidad de aparición tendrán los códigos de menor longitud, mientras que los que tengan una probabilidad de aparición menor tendrán asociado un código de mayor longitud. El algoritmo de Huffman consiste en lo siguiente: Suponiendo conocida la probabilidad de aparición de un carácter en un texto (sea p i ) hacer: 1) Crear un bosque formado por tantos árboles independientes como caracteres se vayan a codificar. Cada carácter será la raíz de un árbol independiente, almacenándose junto a él su probabilidad de aparición. 2) Buscar en el bosque los dos árboles que presenten las menores probabilidades de aparición. 3) Agrupar los dos árboles encontrados en el paso 2) en un solo árbol que tenga como subárbol izquierdo el árbol que tenía menor valor p i asociado y como subárbol derecho el otro árbol. En la raíz de este nuevo árbol no se almacena ningún carácter (o se almacena un carácter no imprimible, como por ejemplo char (7)) pero sí la probabilidad de aparición de los caracteres agrupados, que será la suma de sus dos probabilidades de aparición (p i + p j ). 4) Repetir desde el paso 2) hasta que en el bosque sólo quede un árbol que agrupe a todos los Práctica 6: Compresión de ficheros de texto mediante la utilización de los códigos de Huffman 1/6

caracteres. Práctica 6: Compresión de ficheros de texto mediante la utilización de los códigos de Huffman 2/6

2.- REALIZACIÓN DE LA PRÁCTICA Codificar/Decodificar archivos de texto mediante códigos de Huffman. Codificación Para codificar archivos, habrá que realizar las siguientes tareas: Tarea 1: Pedir al usuario el nombre del fichero a codificar, y el nombre del fichero donde queremos poner la información codificada. Encontrar las probabilidades de aparición de los caracteres del código ASCII (ordinales desde 32 a 255) en el fichero de texto que se desea codificar. Para este proceso se incluirá en el programa una rutina que calcule el número de veces que aparece cada carácter en el fichero texto. Será necesario definir una tabla que almacene la frecuencia de aparición de cada carácter. Tarea 2: Generar el código de Huffman a partir de la tabla de frecuencias. Esta tarea se realizará después de la tarea 1 y su esquema será: 1) Generar el árbol de Huffman según el algoritmo dado anteriormente, utilizando la tabla de la tarea 1 y sin considerar aquellos caracteres que no aparecen ninguna vez. 2) Recorrer el árbol para guardar, en forma de vector, el código que representa cada carácter, de manera que sea fácil consultarlo usando los caracteres como índices. Esta parte se realizará mediante el recorrido prefijo del árbol, pasando a la función de recorrido tres parámetros: El subárbol que estamos recorriendo, la subcadena generada hasta ese momento por el recorrido y por referencia la tabla de códigos. El algoritmo sería básicamente el siguiente: a) Si el nodo contiene un carácter imprimible (código ASCII entre 32 y 255) se guarda en la posición adecuada de la tabla de códigos el valor de la cadena. b) Si no es un carácter imprimible (es un nodo interior) se sigue recorriendo el árbol, primero el subárbol izquierdo añadiendo a la subcadena generada un 0, y luego el subárbol derecho añadiendo a la subcadena generada un 1. Tarea 3: Codificar un fichero texto según el código generado en la tarea 2. En esta tarea, a partir del fichero texto original, se obtendrá un fichero binario (sólo ceros y unos, como caracteres (1 byte), no como bits) que haga corresponder a cada carácter del fichero original el código de Huffman correspondiente. La rutina correspondiente a esta tarea responderá al siguiente esquema: 1) Almacenar el árbol de códigos como cabecera del fichero binario. Se utilizará para ello la notación empleada en otros casos ligeramente modificada: Se recorre en orden prefijo el árbol, escribiendo en el archivo la siguiente información: - Para cualquier nodo no vacio se guarda el carácter contenido en él. - Si el nodo está vacío no se guarda nada ya que todos los nodos terminales (hojas) contienen caracteres imprimibles (entre 32 y 255), mientras que los nodos interiores contienen un carácter no imprimible (en nuestro caso char (7).) 2) Para cada carácter del fichero original hacer: 2.1) Buscar en la matriz la cadena de 0 y 1 que tiene asociada. Práctica 6: Compresión de ficheros de texto mediante la utilización de los códigos de Huffman 3/6

2.2) Almacenar en el fichero binario la secuencia de ceros y unos determina en el paso anterior. En ningún caso se realizarán saltos de línea, ya que no tienen sentido en este problema. En esta fase habrá que estimar cuanto ocuparía el fichero binario si cada 0 y 1 escrito en él fuese un bit, en vez de un carácter. Se conseguiría comprimir el fichero original? Y si consideramos lo que ocupa la cabecera con el árbol de códigos? Decodificación Tarea 4: Decodificar un fichero numérico de ceros y unos para obtener el fichero texto correspondiente, a partir del código de Huffman que tiene almacenado. El esquema de la rutina será el siguiente: 1) Pedir el nombre del fichero a decodificar y el nombre del fichero donde deseamos poner la información decodificada. 2) Leer la cabecera del fichero binario y reconstruir en memoria el árbol de códigos. 2) Leer carácter a carácter el fichero binario y recorrer el árbol simultáneamente. 3) Si se encuentra en el árbol el código de un carácter imprimible, escribir ese carácter en el fichero de salida. Los procesos de Codificación y Decodificación se englobarán en un mismo programa que permita ejecutar la tarea deseada. La clase Arbol En esta práctica utilizaremos árboles que van a contener en los nodos tanto la frecuencia de aparición de cada carácter, como caracteres. El tipo Valor quedará por tanto como sigue struct Valor { int frec; char car; }; Por otro lado, la clase árbol, tendrá la siguiente interfaz, tal como se vió en clase: class Arbol { public: Arbol (void); Arbol (const Arbol &); ~Arbol (void); bool ArbolVacio (void); bool Informacion (Valor &); Arbol &HijoIzdo (void); Arbol &HijoDcho (void); void HacerArbol (Arbol &, Valor, Arbol &); private: typedef Arbol * PunteroArbol; bool esvacio; Valor info; PunteroArbol izdo, dcho; Práctica 6: Compresión de ficheros de texto mediante la utilización de los códigos de Huffman 4/6

}; Se deja a criterio del alumno, la posibilidad de utilizar funciones adicionales auxiliares contenidas en la parte privada de la clase. 4.- ENTREGA DE PROGRAMAS Al finalizar la práctica correspondiente se entregarán al profesor tres ficheros: 1) Programa principal de codificación y decodificación (Huffma##.cpp). 2) Ficheros de la clase Arbol (Arbol##.cpp y Arbol##.h) Nota Muy Importante Antes de poder empezar a realizar cualquiera de las prácticas es necesario presentar al las hojas de especificación de programas con las tareas que se van a realizar en la práctica, explicando brevemente como se van a solucionarse los problemas que se plantean. En este caso se entregarán al profesor, los organigramas correspondientes a las tareas ENTREGA DE PROGRAMAS: Al comenzar la sesión de prácticas del 5 al 7 de Junio. AYUDA: La tabla de frecuencias será una tabla que guardará enteros. La tabla vendrá indexada por el valor del carácter del que guardamos la información de la frecuencia. const int NUM_CAR = 256; typedef int VectorEnteros[NUM_CAR]; Para el bosque podemos crear una estructura que guarde un vector de árboles y el número de árboles válidos dentro del vector. typedef Arbol VectorArboles[NUM_CAR]; struct Bosque { VectorArboles info; int n; }; También podríamos utilizar simplemente una lista de árboles, añadiendo, para simplificar el problema un método para encontrar el mínimo (que colocase el punto de interés sobre el elemento mínimo de la lista.) Finalmente para guardar los códigos de Huffman nos basaremos en la misma idea de la tabla de frecuencias, pero en este caso lo que se guardará en la tabla serán los códigos generados en el recorrido del árbol. Práctica 6: Compresión de ficheros de texto mediante la utilización de los códigos de Huffman 5/6

typedef string VectorEnteros[NUM_CAR]; Nota: Mientras que tanto la tabla de frecuencias, como la tabla de los códigos de Huffman, son vectores y no necesitan ser pasados por referencia, el Bosque es una estructura, que si que necesita ser pasada por referencia en los casos que se crea conveniente. Práctica 6: Compresión de ficheros de texto mediante la utilización de los códigos de Huffman 6/6