Está en la página 1de 49

2.

COMPRENSION DE DATOS

2.1. Tcnicas de compresin sin perdidas. Tcnicas de diccionario

Los mtodos de compresin estadsticos usan un modelo estadstico de datos, y la calidad del la compresin que pueden lograr depende de que tan bueno es el modelo. Los mtodos de comprensin basados en diccionario no usan estos modelos sino cdigos de tamao variable. Este mtodo selecciona cadenas de smbolos y codifica cada cadena como una ficha usando un diccionario. El diccionario retiene cadenas de smbolos los cuales pueden ser estticos o dinmicos (adaptativos). Lo anterior es permanente, algunas veces permitiendo la adicin de cadenas pero no la eliminacin, por lo cual la ultima cadena retenida, anteriormente encontrada en el flujo de entrada, permite la adicin o eliminacin de cadenas como nuevas entradas que empiezan a ser ledas. Un ejemplo simple de un diccionario esttico es un diccionario de la lengua Inglesa que se usa para comprimir texto en ingles. Imaginemos que este diccionario tiene quizs medio milln de palabras, sin sus definiciones. Una palabra (una cadena de smbolos terminados por un espacio o una marca de puntuacin) es leda desde el flujo de entrada y es buscado en el diccionario. Si una coincidencia es encontrada, un ndice del diccionario es escrito en la salida del flujo. Sino, la misma palabra sin comprimir es escrita. (Este es un ejemplo de una comprensin lgica). Como un resultado, el flujo de salida contiene ndices y palabras sin comprimir, y nosotros necesitamos distinguir unas de otras. Una manera de hacerlo es adicionando un bit en cada tem escrito. En principio, un ndice de 19 bits es suficiente para especificar un tem en unas 219 = 524.288 palabras de diccionario. De esta manera, cuando una coincidencia es encontrada, podemos escribir una smbolo de 20 bits, que consiste de una bit de bandera (talvez un cero) seguida por 19 bits del ndice. Cuando no se encuentran coincidencias, la bandera es puesta en 1, seguida por el tamao de la palabra no encontrada. Ejemplo 1: Asumiendo que la palabra bet es encontrada en la entrada 1025 del diccionario, esta es codificada con el nmero de 20 bits 0|0000000010000000001.asumiendo que la palabra xet no es encontrada, esta es codificada como 1|0000011|01111000|01100101|101110100. Esta es un nmero de 4 Bytes donde el campo del sptimo bit 0000011 indica que le siguen 3 Bytes ms.

Asumiendo que el tamao es escrito como un nmero de 7 bits, y este tiene un tamao promedio de 5 caracteres, una palabra sin comprimir ocupara, sobre el promedio, 6 Bytes (48 bits) en el flujo de salida. Lograr comprimir 48 bits en 20 es excelente, considerando que pase a menudo. De esta manera, se resuelve la pregunta: cuantas coincidencias son necesarias para lograr una compresin total?. Entonces podemos decir que la probabilidad de una coincidencia (que es el caso donde una palabra es encontrada en el diccionario) es P. antes de ser ledas y comprimidas N palabras, el tamao del flujo de salida puede ser: N[20P + 48(1-P)] = N[48 28P] bits

El tamao del flujo de entrada es (asumiendo 5 caracteres por palabra) 40N bits. La compresin es lograda cuando N[48-28P] < 40N, lo que implica que P> 0.29. Se necesita una tasa de coincidencia del 29% o mejor para lograr compresin. El problema se presenta cuando, por ejemplo, se analiza un archivo que contiene el cdigo fuente de un programa de computadora, donde pueden encontrarse palabras contradas del idioma ingles, las cuales no podran ser encontradas en el diccionario de Ingles. Entonces, no habra muchas coincidencias, resultando en una baja compresin. Esto muestra que un diccionario esttico no es una buena eleccin para un compresor de propsito general. Es preferible un mtodo basado en diccionario adaptativo, donde este podra empezar con un diccionario vaci o con un pequeo diccionario por defecto, que valla adicionando palabras a medida que las valla encontrando, y borrando cuando el diccionario sea muy grande, que significara una bsqueda lenta. Tal mtodo consiste en un bucle donde cada iteracin comienza por ser leda del flujo de entrada y desmenuzada en palabras o frases. Entonces debera buscar en el diccionario por cada palabra y, si encuentra una coincidencia, escribir un smbolo en el flujo de salida. De otra manera, la palabra sin comprimir podra ser escrita y tambin adicionada al diccionario. El ltimo paso en cada iteracin es revisar a ver si una vieja palabra puede ser eliminada del diccionario. Esto puede sonar complicado, pero tiene dos ventajas: 1. 2. Esto involucra bsqueda de cadenas y operaciones de ordenacin, en lugar de los cmputos numricos. El decodificador es simple (esto es conocido como mtodo de compresin asimtrico).

En los mtodos de compresin estticos, el decodificador es normalmente el opuesto exacto del codificador (compresin simtrica). En un mtodo de compresin adaptativo basado en

diccionario, el decodificador tiene que leer estos del flujo de entrada, determinando si el elemento actual es un smbolo o es un dato sin comprimir, usando los smbolos para obtener datos del diccionario, y poniendo finalmente a la salida datos sin comprimir. As no tiene que analizar el flujo de entrada de una manera compleja, y no tiene que hacer bsquedas en el diccionario para encontrar coincidencias. En los 70s Jacob Ziv y Abraham Lempel desarrollaron los primeros mtodos, el LZ77 y LZ78 para compresin basada en diccionario. Estas ideas fueron base para inspirar muchas investigaciones, que generalizadamente, mejoraron y se combinaron con RLE y mtodos estadsticos para conformar los mtodos mas usados para comprimir texto, imgenes y sonido.

2.1.1.1.Codificacin por longitudes en serie (RLE)

Los mtodos de compresin hasta el momento no tienen una aplicacin clara a la informtica, por lo que su valor en este documento es ms bien anecdtico e histrico. Un primer mtodo de compresin de aplicacin clara a la informtica se trata del sistema de compresin RLE o Run Length Encoding. La compresin RLE se basa en un principio sencillo e intuitivo que puede ser resumido como sigue: Si un smbolo cualquiera se repite n veces consecutivas en el flujo de entrada puede ser sustituido por la combinacin del smbolo en cuestin y el nmero de veces que se repite. Partiendo de esta idea tan sencilla es posible construir un compresor capaz de obtener resultados de cierta calidad, tanto en la compresin de texto como en la de imgenes. A continuacin se estudian ambas aplicaciones por separado La compresin RLE no es, en general, adecuada para la codificacin de textos. Sus particularidades dan lugar a problemas que difcilmente pueden ser resueltos obteniendo resultados satisfactorios.

Compresion de texto con RLE En primer lugar, se debe sealar que el mtodo RLE no se reduce a la sustitucin directa de los caracteres repetidos por el smbolo y el nmero de repeticiones, como pudiera pensarse en un principio. Ello dara lugar a interpretaciones ambiguas de la salida del compresor. Veamos un ejemplo:

Sea la cadena S = lleva_el_carro_en_2_minutos (| S | = 27). Sera errneo codificar S como S = 2leva_el_ca2ro_en_2_minutos. Lo mismo ocurre con S = l2eva_el_car2o_en_2_minutos. Resulta evidente que los nmeros pueden ser interpretados de forma incorrecta. De este ejemplo se puede extraer una primera conclusin: sera necesario algn carcter de escape que indique que los caracteres contiguos son especiales y representan una subcadena comprimida. Partiendo de la conclusin anterior, encontramos el segundo gran problema: la eleccin del carcter de escape. Es cierto que los textos en ingls o espaol no utilizan determinados caracteres del cdigo ASCII, por lo que se puede emplear alguno de estos smbolos. Sin embargo, si pensamos en otro tipo de textos, como el archivo generado por un compilador, encontraremos que esta situacin no se da, ya que cualquier carcter puede aparecer en el texto. De ah que seleccionar el carcter de escape puede no resultar posible. Encontramos, adems, un tercer inconveniente. Si bien es cierto que los textos en una determinada lengua permiten la seleccin de un carcter indicador de compresin, tambin lo es el hecho de que el lenguaje natural no suele incluir repeticiones consecutivas de caracteres de longitud mayor que dos. Qu sentido tiene entonces el uso de RLE en la compresin de textos? La respuesta es sencilla: prcticamente ninguno. Partiendo de las tres premisas planteadas, es obvio suponer que la aplicacin de esta forma de compresin en este tipo de situaciones es bastante reducida. Codificacin relativa Esta es una variante, que a veces se llama diferenciacin. Esta es usada en casos donde los datos a ser comprimidos consisten de una cadena de nmeros que no se diferencian mucho uno del otro, o en casos en donde este consiste de cadenas que son similares entre ellas. Un ejemplo prctico es la telemetra. En esta, un sensor es usado para recolectar informacin en determinados intervalos y transmite a una unidad central para iniciar un procesamiento. Como ejemplo se tiene los valores de temperatura tomados cada hora. Las muestras sucesivas de temperatura no varan mucho, con lo cual el sensor enva solo la informacin de la primera muestra, seguida de la diferencia. sea, si la temperatura fuera 70, 71, 72.5, 73.1 podra ser comprimida en 70, 1, 1.5, 0.6 Esto comprime la informacin, desde que las diferencias sean pequeas y puedan ser expresadas en pocos bits. Compresin RLE de imgenes

Centrmonos ahora en la compresin de grficos. Los mapas de bits, dada su naturaleza, son candidatos firmes a la aplicacin de RLE para su compresin. Un mapa de bits es una forma de representar una imagen en memoria como si de una matriz de puntos se tratara. Cada punto puede ocupar desde un bit (para imgenes monocromticas) hasta veinticuatro (imgenes en color verdadero). Esta representacin en forma de matriz, permite a un compresor RLE recorrer cada una de las filas de la imagen en busca de pxeles consecutivos de igual valor (del mismo color, a fin de cuentas). El rendimiento que ofrece RLE en este caso es bastante bueno, dado que las imgenes suelen contener franjas de igual color (siempre y cuando no se trate de imgenes generadas aleatriamente). La tasa de compresin que se obtiene depende de diversos factores. Los ms importantes son los siguientes (ntese que se trata de condiciones que se presentan habitualmente, aunque no tienen por qu darse siempre): La complejidad de la imagen. Cuanto ms detallada sea la imagen, menor ser la tasa de compresin que se obtenga, dado que un nivel de detalle elevado implica, generalmente, cambios de color.

- El nmero de colores de la imagen. Cuanto menor sea ste, mayor ser la probabilidad de que aparezcan zonas de igual color. Llegados a este punto, es un buen momento para presentar implementaciones de compresores RLE. Una posible implementacin apta para imgenes monocromticas consiste en la utilizacin de un nico byte para la representacin de cada franja. As, dado que el color del pxel puede ser representado con un nico bit, los siete restantes estarn disponibles para almacenar el nmero de pxeles consecutivos. As, se podra almacenar informacin de franjas de hasta 256 puntos. En todos los casos se almacenar dicho valor decrementado en una unidad (no tendra demasiado sentido almacenar informacin de una franja de tamao 0). La resolucin ser almacenada al principio del fichero. Suponiendo que el pxel encargado del color es el primero, podramos tener el siguiente ejemplo:

Suponiendo que la imagen propuesta tiene un tamao de 20 x 20 pxeles (el hecho de que aparezca con un tamao mayor se debe a que ha sido ampliada), por lo que se deduce que ocupa 400 bits, o lo que es lo mismo, 50 bytes (omitiendo la cabecera). Si aplicamos el sistema propuesto, obtendramos una salida como la siguiente: E3 63 E3 63 Como se puede apreciar, la imagen queda representada con slo 4 bytes. Es cierto que se trata de una imagen muy adecuada para la compresin propuesta, dado que est formada por lneas horizontales de igual color, pero representa un buen ejemplo de lo que RLE puede lograr. Dado que la interpretacin del ejemplo anterior es un poco confusa la interpretaremos. Los valores que forman la salida son codificaciones hexadecimales de los pares de valores (1 , 99) , (0 , 99) , (1 , 99) y (0 , 99). En cada uno de estos pares el primer valor representa el color (1 para el negro y 0 para el blanco); el segundo, por su parte, indica el nmero de repeticiones (decrementado en una unidad). Para codificar un par cualquiera pasaremos estos valores a formato binario: (110 , 9910) (010 , 9910) (12 , 11000112) (02 , 11000112)

