MCOM1_U2_A2_CRAB

3
No importa que tan rápidas sean las computadoras o las redes modernas, los usuarios siempre necesitaran servicios de mayor velocidad. Para reducir el volumen de datos que se transfieren, generalmente se utiliza cierto tipo de compresión. Por eso, este tema resulta ser un interesante campo de investigación dentro de las Ciencias de la Computación. Existen muchos tipos de algoritmos de compresión de datos, algunos no tienen perdidas, otros pierden una parte de los datos que comprimen, pero el principal objetivo es el ahorro de almacenamiento y una mayor velocidad de transferencia Run-Length Encoding Como primer ejemplo, tenemos un algoritmo sencillo conocido como RLE o Run-length encoding. Este algoritmo consiste en reemplazar largas secuencias de datos repetitivos con un solo digito, seguido por un contador indicando el número de veces que se repite el digito. Por ejemplo: aaaaaaaaaabbbaxxxxyyyzyx Esta variable es de 24 dígitos y tiene muchas repeticiones. Utilizando el RLE, podemos reemplazarlo por una variable más corta como esta: a10b3a1x4y3z1y1x1 Ahora la variable es de 17 dígitos, que es aproximadamente un 70% más corta. Se puede optimizar aún más el algoritmo para lograr una mayor compresión eliminando los dígitos unitarios (los que indican que solo hay un digito), quedando: a10b3ax4y3zyx Este algoritmo se usa también para arreglos y se ha usado para imágenes, como el formato GIF y BMP. Variable-Length Encoding En este caso, el algoritmo utiliza un número variable de bits para representar los datos que se quieren comprimir. Este algoritmo permite una compresión y descompresión de una serie de bits sin error o sin pérdida. Estos códigos se utilizan con mucha frecuencia por lo mencionado y tienen mucha aplicación, porque son más eficientes que los

Transcript of MCOM1_U2_A2_CRAB

Page 1: MCOM1_U2_A2_CRAB

No importa que tan rápidas sean las computadoras o las redes modernas, los usuarios siempre necesitaran servicios de mayor velocidad. Para reducir el volumen de datos que se transfieren, generalmente se utiliza cierto tipo de compresión. Por eso, este tema resulta ser un interesante campo de investigación dentro de las Ciencias de la Computación. Existen muchos tipos de algoritmos de compresión de datos, algunos no tienen perdidas, otros pierden una parte de los datos que comprimen, pero el principal objetivo es el ahorro de almacenamiento y una mayor velocidad de transferencia

Run-Length Encoding

Como primer ejemplo, tenemos un algoritmo sencillo conocido como RLE o Run-length encoding. Este algoritmo consiste en reemplazar largas secuencias de datos repetitivos con un solo digito, seguido por un contador indicando el número de veces que se repite el digito. Por ejemplo:

aaaaaaaaaabbbaxxxxyyyzyx

Esta variable es de 24 dígitos y tiene muchas repeticiones. Utilizando el RLE, podemos reemplazarlo por una variable más corta como esta:

a10b3a1x4y3z1y1x1

Ahora la variable es de 17 dígitos, que es aproximadamente un 70% más corta. Se puede optimizar aún más el algoritmo para lograr una mayor compresión eliminando los dígitos unitarios (los que indican que solo hay un digito), quedando:

a10b3ax4y3zyx

Este algoritmo se usa también para arreglos y se ha usado para imágenes, como el formato GIF y BMP.

Variable-Length Encoding

En este caso, el algoritmo utiliza un número variable de bits para representar los datos que se quieren comprimir. Este algoritmo permite una compresión y descompresión de una serie de bits sin error o sin pérdida. Estos códigos se utilizan con mucha frecuencia por lo mencionado y tienen mucha aplicación, porque son más eficientes que los códigos de longitud fija. Esto es, el número de dígitos que se requieren para representar un mensaje dado con un código de longitud variable es frecuentemente menor que si se compara con un RLE.

Construcción del Código Huffman

El algoritmo de Huffman es un algoritmo para la construcción de códigos de Huffman, desarrollado por David A. Huffman en 1952. Este algoritmo toma un alfabeto de n símbolos, junto con sus frecuencias de aparición asociadas, y produce un código de Huffman para ese alfabeto y esas frecuencias. El algoritmo consiste en la creación de un árbol binario que tiene cada uno de los símbolos por hoja, y construido de tal forma que siguiéndolo desde la raíz a cada una de sus hojas se obtiene el código Huffman asociado.

- Se crean varios árboles, uno por cada uno de los símbolos del alfabeto, consistiendo cada uno de los árboles en un nodo sin hijos, y etiquetado cada uno con su símbolo asociado y su frecuencia de aparición.

- Se toman los dos árboles de menor frecuencia, y se unen creando un nuevo árbol. La etiqueta de la raíz será la suma de las frecuencias de las raíces de los dos árboles que se unen, y cada uno de estos

Page 2: MCOM1_U2_A2_CRAB

árboles será un hijo del nuevo árbol. También se etiquetan las dos ramas del nuevo árbol: con un 0 la de la izquierda, y con un 1 la de la derecha.

- Se repite el paso anterior hasta que sólo quede un árbol.

Con este árbol se puede conocer el código asociado a un símbolo, así como obtener el símbolo asociado a un determinado código. Para obtener el código asociado a un símbolo se debe proceder del siguiente modo:

- Comenzar con un código vacío.- Iniciar el recorrido del árbol en la hoja asociada al símbolo.- Comenzar un recorrido del árbol hacia arriba.- Cada vez que se suba un nivel, añadir al código la etiqueta de la rama que se ha recorrido.- Tras llegar a la raíz, invertir el código.- El resultado es el código Huffman deseado.

Para obtener un símbolo a partir de un código se debe hacer así:

- Comenzar el recorrido del árbol en la raíz de éste- Extraer el primer símbolo del código a descodificar- Descender por la rama etiquetada con ese símbolo

Un ejemplo de uso se ve ilustrado en la siguiente imagen:

La tabla describe el alfabeto a codificar, junto con las frecuencias de sus símbolos. En el gráfico se muestra el árbol construido a partir de este alfabeto siguiendo el algoritmo descrito. Se puede ver con facilidad cuál es el código del símbolo E: subiendo por el árbol se recorren ramas etiquetadas con 1, 1 y 0; por lo tanto, el código es 011. Para obtener el código de D se recorren las ramas 0, 1, 1 y 1, por lo que el código es 1110.

La operación inversa también es fácil de realizar: dado el código 10 se recorren desde la raíz las ramas 1 y 0, obteniéndose el símbolo C. Para descodificar 010 se recorren las ramas 0, 1 y 0, obteniéndose el símbolo A.