Sunteți pe pagina 1din 21

FACULTAD DE INGENIERA ELCTRICA Y ELECTRNICA TEORA DE INFORMACIN Y CODIFICACIN CDIGOS LEMPEL ZIV

INTRODUCCIN:

Los creadores de este clsico algoritmo de compresin fueron Abraham Lempel y Jakob Ziv en el ao 1977, naca el LZ77. Terry Welch mejorar el sistema en 1984 (denominado compresin LZW). Se utiliza en por ejemplo, UNIX compress, GIF. El mtodo que desarrollaron Abraham Lempel, informtico, y de Jacob Ziv, ingeniero electrnico, se basa en el hecho de que en un archivo aparecen secuencias idnticas de bits y bytes. La primera vez que una secuencia aparece en el texto, se introduce en una especie de diccionario. Cuando vuelve a aparecer la misma secuencia, un marcador seala el lugar adecuado del diccionario. Dado que el marcador ocupa menos espacio que la secuencia, el texto se comprime. Pero an hay mas. La distribucin de la tabla que lista todas las secuencias no sigue las reglas de clasificacin de un diccionario normal, si no que se adapta al archivo en concreto que queremos comprimir. El algoritmo <<aprende>> a distinguir qu secuencias aparecen mas a menudo y adapta la compresin a ellas. Cuando el tamao del archivo aumenta, el espacio necesario para almacenarlo crece hacia la entropa del

ALGORITMO LEMPEL-ZIV

En esta tcnica, durante el proceso de codificacin el emisor va construyendo una tabla o diccionario con la informacin que va tratando. Cada entrada al diccionario consiste en un par (n,Ai), donde n es un 'puntero' a otra localizacin del diccionario y Ai es un smbolo del alfabeto fuente. Todas las palabras de cdigo (a las que tambin llamaremos bloques codificados) tendrn la misma longitud previamente determinada. Esta longitud ser conocida por el emisor y por el receptor. Si la longitud de las palabras de cdigo se ha fijado en m bits, los m-1 bits primeros se utilizan para buscar elementos que ya han aparecido en la tabla y al ltimo bit se le denomina bit de innovacin.

ALGORITMO LEMPEL-ZIV
El nmero de entradas o posiciones de la tabla es funcin de la longitud de palabra de cdigo y ser de 2 elevado a la m-1. En la cadena de entrada se buscarn sub secuencias que no coincidan con ninguna de las sub secuencias que ya se han almacenado en la tabla, y se aadirn a la tabla. Cuando la tabla ya se ha llenado, las nuevas sub secuencias que se busquen debern ser igual a alguna que ya est en la tabla concatenndole un bit 0 o 1.

ALGORITMO LEMPEL-ZIV

La idea bsica consiste en dividir la cadena original en sub cadenas que no hayan sido encontradas anteriormente. Esto se repite hasta completar todas las entradas de la tabla. Una vez llena la tabla, se empiezan a repetir las codificaciones. Es muy importante el tamao que se escoge para la palabra codificada. Cuanto mayor sea (dentro de un rango) mayor ndice de compresin se lograr. Podra ocurrir que si inicialmente se repiten mucho unas secuencias y con ellas llenamos la tabla, cuando ya no se puedan introducir ms secuencias en la tabla habremos llegado al lmite y podremos obtener malos resultados.

ALGORITMO LEMPEL-ZIV

Cdigo universal - funciona sin conocimiento de estadsticas de fuente Analiza sintcticamente el archivo de entrada en frases unvocas Codifica frases empleando palabras cdigo de longitud fija Codificacin de longitud variable a fija Analizar el archivo de entrada en frases que an no han aparecido Entrar frases en un diccionario Numerar su ubicacin Observe que cada frase nueva debe ser una frase vieja seguida por un 0 o un 1 Puede codificar la nueva frase utilizando la ubicacin del diccionario de la frase anterior seguida por el 0 o el 1

CONSTRUCCIN DE LA TABLA PARA EL PROCESO DE CODIFICACIN


La tabla que se construye durante el proceso de codificacin est formada por 4 columnas: La primera columna de la tabla se denomina "Posiciones Numricas" e indica las posiciones numricas de las sub secuencias individuales de la tabla de cdigos. La segunda columna de la tabla se denomina "Sub secuencias" e indica las sub secuencias individuales de la tabla de cdigos. El ltimo smbolo de cada sub secuencia es el bit de innovacin: la presencia de ese bit es lo que diferencia la sub secuencia de las anteriores. El resto de los bits son la sub secuencia raz.