Si concatenamos ambos valores, obtendremos la representacin binaria del nmero, que puede ser expresada en hexadecimal sin problema alguno: (12 , 11000112) (02 , 11000112) 111000112 011000112 22710 9910 E316 6316

El hecho de que los nmeros de repeticiones sean superiores al tamao de la fila no debe resultar extrao. Se debe a que la implementacin propuesta recorre todas las filas consecutivamente, como si se tratara de un vector unidimensional.

2.1.1.2.Codificacin LZW Este es una popular variante del metodo LZ78, desarrolado por Ferry Welch en 1984. Su principal caracterstica es la eliminacin del segundo campo de smbolo. Un smbolo LZW

consiste en solo un apuntador de diccionario. Para comprender mejor como funciona el LZW, debemos olvidar por un momento que el diccionario es un arbol, y pensar que este es un arreglo de cadenas de tamao variable. El metodo LZW comienza por ser inicializado con todos los smbolos del alfabeto. En el caso comn de smbolos de 8 bits, las primeras 256 entradas del diccionario (desde 0 hasta 255) son ocupadas antes de la entrada de cualquier dato. Dado que el diccionario ha sido inicializado, el siguiente carcter de entrada podr ser encontrado en el diccionario. Esto debido a que un smbolo LZW puede consistir de solo un apuntador y no tiene que contener un cdigo de carcter como en el LZ77 y LZ78. El LZW fue patentado y el uso de este requiere licencia. El principio del LZW es la codificacin de smbolos de entrada uno a uno y acumularlos en una cadena I. Posteriormente, cada smbolo es metido y concatenado con I, y el diccionario es buscado por la cadena I. Con tal de que I sea encontrado en e diccionario, el proceso continua. En un cierto punto se adiciona el siguiente smbolo x causando una bsqueda fallida; dado que la cadena I esta en el diccionario paro la cadena Ix (smbolo x concatenado con I) no esta. En este punto el codificador realiza las siguientes tareas: 1. Saca un puntero del diccionario que apunta a la cadena I. 2. Guarda la cadena Ix (la cual es llamada ahora una frase) en la proxima entrada disponible del diccionario. 3. Inicializa con la cadena I smbolo x. Ejemplo 1. Pala ilustrar este proceso utilizaremos la cadena sir_sid_eastman_easily_teases_sea_sick_seals. Y los pasos a seguir son: 1. 2. de texto

Inicializar las entradas 0-255 del diccionario con todos 256 bytes de 8 bits. el primer smbolo s es ingrsado y es encontrado en el diccionario ( en la entrada 115). El siguiente smbolo i es ingresado, pero si no es encontrado en el diccionario. El codificador realiza lo siguiente: 2.1. 2.2. 2.3. Saca 115 Guarda la cadena si en la siguiente entrada disponible(la 257). Inicializa I con el smbolo r.

La siguiente tabla muestra todos lo pasos de este proceso, donde los nmeros son las salidas y no las letras en parntesis: 115 (s), 105 (i), 114 (r), 32 ( _ ), 256 (si), 100 (d), 32 ( _ ) 101 (e), 97 (a), 115 (s),

116 (t), 109 (m), 97 (a), 110 (n), 262 ( _e), 264 (as), 105 (i), 108 (l), 121 (y), 32 ( _ ) 116 (t), 263 (ea), 115 (s), 101 (e), 115 (s), 259 ( _s), 263 (ea), 259 ( _s), 105 (i), 99 (c), 107 (k), 280 ( _se), 97 (a), 108 (l), 115 (s).

I s si i ir r R_ _ _s s si sid d D_ _ _e e ea a as s st t tm m ma a an n N_ _ _e

En el diccionario ? SI NO SI NO SI NO SI NO SI SI NO SI NO SI NO SI NO SI NO SI NO SI NO SI NO SI NO SI NO SI SI

Nueva entrada 256 - si 257 - sir 258 - r_ 259 - _s

Salida

I y y_ _ _t t te e ea eas s se e es s s_ _ _s _se e ea ea_ _ _s _si i ic c ck k k_ _

115 (s) 105 (i) 114 (r) 32( _ )

260 - sid 261 - d_ 262 - _e 263 - ea 264 - as 265 - st 266 - tm 267 - ma 268 - an 269 - n_

256 (si) 100 (d) 32 ( _ ) 101 (e) 97 (a) 115 (s) 116 (t) 109 (m) 97 (a) 110 (n)

En el diccionario ? SI NO SI NO SI NO SI SI NO SI NO SI NO SI NO SI SI NO SI SI NO SI SI NO SI NO SI NO SI NO SI

Nueva entrada 274 - y_ 275 - _t 276 - te

Salida

121 (y) 32 ( _ ) 116 (t)

277 - eas 278 - se 279 - es 280 - s_

263 (ea) 115 (s) 101 (e) 115 (s)

281 - _se

259 ( _s)

282 - ea_

263 (ea)

283 - _si 284 - ic 285 - ck 286 - k_

259 ( _s) 105 (i) 99 (c) 107 (k)

_ea a as asi i il l ly

NO SI SI NO SI NO SI NO

270 - _ea

262 ( _e)

271 - asi 272 - il 273 - ly

264 (as) 105 (i) 108 (l)

_s _se _sea a al l ls s s, siguien t

SI SI NO SI NO SI NO SI NO

287 - _sea 288 - al 289 - ls

281 ( _se) 97 (a) 108 (l)

115 (s)

Las entradas de un diccionario LZW se veran as: 0 1 ... 32 ... 97 98 99 100 101 ... 107 108 109 NULL SOH SP a b c d e k l m 110 115 116 121 255 256 257 258 259 260 261 n s t y 255 si ir r_ _s sid d_ 262 263 264 265 266 267 268 269 270 271 272 273 274 275 _e ea as st tm ma an n_ _ea asi il ly y_ _t 276 277 278 279 280 281 282 283 284 285 286 287 288 289 te eas Se Es s_ _se ea_ _si Ic Ck k_ _sea Al Ls

Decodificador LZW El decodificador comienza con las primeras entradas del diccionario inicializado con todos los smbolos del alfabeto (normalmente 256 smbolos). Este entonces los lee del flujo de entrada (el cual consta de punteros de diccionario) y usa cada puntero para recuperar los smbolos sin comprimir desde este diccionario y escribirlos en su flujo de salida. Tambin construye su diccionario de la misma forma que el codificador. Generalmente se le dice que el codificador y el decodificador estn sincronizados, o trabajan en llave).

En el primer paso de decodificacin, el decodificador ingresa el primer apuntador y usa este para permitir un diccionario del elemento I. Este es una cadena de smbolos, y es escrita en el flujo de salida de del decodificador. La cadena Ix necesita ser guardada en el diccionario, pero el smbolo x es todava desconocido; y se convierte en el primer smbolo en la siguiente cadena recuperada desde el diccionario. En cada paso de la decodificacin, el decodificador ingresa el apuntador siguiente, recuperando la siguiente cadena J desde el diccionario, escribindola en el flujo de salida, separando de este el primer smbolo x y guardando la cadena Ix en la siguiente entrada de diccionario disponible (despus de comprobar que se ha hecho correctamente la cadena Ix y que no esta en el diccionario). El decodificador entonces mueve J a I y esta lista para el siguiente paso. En el ejemplo anterior sir_sid, el primer puntero que ingreso el codificador es 115. Este corresponde a la cadena s, la cual es recuperada desde el diccionario, se guarda en I y llega a ser la primera cosa escrita en el flujo de salida del decodificador. El siguiente apuntador es 105, de manera que la cadena i es recuperada desde J y tambin es escrita en el flujo de salida. El primer smbolo de J es concatenado con I, para formar la cadena si la cual no existe en el diccionario, y por tanto es adicionada como la entrada 256. La variable J es movida a I, entonces I es ahora la cadena i. 2.1.2. METODOS ESTADISTICOS Los mtodos estadsticos en lugar de asignar cdigos de igual tamao a los diferentes smbolos (pxeles o caracteres), operan con cdigos de tamao variable dependiendo de la frecuencia de aparicin de los diferentes smbolos dentro del mensaje; es decir, cuando algn smbolo se repite a menudo, el mtodo le asigna un cdigo pequeo; por otro lado, si este smbolo no es tan frecuente dentro del mensaje, el mtodo le asignar un cdigo de mayor longitud. El gran reto de disear cdigos de tamao variable se puede puntualizar de la siguiente manera. 1) Asignar a los smbolos (pxeles o caracteres) cdigos que puedan ser decodificados sin causar ambigedad. 2) Asignar cdigos con el mnimo tamao promedio esto con el fin de que tenga sentido la compresin que se est intentando lograr. Una primera implementacin de estos cdigos los podemos apreciar en el Cdigo Morse, desarrollado por Samuel Morse para su aplicacin en el Telgrafo.

Es indispensable tener en cuenta los conceptos bsicos de la teora de la informacin anteriormente expuestos, ya que estos nos permitirn observar por ejemplo cuanta redundancia ha sido reducida del mensaje, acordmonos tambin que este es uno de los objetivos de la compresin, reducir la redundancia de un mensaje. La importancia de la teora de la informacin es que permite precisamente cuantificarla. Nos muestra como medir la informacin, con lo cual podemos saber que tanta novedad hay dentro de un mensaje, pero aqu hay que tener algo muy claro, y es que la informacin no es todo lo que nos llega a travs de nuestros sentidos, es decir si por ejemplo nos dicen que el perro es un mamfero, seguramente no nos sorprender cuando oigamos tal afirmacin ya que conocamos este dato de antemano, sin embargo si nos dicen que existen los apcrifos que son versculos no reconocidos por la iglesia, nos sorprender ya que es algo que no conocamos y que representa algo nuevo para nosotros, es informacin!!. No es necesario entrar de fondo con toda la teora matemtica, ya que nuestro principal objetivo es proporcionarle un grado de entendimiento que le permita posteriormente entender a que se refiere todo el silogismo que la teora matemtica representa. Si algn tipo de noticia nueva llega a nuestros odos y el tema del que trata es desconocido por nosotros, pero nos es de gran inters, entonces comenzarn a aparecer una gran cantidad de preguntas a las que desearemos dar respuesta para lograr apoderarnos del tema y tambin transmitirlo a otras personas. Dependiendo de la cantidad de preguntas que podamos formular sobre el tema de inters para poder entenderlo, es que se sabe nuestro grado de profundidad o conocimiento en el tema y por tanto se puede saber el grado de informacin que representa esta noticia para nosotros. Esto queda claro cuando miramos noticias en la TV. y miramos un reportaje de un suceso del da en un canal, seguramente nos sorprender pues es algo nuevo, pero cuando vemos la misma noticia a otra hora, ya nos interesar tanto pues ya no representa informacin nueva para nosotros. Ya apoderndonos un poco ms del tema, tomaremos el ejemplo de una baraja de 64 cartas. Si le solicito que tome una carta de una baraja sin mirar su valor, que posteriormente me la muestre y por ltimo le solicito me diga que carta fue la que retir, a menos que usted sea un mentalista o que sea su da de suerte no sabr su valor, y entonces para usted las cosas se vuelven complicadas. Estara dispuesto a apostar US$100 por adivinar la carta? La posibilidad de adivinar la carta est en 1 de 64 (cantidad de cartas en la baraja). Si le permito que me realice preguntas para conseguir saber el valor de la carta le estar facilitando la labor. El hecho ahora es saber cuales y cuantas preguntas seran necesarias para que lograra por fin llegar a conocer el valor cuanto conocimiento tengo que adquirir para saber algo.

Comentario [VEDR1]: De alguna forma encadenar este comentario con la teora de la informacin que GEO ya ha expuesto.

Un mtodo para adivinar la carta sera dividir el rango en dos, es decir, tomo un conjunto de cartas de la siguiente forma. Grupo A de (1 - 32) Grupo B de (33 64)

Ahora preguntara si la carta est en el grupo A. Si no es as entonces obviamente se encontrar en B. Ahora siguiendo el mismo mtodo divido el grupo B en dos como sigue. Grupo BA de (33 48) Grupo BB de (49 64)

