Grafos 9.2 2016

24
Sección 9.2 Aplicaciones de los Árboles Tomado de Matemáticas Discretas y sus Aplicaciones. Rosen Esteban Andrés Díaz Mina

Transcript of Grafos 9.2 2016

Sección 9.2Aplicaciones de los Árboles

Tomado de Matemáticas Discretas y sus Aplicaciones. Rosen Esteban Andrés Díaz Mina

Introducción

Se presentan dos problemas que pueden estudiarse utilizando árboles:

1. ¿Cómo se pueden almacenar elementos en una lista de manera que todos los elementos puedan ser localizados fácilmente?

2. ¿Cómo se pueden codificar de manera eficiente un conjunto de caracteres mediante una cadena de bits?

Árboles Binarios de Búsqueda

La búsqueda de elementos en una lista es una de las tareas más importantes que surgen en el área de la computación. Nuestro primer objetivo será implementar un algoritmo de búsqueda que encuentre los elementos de manera eficiente cuando los objetos estén completamente ordenados. Esto se puede lograr mediante árboles binarios de búsqueda.

Definición 1

Un árbol binario en el que cada hijo de un vértice se designa como hijo izquierdo o hijo derecho, ningún vértice tiene más de un hijo izquierdo y un hijo derecho y cada vértice está etiquetado con una clave, que es uno de los objetos. Además, a los vértices se le designan las claves de modo que la clave de un vértice es mayor que la de todos los vértices de su subárbol izquierdo y menor que la de todos los vértices de su subárbol derecho.

Ejemplo 1

Construya un árbol binario de búsqueda para las palabras mathematics, physics, geography, zoology, meteorology, geology, psychology y chemistry.

Solución Ejemplo 1

Códigos instantáneos

Considere el problema de codificar las letras del alfabeto mediante cadenas de bits. Podemos representar cada letra utilizando una cadena de bits de longitud cinco, puesto que sólo hay 27 letras y hay 32 cadenas de longitud cinco.

El número total de bits utilizados para codificar los datos es cinco veces el número de caracteres en el texto si cada carácter se codifica mediante cinco bits.

Códigos instantáneos ¿Es posible encontrar una forma de codificar las letras

de modo que utilice menos bits? De este modo estaríamos ahorrando espacios en memoria y reduciendo el tiempo de transmisión de datos.

Para codificar las letras vamos a utilizar cadenas de bits de longitud variable. Las letras que aparecen con mayor frecuencia deberán codificarse utilizando cadenas de bits más cortas, mientras que las letras menos comunes se codificarán mediante cadenas más largas. Cuando las letras se codifican utilizando cadenas de longitud variable, se debe establecer algún método para determinar cuándo comienza y cuándo termina cada cadena de bits.

Códigos instantáneos Por ejemplo, si e se codificara por 0, a por 1 y s

por 01, entonces la cadena 0101 podría corresponder a sea, eas, eaea, ss.

Una manera de asegurarse de que ninguna cadena de bits se corresponde con más de una secuencia de caracteres consiste en codificar las letras de manera que cada cadena de bits asociada a una letra nunca aparezca al principio de la cadena de bits de otra letra.

Los códigos con esta propiedad se llaman códigos instantáneos.

Códigos instantáneos Un código instantáneo puede representarse

utilizando un árbol binario, donde los caracteres son las etiquetas de las hojas del árbol. Las aristas del árbol están etiquetadas de modo que a la arista que va al hijo izquierdo se le asigna 0 y a la que va al hijo derecho se le asigna 1. La cadena de bits que codifica cada carácter es la sucesión de etiquetas de las aristas del único camino de la raíz a la hoja que tiene ese carácter como etiqueta. Por ejemplo, el siguiente árbol representa la codificación de e por 0, a por 10, t por 110, n por 1110 y s por 1111.

Códigos instantáneos

Los árboles que representan códigos se pueden utilizar para descodificar cadenas de bits. Por ejemplo, descodificar la cadena 111110111010.

Códigos de Huffman

Este algoritmo toma como datos de entrada las frecuencias de los símbolos de una cadena y devuelve un código instantáneo que codifica la cadena de bits utilizando la menor cantidad de bits, de entre todos los posibles códigos instantáneos binarios para este conjunto de símbolos. Este algoritmo, conocido como codificación de Huffman, fue desarrollado por David Huffman en 1951.

Códigos de Huffman

La codificación de Huffman es un algoritmo esencial en la compresión de datos, el área de conocimiento que se dedica a reducir el número de bits necesarios para representar la información.

La codificación de Huffman se utiliza en numerosas ocasiones para comprimir cadenas de bits que representan texto y también desempeña un papel fundamental en la compresión de archivos de audio y de imágenes.

Códigos de Huffman Se tiene un archivo con 100 caracteres que se

desea compactar. Las frecuencias de aparición de caracteres en el archivo son las siguientes:

  a b c d e fFrecuencia

45 13 12 16 9 5

Códigos de Huffman

Puede usarse un código de longitud fija (de 3 bits). El archivo requeriría 300 bits.

  a b c d e fCódigo de Longitud Fija

000 001 010 111 100 101

Códigos de Huffman Usando un código de Longitud Variable

obtenemos:

Este código ahorra más del 25% (requiere 224 bits en lugar de 300).

  a b c d e fCódigo de Longitud Variable

0 101 100 011 1101 1100

Códigos de Longitud Fija vs Código de Longitud Variable (Huffman)

Códigos de Longitud Fija vs Código de Longitud Variable (Huffman)

Códigos de Longitud Fija vs Código de Longitud Variable (Huffman)

Codificación de Matemáticas

Codificación de Matemáticas - ASCII

Codificación de Matemáticas - Huffman

Códigos de Longitud Fija vs Código de Longitud Variable (Huffman)

Consultarhttp://www.cryptool-online.org/index.php?Itemid=18

Problemas Propuestos

Problemas Sección 9.2

2 19 2021 22 2426 27 29