CONSTRUCCIN DE LA TABLA PARA EL PROCESO DE CODIFICACIN

La tercera columna de la tabla se denomina "Representaciones Numricas" e indica las posiciones numricas de las sub secuencias que componen la nueva sub cadena. La cuarta columna de la tabla se denomina "Bloques Binarios Codificados" e indica la codificacin para la sub secuencia correspondiente a esa fila. Para obtener la codificacin, primero se codifica el primer dgito que compone la representacin numrica mediante m-1 bits, y a continuacin se le concatena el bit asociado a la posicin numrica especificada por el segundo dgito que compone la representacin numrica. De esta forma obtenemos la palabra de cdigo que se transmitir.

PROCESO DE DECODIFICACIN

En el proceso de decodificacin el receptor recibe las palabras de cdigo y a partir de ellas construye su propia tabla de forma similar a como lo haca el emisor. La tabla creada por el receptor coincidir con la elaborada por el emisor en el proceso de codificacin. En la tabla del receptor, las dos primeras entradas se inicializan con las sub secuencias 0 y 1. A continuacin se procesa cada palabra de cdigo recibida. Para cada palabra de cdigo se toma la sub secuencia raz, se interpreta como si fuera binario natural obteniendo un nmero decimal que indicar una de las entradas de la tabla. A continuacin se toma la sub secuencia asociada a esa entrada de la tabla y se concatena el bit de innovacin. De esta forma obtenemos la sub secuencia original enviada por el emisor. Cada vez que realizamos una decodificacin, si la tabla no est llena, el receptor aadir esta decodificacin a la

NOTAS ACERCA DE LEMPEL-ZIV


El decodificador slo puede decodificar unvocamente la secuencia enviada El algoritmo no es eficiente para secuencias cortas (datos de entrada) El rendimiento del cdigo se aproxima a la entropa de fuente para secuencias largas El tamao del diccionario debe elegirse con antelacin para que se pueda establecer la longitud de la palabra cdigo Lempel-Ziv se usa frecuentemente para codificar archivos de texto/binarios Comprimir/descomprimir bajo unix Mismo software de compresin para PC y MAC

EJEMPLO:

Un ejemplo ayudar a ver cmo se llevan a cabo la compresin y la descompresin. Utilizaremos una simplificacin de uno propuesto por los creadores del algoritmo. Supongamos que queremos codificar la secuencia S=001010210210212021021200... Por razones didcticas (aunque no prcticas) usaremos un buffer de longitud n=18 y una longitud mxima de cadena Ls de 9. Inicialmente se llenan las n-Ls posiciones del buffer con ceros, y las Ls restantes con los primeros datos de la secuncia, con lo que el buffer en la posicin inicial quedara como se ve en la figura 2.

La extensin reproducible de Ls, empezando a buscar en la parte ya "codificada" (las n-Ls primeras posiciones del buffer), aparece en gris. La primera sub cadena a codificar se formar a partir de esa extensin reproducible, 00, seguida del siguiente elemento que ya no est repetido 1, luego S1=001. La palabra cdigo que representa a esa sub cadena ser, por convenio y en ese orden, el puntero al comienzo de la repeticin menos 1, seguido de la longitud de la repeticin, seguido del elemento final, que no entraba en la repeticin. Es decir, para este caso: C1=021. Puesto que S1 tena longitud 3, todo el contenido del buffer es desplazado hacia la izquierda 3 posiciones. En esta situacin 2 seguiremos, como siempre, a partir de la posicin 10, buscando la extensin reproducible de 0102... La encontramos en la figura 3.

Aqu, la extensin peridica de los elementos a partir de la posicin 10 se haya en la posicin 8. Empezando tanto por 8 como por 10 encontramos la secuencia 010, as que S2 es la parte que se repite del comienzo de Ls, 010 (posiciones 10 a 12), ms el siguiente elemento, 2, que ya no se repite (posicin 13). Luego S2=0102, que se codifica cmo C2=732. Desplazamos 4 posiciones a la izquierda, que es lo que mide S2, y la "repeticin'' de la secuencia Ls se encuentra en la zona marcada en la figura 4.