Realizo la misma pregunta pero ahora haciendo referencia a estos dos nuevos grupos. La carta est en el grupo BA? Si no es as, por supuesto que estar en BB. Este proceso se repetir hasta que los conjuntos se reduzcan a un solo smbolo y de esta forma llegue a conocer el valor de la carta. Para este ejemplo lleva exactamente hacer seis preguntas para conocer la respuesta. Esto es porque 6 veces hay que dividir el nmero 64 para obtener un nico smbolo, el cual me lleva a la solucin. Matemticamente esto equivale a escribir 6 = log 2 64 Esta es la razn por la que un logaritmo es la funcin que cuantifica a la informacin. Cuanta informacin tuvo que adquirir usted para lograr entender la integral
x3 3

2 x =

De antemano tuvo que tomar en la escuela clases de aritmtica para entrar en el mundo matemtico, luego ver algebra para poder entender el significado de las variables y los smbolos y las operaciones que se pueden hacer entre estas haciendo uso de la aritmtica que aprendi en la escuela para de esta forma lograr un grado de abstraccin ms profundo. Posteriormente tuvo que aprender lgica de conjuntos para ver cosas de su vida diaria un perro, una moneda, una flor, etc. representadas en variables y smbolos; para por ltimo, entrar en el mundo del clculo, algo ms abstracto todava. Le aseguro que entender clculo sin toda esa informacin contenida de antemano en su saber sera algo muy complicado y en ocasiones hasta imposible de lograr.

Ahora vamos un poco ms all y entremos ms en el tema de este curso. Tenemos un transmisor que enva datos por un canal de transmisin. Tales datos son una cadena de n smbolos desde a1 hasta a n . Cada juego de tales smbolos compone un alfabeto, el alfabeto de n-smbolos. Alfabeto = ( a1 , a 2 , a3 ,..., a n )
Puesto que hay n smbolos en el alfabeto, podemos pensar que cada uno de estos smbolos se encuentra en base n. As por ejemplo nuestro sistema natural es el decimal (base 10) pues aprendimos a contar hasta diez por la misma cantidad de dedos (10 smbolos) que hay en nuestras manos. Por lo tanto cualquier nmero de este sistema tal como el 7 se encuentra en base diez. En el caso de nuestros n smbolos, el hecho de que su base sea n, se puede representar como log 2 n bits. Si un transmisor toma 1 unidades de tiempo para transmitir un simple smbolo, entonces, s la velocidad de transmisin es s smbolos por unidad de tiempo. Aterrizando un poco ms este concepto tomemos un ejemplo comn, consideremos una velocidad de transmisin conocida por nosotros y la llamaremos s donde s = 9600 baudios (un baudio es el trmino para bits por segundo). De acuerdo a lo expuesto hasta ahora, en una unidad de tiempo el transmisor puede enviar

s smbolos con una determinada cantidad de informacin log2n esto se puede


compactar dentro de una funcin matemtica como sigue.

H = s log 2 n (1.1)
Que quiere decir que se transmite cierta cantidad de informacin ( log 2 n ), medida en bits y enviada en una determinada unidad de tiempo (s). La transmisin de datos tiene una peculiaridad y es que los smbolos se presentan por lo general de una forma no determinista y por lo tanto para poder seguir evaluando lo hecho hasta el momento, la cantidad de informacin es necesario hacer uso de las probabilidades y por lo tanto de la frecuencia de ocurrencia de los n smbolos. Para obtener una frmula que nos exprese ahora la cantidad de informacin en funcin de la frecuencia de ocurrencia de cada smbolo (su probabilidad) asumiremos el caso ideal en el que cada smbolo ai tiene una probabilidad de ocurrencia conocida de antemano Pi. La suma de las probabilidades individuales ser igual a 1, como se aprecia a continuacin. P1 + P2 + P3 + ... + Pn = 1 (1.2)

En este caso Pi = P ya que todas tienen la misma probabilidad y 1 = Pi = nP , lo que

implica que P = 1 / n
Este ltimo resultado lo podemos utilizar para reemplazar en la ecuacin 1.1 de la siguiente manera. H = s log 2 n = s log 2 ( 1 ) = s log 2 P (1.3) P

En general, las probabilidades son diferentes, ya habamos comentado que el hecho de que sean iguales aqu solo tena como objetivo realizar una formulacin general e ilustrativa. Por lo tanto es ahora nuestro deseo poder representar a H en torno a esta naturaleza probabilstica tan poco uniforme como la que presentan nuestros smbolos. Si tomamos un smbolo ai con una probabilidad de ocurrencia de Pi es decir, una fraccin dentro del tiempo total del dato, entonces podemos formular su ocurrencia como el promedio sPi de veces por unidad de tiempo, de modo que su contribucin a H es de s Pi log 2 Pi . La suma de todas las contribuciones de los n smbolos a H se muestra a continuacin

H = s 1 Pi log 2 Pi (1.4)
n

Es importante recordar que H es la cantidad de informacin dentro de los bits enviados por el transmisor en una unidad de tiempo Que tanto de lo que nos dicen es nuevo para nosotros y que tanto son datos que ya conocamos. La cantidad de informacin contenida en un smbolo de base n se puede definir como: H (Donde 1/s es el tiempo para transmitir un smbolo) s Esta cantidad recibe el nombre de ENTROPIA del dato que es transmitido. Esto tambin se puede definir de la siguiente forma. 1) H = s 1 Pi log 2 Pi
n

H s Por lo tanto al reemplazar en la expresin 2 con la 1 se obtiene la entropa del dato.

2)

3) ENTROPIA =

s i Pi log 2 Pi
n

1 Pi log 2 Pi (1.5)
n

Como observamos la entropa de un dato es la suma de las probabilidades de cada uno de sus ai smbolos por lo tanto la entropa de un solo smbolo ser. 4) ENTROPIAai = Pi log 2 Pi (1.6)

2.1.2.1.Cdigos de tamao variable

Consideremos cuatro smbolos, a1 , a 2 , a3 y a 4 . Si ellos aparecen en nuestra cadena de datos con iguales probabilidades (= 0.25), entonces la entropa de los datos de acuerdo a la ecuacin 1.5 es 4(0.25 log 2 0.25) = 2 . Dos son el nmero de bits ms pequeo necesarios, sobre el promedio para representar en este caso a cada smbolo. Nosotros podemos simplificar asignando a nuestros smbolos los cuatro cdigos dibits 2bits 00, 01, 10 y 11. Ya que las probabilidades son iguales, la redundancia es cero y el dato no puede ser comprimido por debajo de 2 bits/smbolo.
A continuacin consideremos un caso ms real en donde los cuatro smbolos ocurren con diferentes probabilidades tal y como se aprecia en la siguiente tabla.

SIMBOLO a1 a2 a3

PROBABILIDAD .49 .25 .25


.01
Tabla 2.1

CODIGO1 1 01 010
001

CODIGO2 1 01 000
001

a4

Aqu se observa que a1 aparece en el dato (sobre el promedio de los dems) alrededor de la mitad del tiempo, a 2 y a3 tienen igual probabilidad y a 4 no es tan frecuente. En este caso, el dato tiene entropa igual a la siguiente.
(0.49 log2 0.49 + 0.25 log2 0.25 + 0.25log2 0.25 + 0.01log2 0.01) (0.050 0.5 0.5 0.066) = 1.57

El nmero ms pequeo de bits necesarios, sobre el promedio, para representar cada smbolo es 1.57. Si nuevamente asignamos a nuestros smbolos los cuatro cdigos dibits 00, 01, 10 y 11, la redundancia podra ser R = 1.57 + log 2 4 = 0.43 . Esto sugiere asignar cdigos de tamao variable a los smbolos. El cdigo 1 de la tabla es designado como el smbolo ms comn y se lo asignamos al smbolo a1 como el cdigo ms corto. Cuando una cadena de datos

larga es transmitida usando el cdigo1, el tamao promedio (es decir el nmero de bits por smbolo) es como sigue. 1 0.49 + 2 0.25 + 3 0.25 + 3 0.01 = 1.77 El cual es muy cercano al mnimo. La redundancia en este caso es.

R = 1.77 1.57 = 0.2 bits por smbolo.


Un interesante ejemplo es la siguiente cadena de 20 smbolos en donde se aprecia como cada uno de los cuatro smbolos ocurre con alta frecuencia dentro del dato.

a1 a3 a 2 a1 a3 a3 a 4 a 2 a1 a1 a 2 a 2 a1 a1 a3 a1 a1 a 2 a3 a1
Codificando esta cadena de acuerdo al cdigo 1 de la tabla 2.1 se produce un campo de 37 bits como se observa a continuacin. 1-010-01-1-010-010-001-01-1-1-01-01-1-1-010-1-1-01-010-1. Usando 37 bits para codificar 20 campos de smbolos se obtiene un promedio de 1.85 bits/smbolo, no tan lejano al tamao promedio calculado. Usted pensar que los ejemplos aqu expuestos son demasiados cortos comparado con la realidad. Para obtener mejores resultados, es necesaria una cadena de entrada de al menos miles de smbolos. No obstante cuando intentemos decodificar la anterior cadena, nos encontraremos con que el cdigo 1 de la tabla 2.1 no es en realidad tan bueno como se observar a continuacin. El primer bit es un 1, y nicamente a1 tiene asignado este cdigo, este ( a1 ) debe ser el primer smbolo. El siguiente bit es 0, pero tanto el cdigo a 2 , a3 como el a 4 empiezan con 0, de manera que el decodificador tiene que leer el siguiente bit. Este es 1, pero el cdigo tanto de a 2 como el de a 2 empiezan con 01. Por lo tanto el decodificador no conocer si la cadena es 1-010-01 el cual corresponde a a1 a3 a 2 o es 1-01-001 para el caso de

a1 a 2 a 4 . En este caso el Cdigo1 es ambiguo. En contraste, el Cdigo2, que tiene el mismo tamao promedio como el Cdigo1, puede realizar la decodificacin de forma inambigua.
La propiedad del Cdigo2 que hace que este sea mucho mejor que el Cdigo1 es llamada propiedad prefija. Esta propiedad requiere que una vez un cierto patrn de bit se ha asignado como cdigo de un smbolo, ningn otro cdigo podra empezar con este patrn. Una vez la cadena 1 ha sido asignada como el cdigo de a1 , ningn otro cdigo puede empezar con 1; en este caso, todos ellos tienen que empezar con 0. Una vez que 01 fue

asignado al smbolo a 2 , ningn otro cdigo puede empezar con 01, por tal razn los cdigos a3 y a 4 empiezan con 000 y 001 respectivamente. El diseo de cdigos de tamao variable deben seguir los dos siguientes principios. 1) Asignar nmeros cortos a los smbolos de ms alta frecuencia. 2) Respetar el prefijo de propiedad. Siguiendo estos principios se producen cdigos cortos e inambiguos, pero no necesariamente los mejores. Adicionalmente, un algoritmo necesita producir una coleccin de cdigos cortos (algunos de estos con el mnimo tamao promedio posible). La nica forma para acceder a tal algoritmo por parte del smbolo es su frecuencia (o la probabilidad). Dos de tales algoritmos son el mtodo Shannon-Fano y el mtodo Huffman, los cuales son utilizados junto con sus variantes, como mtodos de compresin de video como se ver ms adelante en este curso.

2.1.2.2.Cdigo prefijo
Un cdigo prefijo es un cdigo de tamao variable que satisface la propiedad del prefijo. Contrario a esta observacin tenemos la representacin binaria de los enteros la cual no satisface la propiedad del prefijo. Otra desventaja de esta representacin es que el tamao n del conjunto de enteros ha de ser conocida de antemano, ya que esto determina el tamao del cdigo, que es 1 + [log 2 n] .

2.1.2.3.El cdigo Unario


El cdigo unario de un entero no negativo es n el cual es definido como n-1 unos seguido por un 0 tal como se aprecia en la siguiente tabla

N 1 2 3 4 5

CODIGO 0 10 110 1110 11110


Tabla 2.2

CODIGO ALT. 1 01 001 0001 00001

De igual forma es posible obtener un cdigo en el cual se insertan n-1 ceros seguidos por un 1. La longitud de un cdigo unario para un entero n son sus n bits, observar como se cumple esto por ejemplo para el nmero 5 de la tabla 2.2. Es posible definir un cdigo unario general, tambin conocido como cdigo start-stepstop. Tal cdigo depende de una tripleta (inicio, paso, parada) de parmetros y es definido como sigue: 1) Las palabras cdigo son creadas para codificar smbolos usados en el dato, tal que la n-esima palabra cdigo consiste de unos, seguida por un cero 0, seguida por todas las combinaciones de a bits donde a = start + n step . 2) Si a = stop , entonces el simple cero que precede los a bits es eliminado. El nmero de cdigos para una tripleta dada es finito y depende de la escogencia de los parmetros. Las dos siguiente tablas muestran los cdigos 680 de (3, 2, 9) y los cdigos 2044 de (2, 1,10).

N
0 1 2 3

a= 3+nx2 3 5 7 9

n-esima Palabra cdigo 0xxx 10xxxxx 110xxxxxxx 111xxxxxxxxx Total


Tabla 2.4

Nmero de Palabras cdigo 23 = 8 2 5 = 32 2 7 = 128 2 9 = 512 680

Rango de Enteros 0-7 8-39 40-167 168-679

N
0 1 2 3 8

a= 2+nx1 2 3 4 5 10

n-esima Palabra cdigo 0xx 10xxx 110xxxx 111xxxxx 11111111xxxxxxxxxx Total


Tabla 2.5

Nmero de Palabras cdigo 4 8 16 32


1024 2044

Rango de Enteros 0-3 4-11 12-27 28-59 1020-2044

El nmero de cdigos unarios generales diferentes es 2 stop + step 2 start 2 step 1 Aqu se puede apreciar que esta expresin se incrementa exponencialmente con los parmetros stop, de modo que conjuntos extensos de estos cdigos se pueden generar con pequeos valores de estos tres parmetros.

2.1.2.4.Codificacin SHANNON-FANO
La codificacin Shannon-Fano fue el primer mtodo desarrollado para encontrar buenos cdigos de tamao variable. Nosotros empezaremos con un juego de n smbolos con probabilidad (o frecuencia) conocida de ocurrencia. Los smbolos se disponen en orden descendente a sus probabilidades. El conjunto de smbolos es entonces dividido dentro de dos subconjuntos que tienen la misma (o casi la misma) probabilidad. Todos los smbolos en un subconjunto obtienen cdigos asignados que empiezan con cero, mientras los cdigos de los smbolos en el otro subconjunto empiezan con 1. Cada subconjunto es entonces consecutivamente dividido en dos, y en donde el segundo bit de todos los cdigos es determinado de forma similar. Cuando un subconjunto contiene justamente dos smbolos, sus cdigos son distinguidos al agregrseles uno o ms bits a cada uno. El proceso continua hasta que no queden ms subconjuntos por realizrsele este proceso. La siguiente tabla ilustra el proceso de codificacin de Shannon-Fano para un alfabeto de siete smbolos. Aqu hay que notar que los smbolos como tal no son mostrados, sino solamente sus probabilidades.

Tabla 2.6

Haciendo uso de la tabla 2.6 a continuacin relacionaremos los pasos a seguir para realizar la codificacin de un mensaje por medio del mtodo de Shannon-Fanon. 1) El primer paso consiste en separar el juego de siete smbolos dentro de dos subconjuntos, el primero con dos smbolos y una probabilidad total de 0.45, el segundo con los restante cinco smbolos y una probabilidad del 55%. El objetivo de aqu en adelante ser dividir en dos subconjuntos lo ms parejos posibles en probabilidad, (si se pudiera obtener dos subconjuntos del 50% de probabilidad sera lo preferible) pero manteniendo por un lado smbolos de alta probabilidad con smbolos tambin de alta probabilidad, y por el otro smbolos de baja prioridad con smbolos similares. 2) Los dos smbolos en el primer subconjunto se les asigna un cdigo que empieza con 1 indicando mayor probabilidad que el segundo subconjunto seguido por un bit que puede ser 1 o 0 dependiendo de cual de los dos bits posee la mayor probabilidad de ocurrencia. 3) El segundo subconjunto es dividido en este tercer paso en dos, donde el primer subconjunto lo conforman los smbolos con una probabilidad total de 0.3 y cdigos que empiezan con 01, mientras que el segundo subconjunto lo conforman los otros tres smbolos con probabilidad total de 0.25 y cdigos que empiezan por 00. De igual forma al objetivo planteado en el primer paso se procede de la misma forma en este punto. 4) El paso cuatro divide los tres ltimos smbolos en dos subconjuntos ms. El primero con tan solo un smbolo (y una probabilidad de 0.1 y cdigo final 001) y el segundo subconjunto con dos smbolos (con una probabilidad de 0.15 y cdigos finales 0001 y 0000 para los smbolos de mayor y menor probabilidad respectivamente entre ellos). El tamao promedio de este cdigo se aprecia a continuacin. Se encuentra al observar las dos tablas que el resultado del ejercicio no es bueno comparado con el obtenido en el ejemplo, lo cual indica que entre mejor sea la divisin realizada entre los smbolos, mejores resultados se obtendrn y esto se logra cuando la divisin es lo ms pareja posible. Cuando los dos subconjuntos iniciales tienen la misma proporcin se produce un cdigo con el mnimo tamao promedio (una redundancia de cero). Este tamao promedio se obtiene de la siguiente forma. 0.25 2 + 0.25 2 + 0.125 3 + 0.125 3 + 0.125 3 + 0.125 3 = 2.5bits / smbolo Lo cual es idntico a la entropa. Esto significa que este es el tamao promedio mnimo terico.
(0.25 log 2 0.25 + 0.20 log 2 0.20 + 0.15 log 2 0.15 + 0.15 log 2 0.15 + 0.10 log 2 0.10 + 0.10 log 2 0.10 + 0.05 log 2 0.05) 2.67

La conclusin es que este mtodo produce mejores resultados cuando el smbolo tiene probabilidades de ocurrencia que son potencias de dos 2.

2.1.2.5.Codificacin de HUFFMAN
Es un mtodo comnmente usado para la compresin de datos. Este sirve como base para varios programas populares usados en computadoras personales. Algunos programas utilizan este mtodo como uno de los pasos dentro de un proceso de compresin de multipasos. El mtodo Huffman es algo similar al mtodo Shannon-Fano. La principal diferencia entre los dos mtodos es que Shannon-Fano construye sus cdigos de arriba a abajo (desde los bits menos significativos a los ms significativos), mientras que Fuffman construye un rbol de cdigo desde abajo hacia arriba (construyendo los cdigos desde la derecha hasta la izquierda). El mtodo comienza construyendo una lista de todos los smbolos alfabticos en orden descendiente de acuerdo a sus probabilidades. Este entonces construye un arbol, con un smbolo en cada hoja desde abajo hacia arriba. Esto es realizado en pasos, donde a cada paso los dos smbolos con la ms pequea probabilidad son seleccionados, agregados al tope del rbol parcial, eliminados desde la lista, y reemplazados con un smbolo auxiliar que representa a ambos. Cuando la lista es reducida a justamente un smbolo auxiliar (representando al alfabeto entero), entonces el rbol se encontrar completo. El rbol es entonces recorrido para determinar los cdigos de los smbolos. Claramente es mejor ilustrarlo con un ejemplo. Dado cinco smbolos con probabilidades como las mostradas en la siguiente figura.
1.0

a1

a1

0.4
1

0 a12345 1

a 2 0.2 a3
0.2 1
1

a2345 0

0.6

0.4 a345 0 a45

a 4 0.1
0.2

a5

0.1

Figura 2.1

Ellos son emparejados en el siguiente orden. 1) El smbolo a 4 es combinado con a 5 y ambos son reemplazados por la combinacin del smbolo a 45 , cuya probabilidad es de 0.2 2) Hay ahora cuatro smbolos con las siguientes probabilidades respectivas, a1 de 0.4, a 2 y a3 con 0.2 y por ltimo a 45 con 0.2. Arbitrariamente seleccionamos a3 y a 45 , combinndolos y reemplazndolos con un smbolo auxiliar a 345 , cuya probabilidad conjunta es de 0.4. 3) Ahora hay tres smbolos a1 , a 2 y a 345 , con probabilidades respectivas de 0.4, 0.2 y 0.4. Arbitrariamente se selecciona a 2 y a 345 , combinndolos y reemplazndolos con el smbolo auxiliar a 2345 cuya probabilidad es de 0.6. 4) Finalmente, combinamos los dos smbolos restantes, a1 y a 2345 , y reemplazndolos con a 12345 la cual tiene una probabilidad final de 1. El rbol ahora se encuentra completo. Este se muestra en la figura 2.1 con la raz sobre la derecha y las hojas en la izquierda. Para asignar los cdigos, arbitrariamente asignamos a un bit un 1 para el tope superior y un 0 para la parte inferior, de cada par de lmites. Esto resulta en los cdigos 0, 10, 111, 1101, y 1100. La asignacin de los bits en el lmite es arbitraria. El tamao promedio de este cdigo se aprecia a continuacin. 0.4 1 + 0.2 2 + 0.2 3 + 0.1 4 + 0.1 4 = 0.22bits / smbolo Pero lo ms importante es que el cdigo Huffman no es nico. Algunos de los pasos anteriormente mencionados de este cdigo, fueron escogidos arbitrariamente, desde que hubiese ms de dos smbolos con pequeas probabilidades. La siguiente figura ilustra como el mismo ejemplo se puede obtener de otra forma combinando de distintas maneras los smbolos.

a1

0.4

1 a145 0

0.6
1

1.0
a2

0.2

1 0 a23 0.

a3 0.2 0

1
a4

0.1
a45

0.2
a5

0.1

Figura 2.2

El cdigo de Huffman para este caso es 11, 01, 00, 101, y 100. El tamao promedio de este cdigo es
0.4 2 + 0.2 2 + 0.2 2 + 0.1 3 + 0.1 3 = 0.22bits / smbolo

Lo mismo que en el cdigo anterior. Con relacin a que las decisiones arbitrarias hechas en la construccin del rbol de Huffman afectan solo a los cdigos individuales pero no al tamao promedio del cdigo. Todava nos queda por responder una obvia pregunta: Cul es el mejor de los diferentes cdigos Huffman que se pueden generar para un conjunto determinado de smbolos? La respuesta no es menos obvia, pero es simple: El cdigo con la ms pequea varianza. La varianza de un cdigo mide cuanto el tamao del cdigo individual se desva con respecto al tamao promedio. La varianza de los dos cdigos del ejemplo anterior se muestra a continuacin. 0.4(1 2.2) 2 + 0.2( 2 2.2) 2 + 0.2(3 2.2) 2 + 0.1( 4 2.2) 2 + 0.1( 4 2.2) 2 = 1.36 La cual es la varianza para el primer cdigo. Para el segundo cdigo se procede as. 0.4( 2 2.2) 2 + 0.2( 2 2.2) 2 + 0.2( 2 2.2) 2 + 0.1(3 2.2) 2 + 0.1(3 2.2) 2 = 0.16 El segundo cdigo es preferible. Una detenida mirada a los cdigos nos permitir observar cual cdigo seleccionar. En el rbol del primer cdigo el smbolo a 45 es combinado con a3 , mientras que en el rbol de segundo cdigo es combinado con a1 .

La regla es: Cuando en el camino de codificacin dentro del rbol que est construyendo se encuentre con que hay ms de dos nodos con probabilidad pequea, seleccione uno de estos y combnelo con uno de alta probabilidad. Esta combinacin de smbolos de baja probabilidad con otros de alta, reducir la varianza total de cdigo.
Si el codificador simplemente escribe el flujo comprimido sobre un archivo, la varianza del cdigo no hace diferencia. Un cdigo Huffman de pequea varianza es preferible nicamente en casos donde el codificador transmite el flujo comprimido tal como este es generado, sobre la lnea de comunicaciones.

En tal caso, un cdigo con gran varianza causa al codificador que genere bits a una taza que varia todo el tiempo. Puesto que los bits tienen que ser transmitidos a una taza constante, entonces el codificador tendr que usar un buffer para depositar los bits que varan su rata con el tiempo. Los bits del flujo comprimido son introducidos dentro del buffer tal cual como son generados y posteriormente son sacados a una velocidad constante, para ser transmitidos. De esta forma es fcil observar que un cdigo Huffman con cero varianza depositar bits dentro del buffer a una taza constante de modo que tan solo se necesitar un buffer pequeo. A mayor varianza de cdigo, menor ser la constante de la taza a la que los bits entran al buffer, requiriendo que el codificador utilice un buffer de mayor capacidad.

.025 .010 .020 .005


.010 Figura 2.3

.045