En ella se observa con claridad que, dado que Ls empieza por 10, haba una repeticin en las posiciones 5 y 6, que tambin son 10, que sin embargo no hemos marcado en negrita dentro de la figura. Esto es debido a que la secuencia formada por las posiciones 5 y 6, si bien representa una repeticin de lo que aparece en Ls, no se trata de su extensin peridica ya que tiene longitud 2, mientras que la coloreada en la figura tiene longitud mayor: 7. Por ello S3=10210212 y C3=672. Por ltimo, tras desplazar las 8 posiciones que ocupa S3, se obtiene S4=021021200 y C4=280 (figura 5).

Comprobemos que la secuencia comprimida C=821732672280 puede decodificarse unvocamente dando como resultado la secuencia original S=001010210210212021021200. Es importante darse cuenta de que, si bien la longitud de las sub cadenas no es fija (aunque s limitada), la de las palabras cdigo s lo es: en este caso, 3 caracteres. Esto permite separar a partir de C palabra cdigo de palabra cdigo de forma simple. Incluso dentro de una misma palabra cdigo, los tamaos asignados a una u otra funcin (posicin a partir de la que empieza una repeticin, longitud de esta y elemento siguiente a ella), son tambin fijos, y fcilmente separables, La longitud de cada uno de estos campos, y de la palabra cdigo como suma de todos ellos, est directamente relacionada con el tamao del buffer, n, y con el de la mxima sub cadena, Ls. Ms detalles se pueden encontrar en el artculo de Lempel-Ziv.

Para descomprimir se emplea un buffer de longitud n-Ls donde se van guardando los smbolos descodificados. Inicialmente el buffer se pone todo a 0. Seguidamente se van leyendo palabras cdigo, lo cual puede hacerse sin especiales cuidados al tener todas la misma longitud. Tambin en este caso ilustraremos la descompresin paso por paso. El primero se ilustra en la figura 6.

La primera palabra que se lee es '021'. El '0' sirve de puntero en el buffer, y lo llamaremos "p''. Se debe leer el carcter que est en la posicin p+1, luego se lee el de la posicin 1. Como inicialmente el buffer estaba puesto a 0, no sorprende que lo que encontremos en la posicin 1 sea un '0'. Tal y como est el buffer, se desplazan todos sus elementos una posicin hacia la izquierda, y en el hueco que queda a la derecha se introduce el carcter ledo con anterioridad en esa posicin 1. El segundo carcter de la palabra cdigo es un '2'. Ello indica que la operacin anterior de leer y desplazar se debe hacer dos veces, por lo que la repetimos: nuevamente se lee la posicin 1. Aunque la posicin es la misma, el dato ledo no tiene por qu serlo, ya que el buffer se desplaz hacia la izquierda. En este caso volvemos a tener un '0', y el buffer tiene el mismo aspecto que antes. Al segundo elemento de las palabras cdigo lo llamaremos a partir de ahora "n''. Puesto que ya hemos hecho dos veces la operacin, tantas como indicaba el n de la palabra cdigo que estamos decodificando, ahora se desplaza una vez ms a la izquierda, y en el hueco que ha aparecido se introduce el tercer carcter de la palabra cdigo (a partir de ahora "c''), sin modificar: el '1'. Al final de todas las figuras se resalta en negrita la parte del buffer que corresponde a la descodificacin de la palabra cdigo. Evidentemente, este tramo se encuentra siempre al final del buffer, y su longitud es bien simple de calcular: n+1.

La siguiente palabra a decodificar es 732. Como antes, y esta vez por 3 veces, se guarda el carcter de la posicin 7+1 y se coloca a la derecha del buffer tras desplazarlo. El ltimo carcter que se introduce por la derecha nos viene dado en la palabra cdigo: ahora es un '2' (figura 7).

El proceso con las dos palabras cdigo restantes es exactamente igual, y no requieren mayor explicacin. No obstante, se ofrecen las figuras correspondientes para que el lector interesado pueda seguir el proceso hasta el final (figuras 8 y 9).

Extrayendo los tramos en negrita del final de cada paso, obtenemos 001, 0102, 10210212 y 021021200, que juntos vuelven a conformar la secuencia original S.

S-ar putea să vă placă și