2.1.2.6.Decodificacin Huffman
Antes de empezar la compresin de cadenas de datos, el compresor (codificador) tiene que determinar el cdigo. Hace esto basado en las probabilidades (o frecuencia de ocurrencia) de los smbolos. Las probabilidades o frecuencias han de aparecer sobre el flujo comprimido para que cualquier descompresor de Huffman fuera capaz de descomprimir la cadena. Esto es fcil desde que las frecuencias sean enteras y las probabilidades puedan ser escritas como una escala de enteros. Este normalmente agrega unos cientos de bytes a la cadena comprimida. Tambin es posible que se escribiesen cdigos de tamao variable sobre la cadena, pero esto puede ser embarazoso, ya que los cdigos tienen diferentes tamaos. Tambin es posible escribir el rbol de Huffman sobre el flujo, pero esta forma puede ser ms larga que las frecuencias.

En cualquier caso el decodificador debe conocer como empieza el flujo, leyendo este, y construyendo el rbol de Huffman para el alfabeto. Slo de esta manera este puede leer y decodificar el resto del flujo. El algoritmo para decodificar es simple. Empieza con la raz y lee el primer bit fuera de la cadena comprimida. Si es cero, lo conduce al lmite inferior del rbol; si es un uno lo conduce al lmite superior. Cuando el decodificador obtiene una hoja, este encuentra el cdigo original descomprimido del smbolo (Normalmente un cdigo ASCII), y este es entonces el cdigo emitido por el decodificador. El proceso empieza de nuevo en la raz con el prximo bit. El anterior proceso lo ilustraremos en la siguiente figura.

Figura 2.4

Este proceso es ilustrado para un alfabeto de cinco smbolos. La cadena de entrada solo utiliza cuatro de los cinco smbolos posibles, a 4 a 2 a 5 a1 los cuales son codificados como 1001100110. El decodificador empieza en la raz, leyendo el primer bit 1 y sube. El segundo bit que es un cero 0 lo enva hacia abajo, al igual que lo hace el tercer bit. Este proceso lleva al decodificador a la hoja a 4 la cual es emitida. Nuevamente el proceso reinicia en la raz, leyendo 110 movindose hacia arriba, nuevamente arriba y por ltimo hacia abajo obteniendo la hoja a 2 , y continuando el proceso as sucesivamente.

2.1.2.7.Tamao cdigo promedio

Figura 2.5

0.03 0.05 0.02

a1

ad 2
1

En las figuras 2.5 y 2.6 se observa cinco smbolos con sus probabilidades y un tpico rbol de Huffman. El smbolo A aparece 55% del tiempo y le es asignado un cdigo de un bit, adems este contribuye con 0.55 1 bits al tamao del cdigo promedio. El smbolo E aparece el 2% del tiempo y es asignado un cdigo Huffman de 4 bits, adems este contribuye con 0.02 4 = 0.08 bits al tamao del cdigo. El tamao promedio es por lo tanto calculado de la siguiente forma. 0.55 1 + 0.25 2 + 0.15 3 + 0.03 4 + 0.02 4 = 1.7 bits por smbolo. Curiosamente el mismo resultado es obtenido a travs de la suma de los valores de los nodos internos del rbol del cdigo de Huffman como se ve a continuacin. 0.05 + 0.2 + 0.45 + 1 = 1.7 Esto provee una manera para calcular el tamao de cdigo promedio de los cdigos de Huffman sin realizar multiplicaciones. Simplemente sumando los valores de los nodos internos del rbol. Las siguientes dos tablas muestran como trabaja esto. .05 = .20 = .45 = 1.0 = .02 + .02 + .02 + .02 + .03 .03 + .03 + .03 +

.05 + .20 + .45 +

.15 = .25 = .55 =

.15 .15 + .15 +

.25 .25 +

.55

Tabla 2.7

0.05 = a1 = a2 = a d 2 =

0.05 +

a2

= 0.02 + 0.03 + = 0.02 + 0.03 + = 0.02 + 0.03 + = 0.02 + 0.03 +

a d 3 +

Tabla 2.8

1.0

a d 2 +

= 0.02 + 0.03 +

Las columnas de la izquierda consisten de los valores de todos los nodos internos. Las columnas de la derecha muestran como cada nodo interno es la suma de algunas de los nodos hoja. Sumando los valores de la columna izquierda produce 1.7, y sumando las otras columnas muestra que estos 1.7 son la suma de los cuatro valores 0.02, los cuatro valores 0.03, los tres valores 0.15, los dos valores 0.25 y del simple valor 0.55. Este argumento puede ser extendido para el caso general. Es fcil observar en un rbol como el de Huffman (donde cada nodo es la suma de sus hijos) la suma peso de las hojas, donde los pesos son las distancias de las hojas desde la raz, es igual a la suma de los nodos internos. La figura 2.6 muestra como un rbol, donde asumimos que las dos hojas 0.02 y 0.03 tienen cdigos Huffman d-bits. Dentro del rbol, estas hojas llegan a ser las hijas del nodo interno 0.05, que a su vez, esta conectado a la raz por medio de los d 2 nodos internos a1 a travs de a d 2 . La tabla 2.8 tiene d filas y muestra que los dos valores 0.02 y 0.03 estn incluidos en varios nodos internos exactamente d veces. Sumando los valores de todos los nodos internos produce una suma que incluye las contribuciones 0.02 d + 0.03 d desde las dos hojas. Puesto que estas hojas son arbitrarias, queda claro que esta suma incluye contribuciones similares desde todas las otras hojas, adems esta suma corresponde al tamao promedio del cdigo. Puesto que esta suma iguala la suma de la columna izquierda, que es la suma de los nodos internos, queda claro que la suma de los nodos internos iguala el tamao de cdigo promedio. Note que esta demostracin no asume que el rbol es binario. La propiedad ilustrada aqu existe en cualquier rbol donde un nodo contiene la suma de sus hijos.

2.1.2.8.Nmero de cdigos
Ya que el cdigo Huffman no es nico, la pregunta natural es: Cuntos cdigos diferentes hay? Las siguientes figuras muestran un rbol de cdigo Huffman para seis smbolos, desde el que se responder a esta pregunta de dos maneras diferentes.

Figura 2.7 Figura 2.8

Respuesta 1: El rbol de la figura 2.7 tiene cinco nodos internos, y en general, un rbol cdigo Huffman para n smbolos tiene n-1 nodos interiores. Cada nodo interior tiene dos limites llegndole desde afuera, etiquetados como 0 y 1. Intercambiando las dos etiquetas se produce un rbol de cdigo Huffman diferente, de modo que el nmero total de rboles de cdigo de Huffman diferentes es 2 n 1 (en nuestro ejemplo 2 5 o 32).

El rbol de la figura 2.8, por ejemplo muestra el resultado de intercambiar las etiquetas de los dos lmites de la raz. La siguiente tabla muestra los cdigos generados por los dos rboles. 000 001 100 101 01 11
a

100 101 000 001 11 01


b

000 001 010 011 10 11


c

Tabla 2.9

Respuesta 2: Los seis cdigos de la tabla 2.9b pueden ser divididos dentro de cuatro clases 00x, 10y, 01 y 11, donde x e y son de 1 bit cada uno. Es posible crear diferentes cdigos de Huffman al cambiar los dos bits de cada clase. Ya que hay cuatro clases, esto es lo mismo como crear todas las permutaciones de cuatro objetos, algo que puede ser hecho de 4 ! = 24 maneras. En cada una de las 24 permutaciones es adems posible cambiar los valores de x e y en cuatro diferentes formas (desde que ellos sean bits) de manera que el total de cdigos Huffman diferentes en nuestro ejemplo de seis smbolos es de 24 4 = 96 . Las dos respuestas son diferentes pues ellas calculan cosas diferentes. La respuesta uno tiene en cuenta el nmero de rboles de cdigo de Huffman diferentes, mientras que la respuesta dos tiene en cuenta el nmero de cdigos de Huffman diferentes. Resulta que nuestro ejemplo puede generar 32 diferentes rboles de cdigo pero 32 cdigos diferentes en ves de 96. Esto muestra que hay cdigos de Huffman que no pueden ser generados por el mtodo de Huffman! La tabla 2.9c muestra un ejemplo de estos. Una mirada minuciosa al rbol de este ejemplo puede convencernos de que los cdigos de los smbolos 5 y 6 deben empezar con diferentes bits, pero en el cdigo de la tabla c ambos empiezan con 1. Este cdigo es por lo tanto imposible de generarse por cualquiera arreglo de los nodos de los rboles de la figura de este ejemplo.

2.1.2.9.Cdigos de Huffman Cannicos


El cdigo c de la tabla anterior tiene una simple interpretacin. Esta asigna a los primeros cuatro smbolos el cdigo de tres bits 0, 1, 2, 3, y a los dos ltimos smbolos los cdigos de

dos bits 2 y 3. Este es un ejemplo de un cdigo de Huffman cannico. La palabra cannico significa que este cdigo particular ha sido seleccionado entre varios cdigos de Huffman posibles porque sus propiedades lo hacen fcil de usar. La siguiente tabla muestra ligeramente un ejemplo de un cdigo de Huffman cannico. Imagnese un set de 16 smbolos (cuya probabilidad es irrelevante y no es mostrada) tal que a cuatro smbolos son asignados un cdigo de tres bits, cinco smbolos tienen asignado un cdigo de cinco bits, y los restantes siete smbolos, cdigos de 6 bits.
1: 2: 3: 4: 5: 6: 7: 8: 000 001 010 011 10000 10001 10010 10011 (a) 011 100 101 110 00100 00101 00110 00111 (b) 9: 10: 11: 12: 13: 14: 15: 16: 10100 101010 101011 101100 101101 101110 101111 100000 (a) 01000 000000 000001 000010 000011 000100 000101 000110 (b)

Tabla 2.10

Tabla 2.11

La tabla 2.10 muestra un conjunto de posibles cdigos de Huffman, mientras la tabla 2.11 muestra un conjunto de cdigos de Huffman cannicos. Es fcil observar que los siete cdigos cannicos de seis bits son simplemente los seis enteros de 0 a 6. Los cinco cdigos son los cinco bits que expresan los nmeros enteros de 4 a 8, y los cdigos de cuatro son los tribits de los enteros de 3 a 6. Inicialmente mostraremos como estos cdigos son generados y posteriormente como utilizarlos. La lnea superior (longitud) de la tabla siguiente lista las posibles longitudes de cdigo desde los bits de 1 a 6.
Longitud: Listnum: Primero: 1 0 2 2 0 4 3 4 3 4 0 5 5 5 4 6 7 0

La segunda lnea lista el nmero de cdigos de cada longitud, y la lnea inferior de la tabla enumera los primeros cdigos en cada grupo. Esto es porque los tres grupos de cdigos empiezan con valores 3, 4 y 0.

2.1.2.10.

Cdigo de Huffman Adaptativo

El mtodo de Huffman asume que las frecuencias de ocurrencia de todos los smbolos del alfabeto son conocidos por el compresor. En la prctica, las frecuencias son raramente conocidas por anticipado. Una solucin es que el compresor lea los datos originales dos veces. La primera vez calcula las frecuencias. La segunda vez comprime los datos. Entre los dos pasos el compresor construye el rbol de Huffman. Tal mtodo es llamado

semiadaptativo y es normalmente demasiado lento para ser prctico. El mtodo usado en la prctica es llamado cdigo de Huffman adaptativo (o dinmico). Este mtodo es la base del programa compacto de UNIX. La idea principal es que tanto el compresor como el descompresor empiezan con un rbol de Huffman desocupado, y lo modifican cuando los smbolos estn siendo ledos y procesados (comprimidos y descomprimidos). Tanto el compresor como el descompresor podra modificar el rbol de la misma forma, de este modo en cualquier punto del proceso podran usar los mismos cdigos, aunque estos cdigos pueden cambiar de un paso a otro. Diremos que el compresor y el descompresor estn sincronizados, o que ellos trabajan en llave (aunque ellos no necesariamente trabajan juntos; la compresin y la descompresin usualmente toman lugar en diferentes momentos). El trmino reflejarse es quizs una mejor eleccin. El decodificador refleja las operaciones del codificador. Inicialmente, el compresor empieza con un rbol de Huffman desocupado. Ningn smbolo tiene asignado un cdigo. El primer smbolo que entra es simplemente escrito en el flujo de salida en su forma descomprimida. El smbolo es entonces agregado al rbol, y un cdigo es asignado a este. La prxima vez que este smbolo es encontrado, su cdigo actual es escrito sobre el flujo y su frecuencia es incrementada en uno. Ya que este modifica el rbol, este (el rbol) es examinado para observar si este es aun un rbol de Huffman (mejores cdigos). Si no, este es reorganizado, con los vnculos de los cambios hechos. El descompresor refleja los mismos pasos. Cuando este lee la forma descomprimida de un smbolo, este lo agrega en el rbol y le asigna un cdigo. Cuando este lee un cdigo comprimido (tamao variable) este usa el rbol actual para determinar que cdigo pertenece a este smbolo y este actualiza el rbol en la misma manera que el compresor. El nico sutil punto es que el descompresor necesita conocer si el elemento a la entrada es un smbolo descomprimido (normalmente, un cdigo ASCCI de 8 bits) o un cdigo de tamao variable. Para evitar cualquier ambigedad, cada smbolo sin comprimir es precedido por un cdigo de escape de tamao variable especial. Cuando el descompresor lee este cdigo, este conoce que los siguientes ocho bits son un cdigo ASCCI de un smbolo que aparece en el flujo comprimido la primera vez. La dificultad se encuentra en que el cdigo de escape no sera cualquiera de los cdigos de tamao variable usado por los smbolos. Puesto que estos cdigos estn siendo modificados cada vez que el rbol es reorganizado, el cdigo de escape tambin sera modificado. Una manera natural para hacer esto es agregar una hoja vaca al rbol, una hoja con una frecuencia de cero ocurrencias, que es siempre asignada al brazo cero del rbol. Ya que la hoja est en el rbol, este obtiene un cdigo de tamao variable asignado. Este cdigo es le cdigo de escape que precede cada smbolo sin comprimir. Como el rbol est siendo re arreglado, la posicin de la hoja vaca cambia, pero el cdigo de escape es siempre usado para identificar los smbolos en el flujo comprimido. La siguiente figura muestra como el cdigo de escape se mueve con el desarrollo del rbol.

Figura 2.9

Este mtodo es el utilizado para comprimir/descomprimir datos en el protocolo V.32 para modems de 14400 baudios.

2.1.2.11.

MNP5

Microcom, Inc, un fabricante de modems, ha desarrollado un protocolo (llamado MNP, por Microcom Networking Protocol) para usar en sus modems. Entre otras cosas, el protocolo MNP especifica como desempaquetar bytes en bits individuales antes de que ellos sean enviados por el MODEM, como transmitir bits serialmente en los modos sncronos y asncronos y que modulacin usar. Cada especificacin es llamada una clase y las clases 7 y 5 especifican mtodos de compresin de datos. Estos modelos (especficamente llamados MNP5) se han puesto muy populares y estn actualmente siendo usados por muchos modems modernos. El mtodo MNP5 es un proceso de dos estados que empieza con la codificacin de longitud ejecutada, seguida por una codificacin de frecuencia adaptativa. En el primer estado cuando tres o ms bytes consecutivos idnticos son encontrados en el flujo de fuente, el compresor emite tres copias de los bytes sobre su flujo de salida, seguido por una cuenta de repeticin. Cuando el descompresor lee tres bytes consecutivos e idnticos, este sabe que el prximo byte es una cuenta de repeticin (que puede ser cero, indicando con esto que solo son tres repeticiones, las tres primeras). Una desventaja del mtodo es que una ejecucin de tres caracteres en el flujo de entrada resultar en cuatro caracteres sin comprimir. nicamente una ejecucin ms extensa a cuatro caracteres permite realmente obtener compresin. Otro insignificante problema es que el mximo conteo es artificialmente limitado a 250 en lugar de hasta 255. El segundo estado opera sobre los bytes en flujo comprimido parcialmente generado por el primer estado. El estado dos es similar al mtodo de la seccin 2.9.5. Este estado empieza con una tabla de 256 2 entradas, donde cada entrada corresponde a uno de los 256 posibles 8 bits entre los bytes comprendidos entre 00000000 a 11111111. La primera columna, el conteo de frecuencias es inicializada a cero. La columna dos es inicializada en un cdigo de tamao variable, llamado token que vara desde una cantidad corta 0000 a una larga 11111111110. La columna dos es mostrada en la siguiente tabla.

Byte 0 1 2 3 4 5 6 7 8

Frec. Token 0 0 0 0 0 0 0 0 0 0000 0001 0010 0011 01000 01001 01010 01011 011000

Byte 9 10 11 12 13 14 15 16 17

Frec. Token 0 0 0 0 0 0 0 0 0 011001 011010 011011 011100 011101 011110 011111 1110000 1110001

Byte Frec. 26 27 28 29 30 31 32 33 34 0 0 0 0 0 0 0 0 0

Token 1111010 1111011 1111100 1111101 1111110 1111111 10100000 10100001 10100010

Byte 247 248 249 250 251 252 253 254 255

Frec. 0 0 0 0 0 0 0 0 0

Token 1111110111 1111111000 1111111001 1111111010 1111111011 1111111100 1111111101 1111111110 11111111110

Tabla 2.12

Cada token empieza con una cabecera de 3 bits, seguida por algunos bits de cdigo. Los cdigos bits son los dos cdigos de un bit, 0 y 1, los cuatro cdigos de dos bits que van de 0 a 3, los ocho cdigos de tres bits que van de 0 a 7, los diecisis cdigos de cuatro bits, los treinta y dos cdigos de cinco bits, los sesenta y cuatro cdigos de seis bits y los ciento veintiocho cdigos de siete bits. Este provee un total de 2+4+8+16+32+64+128 = 254 cdigos. Existen tres excepciones que son los dos primeros cdigos 0000 y 0001 y el ltimo cdigo, que es 11111111110 en lugar del esperado 11111111111. Cuando la etapa dos comienza, todas las 256 entradas de la columna 1 son asignadas con conteo de frecuencia de cero. Cuando el prximo byte B es ledo desde el flujo de entrada (actualmente, este es ledo desde la salida del primer estado), el correspondiente token es escrito en el flujo de salida, y la frecuencia de entrada B es incrementada en uno. Seguido a esto, los token pueden ser sustituido para asegurar que entradas de tabla con altas frecuencias siempre tendran el token ms corto. Ntese que nicamente los token son cambiados, no los contadores de frecuencia. De esta manera la primera entrada siempre corresponde al byte 00000000 y contiene su contador de frecuencia. El token de este byte, no obstante puede cambiar desde su original que es 0000 a alguno ms largo si otros bytes alcanzan contadores de frecuencia altos. Los contadores de frecuencia son almacenados en campos de ocho bits. Cada vez que un contador es incrementado, el algoritmo comprueba observando si este ha alcanzado su mximo valor. De ser as, todos los contadores son escalados hacia abajo dividindolos por dos. Otro sutil punto tiene que ver con la interaccin entre los dos estados de compresin. Recordar que cada repeticin de tres o ms caracteres es reemplazado en el estado uno, por tres repeticiones, seguidos de un byte con el conteo de frecuencia. Cuando estos cuatro bytes llegan al estado dos, ellos son reemplazados por tokens, pero el cuarto no genera un incremento del conteo de frecuencia.

Ejemplo: Suponga que el carcter con cdigo ASCII 52 se repite seis veces. En el estado uno generar cuatro bytes 52, 52, 52 y 6. En el estado dos reemplaza cada uno de estos con un token incrementando la entrada de 52 a 53 en la tabla por tres, sin embargo no incrementar la entrada para el 6 (que sera la entrada 7 en la tabla). (Los tres tokens para los tres bytes del 52 pueden ser todos diferentes, desde que los tokens puedan ser intercambiados despus de que cada 52 es ledo y procesado. La salida del estado dos consiste de tokens de diferentes tamaos, desde cuatro hasta once bits. Esta salida es empaquetada en grupos de ocho bits, que se introducen dentro del flujo de salida. Al final un cdigo especial consistente de once bits de 1 (token de inundacin) es escrito, seguido por tantos bits como sea necesario para completar el ltimo grupo de ocho bits. La eficiencia del cdigo MNP5 es un resultado de ambos estados. La eficiencia del estado 1depende fuertemente de los datos originales. El estado dos depende del dado original pero a una extensin mas corta. El estado dos tiende a identificar los caracteres de mayor frecuencia en el dato y asigna cortos cdigos a este. Una mirada en la tabla anterior muestra que 32 de los 256 caracteres tienen token de 7 bits de longitud, como resultado de la compresin. Los otros 224 caracteres tienen tokens de 8 bits de longitud. Cuando uno de estos caracteres es reemplazado por un token largo, el resultado es la no compresin o incluso la expansin. La eficiencia del MNP5 de esta manera depende de cmo muchos caracteres dominan el dato original. Si todos los caracteres ocurrieran a la misma frecuencia, el resultado sera la expansin. De suceder el otro caso extremo, si nicamente cuatro caracteres aparecen en el dato, a cada uno le ser asignado un token de cuatro bits, y el factor de compresin ser de 2.

Actualizando la tabla
Los procesos de actualizacin de la tabla de cdigos MNP5 por arreglos de filas pueden ser hechos de dos maneras: 1) Ordenando la tabla entera cada vez que una frecuencia es incrementada. Este es un simple concepto pero a la vez lento en la prctica cuando por ejemplo la tabla tiene 256 entradas de longitud. 2) Usando punteros en la tabla, y ordenando los punteros de forma que los tems con frecuencias grandes apunten a cdigos cortos. Una aproximacin de esto se muestra a continuacin.

(a)

(b)

(c)

(d)

(e)

(f)

(g)

(h)

(i)

La figura muestra la tabla de cdigo organizada en cuatro columnas etiquetadas F, P, Q y C. Las columnas F y C contienen los cdigos y las frecuencias; las columnas P y Q contienen los punteros que siempre apuntan a otro. De manera que si P[i] contiene el ndice j (es decir, apunta a Q[j]), entonces Q[j] seala a P[i]. La siguiente es una explicacin de la anterior figura. (a) El primer elemento de dato a es leido y F[a] es incrementado de 0 a 1. El algoritmo empieza con un puntero P[a], que contiene por decir, a j. El algoritmo examina el puntero Q[j-1], que inicialmente apunta a la entrada F[b], en primera instancia antes que F[a]. Si F[a] > F[b] entonces a tendr un cdigo corto asignado y en consecuencia los punteros P[a] y P[b] son reorganizados (de igual forma los punteros de Q). (b) El mismo proceso es repetido. El algoritmo de nuevo empieza con el puntero P[a] que ahora apunta ms arriba, sobre la entrada de b. Asumiendo que P[a] contiene el

ndice k, el algoritmo examina e puntero Q[k-1]. Que apunta a la entrada c. Nuevamente comparando si F[a] > F[c], entonces a tendra un cdigo ms corto que el de c. De esta forma los punteros son reorganizados al mismo tiempo, tanto P[a] como P[c]. (c) Este proceso se repite y, desde que F[a] sea ms grande que todas las frecuencias debajo de esta, entonces los punteros sern reorganizados hasta que P[a] apunte al tope de la entrada, tal como lo muestra la figura d. En esta instancia, al puntero de P[a] se le ha asignado el cdigo ms corto. (d) Asumiremos ahora que el prximo item de dato ha entrado, y F[m] se ha incrementado a 1. Los punteros P[m] y los que estn encima de este sern reorganizados tal como sucedi en (a). (e) Despus de unas cuantas ms reorganizaciones, P[m] est ahora apuntando a la b: = entrada n (un lugar justo debajo de a). El siguiente paso ejecuta j: = P[m]; Q[j-1], y el algoritmo compara F[m] con F[b]. Si F[m] > F[b], entonces los punteros son reorganizados como muestra la figura 2.33f. (f) Despus de reorganizar, P[m] est apuntando a la entrada a y P[b] est apuntando a la entrada n. (g) Despus de otras ms reorganizaciones, el puntero P[m] apunta a la segunda entrada p. Es de esta forma como a la entrada m le es asignado el segundo cdigo ms corto. El puntero P[m] no es reorganizado con respecto al puntero P[a], ya que ambos tienen la misma frecuencia. (h) Ahora asumiremos que el tercer dato ha entrado y F[x] se ha incrementado. Los punteros P[x] y P[y] son reordenados. (i) Despus de algunas otras reorganizaciones, el puntero P[x] apunta a la tercera entrada de tabla z. As es como la entrada x es asignada al tercer cdigo ms corto.

2.1.2.12.

MNP7

Ms sofisticado y complejo que MNP5, MNP7 combina una ejecucin larga con una variante en dos dimensiones del cdigo Huffman adaptativo. La fase 1 identifica las ejecuciones y emite tres copias del carcter en ejecucin, seguido por un contador de cuatro bits de los restantes caracteres en la ejecucin. Un conteo de cero implica una ejecucin de longitud 3, y un conteo de 15 (el valor ms grande posible para los cuatro bits del contador), una ejecucin de longitud 18. El estado dos empieza asignando a cada carcter una tabla completa con muchos cdigos de tamao variable. Cuando un carcter C es ledo,

uno de los cdigos en esta tabla es seleccionado y sacado, de acuerdo al carcter precedente C en la entrada del flujo. Si este carcter es por decir, P, entonces la frecuencia de conteo del par PC es incrementado en 1, y las filas de la tabla pueden ser reorganizadas, usando el mismo algoritmo como el de MNP5, para mover el par a la posicin en la tabla con un cdigo ms corto. MNP7 est de este modo basado en el modelo de primer orden de Markov, donde cada item es procesado dependiendo del item y de sus predecesores. En un modelo de Markov de korden un item es procesado dependiendo de l mismo y de sus predecesores. Aqu estn los detalles. Cada uno de los 256 bytes obtiene una tabla de cdigo asignada de tamao 256 2 , donde cada fila corresponde a uno de los 256 posibles bytes. La columna 1 de la tabla es inicializada para los enteros de 0 a 255, y la columna 2 (el conteo de frecuencia) es inicializada a todos ceros. El resultado es 256, cada una a doble columna de 256 fila (tal como se muestra en la siguiente tabla). Cdigos de tamao variable son asignados a las filas, tal que el primer cdigo es de 1 bit de longitud y los Carcter actual 2 00 K 10 K 20 K 30 K M K 254 0 255 0 K

P C r a e r c e c d t e e n r t e

0 00 10 20 30 M 254 0 255 0

1 00 10 20 30 M 254 0 255 0

254 00 10 20 30 M 254 0 255 0

255 00 10 20 30 M 254 0 255 0

Otros obtienen cdigos largos a medida que descienden en la tabla. Los cdigos son almacenados en una tabla de cdigos adicionales que nunca cambia (siguiente tabla).

...

a T h c M

b l e u M

c h o r M

d o a e M

e d r s M

Cuando un carcter C es ledo (el actual carcter para ser comprimido), este valor es usad como un puntero, para seleccionar una de las 256 tablas. La primera columna de la tabla es inspeccionada, para encontrar la fila con el valor de 8 bits del carcter precedente P. Una vez la fila es encontrada, el cdigo de la misma fila en la tabla de cdigo es emitida y el contador en la columna secundaria es incrementada en 1. Las filas en la tabla pueden ser reorganizadas si el nuevo conteo del diagrama PC es bastante largo. Despus de que bastantes caracteres han sido ingresados y organizados en filas, las tablas empiezan reflejando las frecuencias de diagramas verdaderos de la tabla. La tabla anterior muestra un posible estado asumiendo que los diagramas ta, ha, ca, lb, eb, ub, hc, etc., son comunes. Si el dato original consiste de texto en lenguaje natural, donde ciertos diagramas son muy comunes, MNP7 normalmente produce un radio de alta compresin.

2.1.2.13.

CODIFICACION ARITMETICA

El mtodo Huffman es ms eficiente que el mtodo Shannon Fano, pero raramente algn mtodo produce el mejor cdigo de tamao variable. Las secciones anteriores mostrarn que estos mtodos producen mejores resultados (cdigos cuyo tamao promedio iguala la entropa) nicamente cuando los smbolos tienen probabilidades de ocurrencia que son potencias negativas de dos. Esto es porque estos mtodos asignan un cdigo con un nmero entero de bits para cada smbolo del alfabeto. Un smbolo con probabilidad de 0.4 se le podra asignar idealmente un cdigo de 1.32 bits, ya que log 2 0.4 1.32 . El mtodo Huffman no obstante, normalmente asigna a tal smbolo un cdigo de 1 o 2 bits. La codificacin Aritmtica supera este problema asignando un (normalmente largo) cdigo para el flujo de entrada entero, en lugar de asignar cdigos a los smbolos individuales. El mtodo lee el flujo de entrada smbolo por smbolo y aade ms bits al cdigo cada vez que un smbolo es ingresado y procesado. Para entender el mtodo, este es conveniente imaginar el cdigo resultante como un nmero en el rango [0, 1). De esta forma el cdigo 9746509 podra ser interpretado como 0.9746509 aunque el 0. no se incluya en el flujo de salida. El primer paso es calcular, o la menos estimar, las frecuencias de ocurrencia de cada smbolo. Para mejores resultados, las frecuencias exactas son calculadas al leer el flujo de entrada completo en el primer paso de un trabajo de compresin compuesto de dos pasos. Si el programa tiene buena estimacin de las frecuencias desde una fuente diferente, el primer paso puede ser omitido. El primer ejemplo involucra los tres smbolos a1 , a 2 y a3 , con probabilidades P1 = 0.4 ,

P2 = 0.5 y P3 = 0.1 , respectivamente. El intervalo [0, 1) es dividido entre los tres smbolos

asignndoseles a cada uno un subintervalo proporcional en tamao a su probabilidad. El orden de los subintervalos es inmaterial. En nuestro ejemplo, los tres smbolos son asignados a los subintervalos [0, 0.4), [0.4, 0.9) y [0.9, 1.0). Para codificar la cadena a 2 a 2 a 2 a3 nosotros empezamos con el intervalo [0, 1). El primer smbolo a 2 reduce este intervalo al subintervalo desde su punto inicial de 40% al final 90%. El resultado es [0.4, 0.9). El segundo a 2 reduce [0.4, 0.9) en la misma manera para producir [0.6, 0.85) (observar la anotacin ms abajo), el tercer a 2 reduce esto a [0.7, 0.825), y el a3 reduce esto extender esto desde su punto inicial de 90% con [0.7, 0.825) a su punto final de 100%, produciendo [0.8125, 0.8250). El cdigo final que nuestro mtodo produce puede ser cualquier nmero en este rango final. (Nota: El subintervalo [0.6, 0.85) es obtenido desde el intervalo [0.4, 0.9) de realizar 0.4+ (0.9-0.4) 0.9 = 0.85). Con este ejemplo en mente, esto podra ser fcil entender las siguientes reglas, que resumen los principales pasos de una codificacin aritmtica. 1. Empezar por definir el intervalo actual como [0,1). 2. Repetir los siguientes dos pasos para cada smbolo s en el flujo de entrada: cuyos tamaos son 2.1. Dividir el actual intervalo dentro de subintervalos proporcionales a los smbolos probabilidades. 2.2. Seleccionar el subintervalo para s y definir este como el nuevo intervalo actual. 3. Cuando el flujo de entrada completo ha sido procesado de esta forma, la salida podra ser cualquier nmero que identifica nicamente al intervalo actual (es decir, cualquier nmero dentro del intervalo actual). Para cada smbolo procesado, el intervalo actual se pone ms pequeo, adems este toma ms bits para expresar esto, pero el punto es que la salida final es un simple nmero y no consiste de cdigos para los smbolos individuales. El tamao de cdigo promedio puede ser obtenido dividiendo el tamao de la salida (en bits) por el tamao de la entrada (en smbolos). Notar adems que las probabilidades usadas en el paso 2.1 pueden cambiar todo el tiempo, ya que ellas pueden ser suministradas por un modelo de probabilidad adaptativa. El siguiente ejemplo es un poco ms complejo. Veremos los pasos de compresin de una cadena corta SWISS_MISS. La siguiente tabla muestra la informacin preparada en el primer paso (el modelo estadstico de los datos).

Carcter
S W I M _

Frecuencia
5 1 2 1 1

Probabilidad Rango Total Frecuencia Acumulada = 5/10 = 0.5 1/10 = 0.1 2/10 = 0.2 1/10 = 0.1 1/10 = 0.1

Frec. Acumul. 10 5 4 2 1 0

Los cinco smbolos que aparecen en la entrada pueden ser arreglados en cualquier forma. Para cada smbolo, su frecuencia es contabilizada inicialmente, luego su probabilidad de ocurrencia (la frecuencia dividida por el tamao de la cadena, 10). El rango [0, 1) es entonces dividido entre los smbolos, en cualquier orden, con cada smbolo obteniendo un subrango, igual en tamao a su probabilidad. De esta forma S obtiene el subrango [0.5, 1.0) (de tamao 0.5), mientras que el subrango de I es de tamao 0.2 [0.2, 0.4). Los smbolos y frecuencias en la anterior tabla estan escritos en base al flujo de salida, antes que cualquiera de los bits del cdigo comprimido. Esta tabla ser la primera cosa ingresada por el decodificador. El proceso de codificacin inicia por definir dos variables. Low y High, e ingresa entonces 0 y 1 respectivamente. Ellos definen el intervalo [Low, High). Como los smbolos estn siendo ingresados y procesados, los valores de Low y High son movidos cerca jontos, para angostar el intervalo. Despus de procesar el primer smbolo S . Low y High son actualizados a 0.5 y 1, respectivamente. El cdigo resultante para el flujo de entrada completo ser un nmero en su rango (0.5 cdigo < 1.0). El resto del flujo de entrada determina precisamente donde, en el intervalo [0.5, 1.0) el cdigo final quedar. Una buena manera para entender el proceso es imaginar que el nuevo intervalo [0.5, 1.0) es dividido entre los cinco smbolos de nuestro alfabeto usando las mismas proporciones como para el intervalo original [0, 1). El resultado son los cinco subintervalos [0.5, 0.55), [0.55, 0.60), [0.60, 0.70), [0.70, 0.75) y [0.75, 1.0). Donde el prximo smbolo W es ingresado, el tercero de estos subintervalos es seleccionado, y es nuevamente dividido dentro de cinco subintervalos. En el ejemplo anterior, el segundo smbolo de entrada es W, de modo que nosotros actualizamos: Low := 0.5 + (1.0 0.5) 0.4 = 0.70, High := 0.5 + (1.0 0.5) 0.5 = 0.75. El nuevo intervalo [0.70, 0.75) cubre la extensin [40%, 50%) del subrango de S. La tabla siguiente muestra todos los pasos involucrados en codificar la cadena SWISS_MISS. El

cdigo final es el valor de Low, 0.71753375, del cual nicamente 71753375 necesitan ser escritos en el flujo de salida.

los ocho dgitos

Carcter
S W I S S _ M I S S L H L H L H L H L H L H L H L H L H L H

El clculo de Low y de High


0.0+(1.0-0.0) 0.5 = 0.5 0.0+(1.0-0.0) 1.0 = 1.0 0.5+(1.0-0.5) 0.4 = 0.70 0.5+(1.0-0.5) 0.5 = 0.75 0.7+(0.75-0.70) 0.2 = 0.71 0.7+(0.75-0.70) 0.4= 0.72 0.71+(0.72-0.71) 0.5= 0.715 0.71+(0.72-0.71) 1.0= 0.72 0.715+(0.72-0.715) 0.5= 0.7175 0.715+(0.72-0.715) 1.0= 0.72 0.7175 +(0.72 0.7175) 0.0 = 0.7175 0.7175 +(0.72 0.7175) 1.0 = 0.71775 0.7175 +(0.71775 0.7175) 0.1 = 0.717525 0.7175 +(0.71775 0.7175) 0.2 = 0.717550 0.717525 +(0.71755 0.717525) 0.2 = 0.717530 0.717525 +(0.71755 0.717525) 0.4 = 0.717535 0.717530 +(0.717535 0.717530) 0.5 = 0.7175325 0.717530 +(0.717535 0.717530) 1.0 = 0.717535 0.7175325 +(0.717535 0.7175325) 0.5 = 0.71753375 0.7175325 +(0.717535 0.7175325) 1.0 = 0.717535

El decodificador trabaja de forma contraria. Este empieza por ingresar los smbolos y sus rangos, y reconstruye la tabla anterior. Este entonces ingresa el resto del cdigo. El primer dgito es 7, de manera que el decodificador inmediatamente conoce que el cdigo completo es un nmero de la forma 0.7 Este nmero esta dentro del subrango [0.5, 1) de S, de modo que el primer smbolo es S. El decodificador entonces elimina el efecto del smbolo S desde el cdigo sustrayendo el lmite bajo 0.5 de S y dividiendo por el ancho del subrango de S (0.5). El resultado es 0.4350675, quien le dice al decodificador que el prximo smbolo es W (donde el subrango de W es [0.4, 0.5)). La siguiente tabla resume los pasos para decodificar muestra cadena de ejemplo (notar que esta tiene dos filas por smbolo).

Carcter S W I

Cdigo Bajo 0.71753375 0.5 0.4350675 0.4 0.350675 0.2

Rango = 0.21753375 = 0.0350675 = 0.150675

/0.5 0.4350675 /0.1 0.350675 /0.2 0.753375

S S _ M I S S

0.753375 0.5 0.50675 0.5 0.0135 0.0 0.135 0.1 0.35 0.2 0.75 0.5 0.5 0.5

= 0.253375 = 0.00675 = 0.0135 = 0.035 = 0.15 = 0.25 =0

/0.5 /0.5 /0.1 /0.1 /0.2 /0.5 /0.5

0.50675 0.0135 0.135 0.35 0.75 0.5 0

El siguiente ejemplo es de tres smbolos con probabilidades mostradas a continuacin.

Car.

a1 a2 a3
(a)

Prob. 0.001838
0.975 0.023162

Rango [0.998162,
[0.023162, [0.0,

1.0) 0998162) 0.023162)

Car. eof

Prob. 0.000001
0.001837 0.975 0.023162

Rango [0.999999,
[0.998162, [0.023162, [0.0,

1.0) 0.999999) 0.998162) 0.023162)

a1 a2
a3
(b)

Aqu se puede notar que las probabilidades son muy diferentes. Una es grande (97.5%) y las otras mucho ms pequeas. Este es el caso de probabilidades sesgadas. Codificando la cadena a 2 a 2 a1 a3 a3 produce los extraos nmeros (de 16 dgitos exactos) en la tabla 2.48 o siguiente tabla, donde las dos filas para cada smbolo corresponden a los valores bajos Low y altos High, respectivamente.
0.0 + (1.0 0.0) 0.023162 0.0 + (1.0 0.0) 0.998162 0.023162 + .975 0.023162 0.023162 + .975 0.975 0.998162 0.04574495 + 0.950625 0.998162 0.04574495 + 0.950625 1.0 0.99462270125 + 0.00174724875 0.0 0.99462270125 + 0.00174724875

a2

= = = = = = = = = =

0.023162 0.998162 0.04574495 0.99636995 0.99462270125 0.99636995 0.99462270125 0.994663171025547 0.99462270125 0.994623638610941

a2 a1
a3 a3

0.023162
0.023162

0.99462270125 + 0.00004046977554749998 0.0 0.99462270125 + 0.00004046977554749998

La decodificacin de esta cadena de caracteres se muestra a continuacin

Carac.

a2 a2 a1 a3
a3

0.99462270125 -0.023162 0.99636995 0.023162 0.998162 0.998162 0.0 0.0 0.0 0.0

=0.97146170125/0.975 =0.97320795/0.975 =0.0/0.00138 =0.0/0.023162 =0.0/0.023162

=0.99636995 =0.998162 =0.0 =0.0 =0.0

Esta decodificacin involucra un problema especial. Despus de eliminar el efecto a1 , sobre la lnea 3, el resultado es 0. Rpidamente, implcitamente asumimos que esto significa el final del proceso de decodificacin, pero ahora conoceremos que hay dos sucesos ms, pertenecientes a a3 que podran dejar de ser decodificados si esto fuera as de acuerdo a esta primera observacin. Estos eventos son mostrados sobre las lneas 4 y 5 de la tabla. Este problema siempre ocurre cuando el ltimo smbolo en el flujo de entrada es el nico cuyo subrango empieza en cero. En consecuencia, para distinguir entre tal smbolo y el final de la entrada del flujo, necesitamos definir un smbolo adicional, el final de la entrada (o el final del archivo eof end-of-file). Este smbolo sera adicionado con una pequea probabilidad, tal como se muestra en la tabla penltima b, y esta sera decodificada en el final del flujo de entrada. Las dos tablas siguientes muestran como la cadena a3 a3 a3 a3 eof son codificados dentro del nmero 0.0000002878086184764172, y luego decodificados apropiadamente.

a3 a3 a3 a3
eof

0.0 + (1.0 0.0) 0.0 0.0 +(1.0 0.0) 0.023162 0.0 + 0.023162 0.0 0.0 + 0.023162

= 0.0 = 0.023162 = 0.0 = 0.000536478244 = 0.0 = 0.000012425909087528 = 0.0 = 0.0000002878089062853235 = 0.0000002878086184764172 = 0.0000002878089062853235

0.023162

0.0 + 0.000536478244 0.0 0.0 + 0.000536478244 0.023162 0.0 + 0.000012425909087528

0.0

0.0 + 0.0 0.023162 0.0 + 0.0000002878089062853235 0.999999 0.0 + 0.0000002878089062853235 1.0

Codificacin de la cadena a 3 a 3 a 3 a 3 eof

Carcter

Cdigo - Low 0.0000002878086184764172 0 0.0000124258966161891247 0 0.000536477707521756 0 0.023161976838 0 0.999999 -0.999999

Rango = 0.0000002878086184764172 / 0.023162 = 0.00001242589666161891247 / 0.023162 = 0.000536477707521756 = 0.023161976838 = 0.0 / 0.023162 / 0.023162 / 0.000001 = 0.00001242589666161891247 = 0.000536477707521756 = 0.023161976838 = 0.999999 = 0.0

a3 a3 a3 a3
Eof

Sin el smbolo eof, una cadena de todos a 3 podra haber sido decodificada dentro de cero.

Detalles de Implementacin
El proceso de codificacin descrito inicialmente no es prctico, ya que asume que los nmeros de precisin ilimitada pueden almacenarse en Low y en High. El proceso de decodificacin descrito es simple en principio, pero adems es imprctico. El cdigo, que es un simple nmero, es normalmente extenso y puede ser adems ser demasiado extenso. Un archivo de 1 MByte puede ser codificado por decir en 500 Kbytes el cual consiste de un simple nmero. Dividiendo un nmero de 500 Kbytes es complejo y lento. Cualquier implementacin prctica de un cdigo aritmtico debe usar enteros (pues la aritmtica de punto flotante es lenta y la precisin es prdida), y ellos debera no ser tan largos. Describiremos como una implementacin aqu, usando dos enteros variables Low y High. En nuestro ejemplo ellos tienen cuatro dgitos decimales de longitud, pero en la prctica ellos podran tener 16 o 32 bits. Estas variables poseen los lmites altos y bajos del subintervalo actual, pero no les permitiremos crecer mucho. Una mirada a la tabla 2.45 muestra que cuando los dgitos mas significativos (haca la izquierda) de Low y High empiezan idnticos, ellos nunca cambian. Nosotros por lo tanto cambiaremos tales dgitos

2.1.3. Tcnicas predictivas sin prdidas


Los algoritmos de compresin y descompresin sin prdida se aplican en aquellos casos en los que se debe garantizar que el flujo de datos original debe poderse recuperar exactamente tras el proceso de compresin y descompresin. En general estos casos se conocen como

casos de datos "discretos" ya que son del tipo registros de bases de datos, hojas de clculo, procesadores de texto e incluso imgenes donde la calidad es crtica. La compresin sin prdida se implementa tambin como complemento a muchos protocolos de transmisin de informacin. Las empresas de telecomunicaciones utilizan este tipo de algoritmos para conseguir multiplexar un mayor nmero de lneas telefnicas o de datos por un mismo medio fsico. Especialmente se realiza en el caso de informacin de audio analgico ya que cuando hablamos de compresin de datos vemos que la suelen realizar los propios equipos situados a los extremos de la lnea. Otro campo de aplicacin es el almacenamiento de datos en medios fsicos. Obviamente queremos que los datos restaurados sean idnticos a los originales as como conseguir almacenar mayor informacin en el mismo espacio. En este campo es interesante comentar la existencia de hardware que implementa ya la compresin va hardware por lo que resulta transparente al sistema operativo. Este tipo de soluciones se suelen implementar en sistemas backup de cinta. El inconveniente de este sistema es que la capacidad de las cintas es variable dependiendo de la informacin introducida. Pese a esto, si realizamos copias de seguridad de grandes bases de datos (o ficheros equivalentes), los ratios de compresin se mantienen cercanos a un valor concreto debido a la propia naturaleza de los datos por lo que estas variaciones sern mnimas.

2.2.

Tecnicas de compresin con perdidas

Los algoritmos o tcnicas de compresin ya sean con prdidas o sin prdidas se pueden representar con un mismo esquema el cual se presenta a continuacin.

INFORMACION ORIGINAL X

INFORMACION CODIFICADA X C

INFORMACION RECONSTRUIDA Y

No obstante y caso contrario a lo que suceda en la compresin sin prdida, aqu el resultado de la informacin reconstruida Y difiere del X a causa de los mtodos utilizados para obtener la informacin codificada X c ; no obstante, las altas razones de compresin que

se logran sobre la informacin original es mucho ms alta que la conseguida con los mtodos sin prdidas. La informacin reconstruida Y no es una rplica exacta a la informacin original X y por lo tanto para aplicaciones como la transmisin de datos sera inaceptable tal representacin de la informacin. No obstante para la transmisin de voz, imagen o video la calidad de tal informacin reconstruida sera aceptable dentro de los parmetros permisibles de la percepcin humana. La calidad de presentacin de voz, video o imgenes depende de las caractersticas de percepcin del ser humano y por lo tanto es posible aprovechar las limitaciones naturales de nuestra constitucin fsica en la elaboracin de compresores que aprovechen estas caractersticas para ofrecer una informacin aceptable a nuestros sentidos. Una connotacin de lo anterior es el ojo humano, el cual es muy bueno detectando pequeos cambios de brillo en reas relativamente grandes, pero no cuando el brillo cambia rpidamente en pequeas reas (variacin de alta frecuencia), esto permite eliminar las altas frecuencias, sin perder excesiva calidad visual. La compresin con prdidas se puede catalogar dentro de uno de los dos esquemas generales de compresin, los cuales son codificacin por entropa y codificacin de la fuente. La codificacin por entropa solo manipula la cadena de bits sin saber lo que significan los bits. Es una tcnica totalmente reversible y sin prdidas que se puede aplicar a cualquier tipo de datos. Por el otro lado tenemos la codificacin de la fuente o cuantizacin la cual aprovecha las caractersticas de los datos originales (voz, imagen o video) para realizar la compresin con un rango de tolerancia de prdidas de informacin.

CUANTIFICACIN ESCALAR
La cuantificacin escalar o codificacin diferencial es un mtodo en el cual el conjunto de datos de una fuente es codificado en un nmero muy menor de valores al original. Para ejemplizar esta tcnica consideremos que se tiene una seal de entrada que bien podra representar una seal de audio, la cual est definida por la siguiente expresin s ( t) := 4cos ( 2t ) la cual se aprecia grficamente a continuacin.

4 cos( 2 t )

0 t

La salida de un conversor A/D de esta seal se observa a continuacin

Por ejemplo, para una entrada con valor -1'856, la palabra de cdigo que da la salida del conversor A/D es 010. Ahora bien, si deseamos reconstruir la seal, a partir de este cdigo digital tendremos que asignarle a cada cdigo un valor real como se muestra a continuacin:

Por ejemplo, para una palabra de cdigo 010, la salida analgica sera -1'5. Al comparar o realizar la diferencia entre la salida del conversor A/D con la entrada del conversor D/A se aprecia evidentemente un error con respecto a la seal original, este error lo llamaremos error de cuantificacin el cual queda evidenciado en la siguiente tabla en la columna identificada como error.

El error obtenido encuentra su explicacin a travs de las regiones de decisin las cuales son un subconjunto de nmeros R1 , R2,... R L obtenidos al dividir un conjunto de nmeros

reales L. Los extremos de las L regiones de decisin se denominan niveles de decisin, ai de forma que se cumple
R := a
i

( i1 , ai)

Mientras la seal de entrada se encuentre ubicada en una regin de decisin Ri el i tal como se muestra en la siguiente figura cuantizador le asigna un nivel de cuantizacin x en donde i = ai ai 1

R1
X 1

R2 a1 a2

R3 a3

R4 a4

R5 a5

R6

R7

X 2

X 3

X 4

X 5

X 6

a6

Es importante poder obtener una estimacin de la calidad de informacin Entre los diferentes sistemas existentes para medir el error de cuantizacin producido por un cuantizador emplearemos la distorsin error cuadrtico medio.

También podría gustarte