Você está na página 1de 8

Algoritmos Lempel-Ziv

o Teoria da Informac a 2o Semestre de 2006/2007

o 1 Introduc a
V arios m etodos de compress ao tais como os c odigos de blocos, aritm eticos, ou de entropia necessitam a priori de conhecer as probabilidades dos s mbolos que comp oem a sequ encia que se pretende codicar. Por vezes este conhecimento e dif cil sen ao imposs vel de obter, al em de que o processo gerador dos s mbolos pode ter uma caracter stica din amica e as suas estat sticas variarem ao longo do tempo. Uma das principais vantagens dos c odigos Lempel-Ziv e que n ao requerem informac a o a priori sobre a distribuic a o dos dados a codicar. Os algoritmos Lempel-Ziv baseiam-se no princ pio de compress ao por substituic a o. No conjunto de dados a codicar, novas sequ encias de s mbolos s ao substitu das por refer encias a ocorr encias anteriores da mesmas sequ encias. N ao existe a noc a o de correspond encia entre s mbolos (ou conjuntos de s mbolos) e palavras de c odigo. Nos algoritmos Lempel-Ziv, as sequ encias s ao sempre associadas a palavras de c odigo de comprimento constante. Os dados s ao sub-divididos num conjunto de sequ encias - o dicion ario- que vai aumentando a ` medida que novos dados s ao analisados. As sequ encias de s mbolos mais prov aveis v ao sendo concatenadas com novos s mbolos e adicionadas ao dicion ario permitindo substituir cada vez maiores sequ encias por palavras de c odigo de mesmo comprimento. O dicion ario n ao e enviado explicitamente, sendo constru do a ` medida que s ao observados novos s mbolos tanto no codicador como no descodicador.

Autoria de Gonc alo Marques e de Pedro Mendes Jorge

2 Algoritmo LZ77

Existem duas principais vers oes dos algoritmos Lempel-Ziv: o LZ77 e o LZ78. Estas s ao descritas de seguida, assim como uma variac a o do algoritmo LZ78: o alogritmo LZW.

2 Algoritmo LZ77
Este algoritmo e baseado em duas janelas cont guas de tamanho xo: a primeira e geralmente denominada de dicion ario e a segunda de lookahead bufferou simplesmente de buffer. A posic a o das janelas vai sendo deslocada a ` medida que os s mbolos v ao sendo codicados. Um dicion ario de comprimento Nd e uma janela que cont em os u ltimos Nd s mbolos codicados. Um buffer de comprimento Nb e uma janela que cont em os pr oximos Nb a codicar. O cursor e um apontador para o pr oximo s mbolo a codicar (primeira posic a o do lookahead buffer). O algoritmo LZ77 divide a sequ encia de s mbolos a codicar num conjunto de sub-sequ encias, e associa a cada sub-sequ encia um c odigo composto por 2 inteiros e um s mbolo (caracter). Este processo e descrito de seguinda.

2.1 Pseudo-c odigo LZ77 - Codicador


Inicializa-se o buffer (de dimens ao Nb ) com os primeiros Nb s mbolos da sequ encia a codicar. Inicialmente o dicion ario n ao cont em nenhum s mbolo. Enquanto houver s mbolos para codicar Identicar no dicion ario a maior sequ encia de s mbolos que tamb em esteja presente no buffer (a comec ar no cursor). Associar a ` sequ encia o seguinte c odigoa (p, l, c), onde p e posic a o relativa (a contar do cursor) da maior sequ encia do dicion ario. le comprimento da maior sequ encia. ce s mbolo do buffer que se segue a ` sequ encia. Deslocar as janeles (dicion ario e buffer) de l + 1 s mbolos.
O c odigo (p, l, c) signica que a sequ encia no buffer pode ser obtida recuando p s mbolos no dicion ario, copiando l s mbolos a partir da , e acrescentando no m o s mbolo c.
a

2.1 Pseudo-c odigo LZ77 - Codicador

o Quest oes de Implementac a 1o caso: Quando n ao existe nenhuma sequ encia no dicion ario que corresponda a ` s sequ encias do buffer (a comec ar no cursor), ent ao o c odigo para estes casos e (0, 0, c), onde c e o 1o s mbolo do buffer. vantajoso poder codicar certas sequ E encias com p < l. Por exemplo, considere a seguinte situac a o: a b r o t e t e t e t e a s
dicion ario buffer

2o caso:

Neste caso o c odigo ser a (2, 5, a), o que signica:


recua 2 s mbolos no dicionario, copia os 5 s mbolos que se seguem, e acrescenta um ano m.

Visto que para p = 2, s o sobram 2 s mbolos no dicion ario (o ee o t), o que se faz e uma c opia circular: recomec a-se a copiar os s mbolos a partir da posic a o p quando se atinge o m do dicion ario. o: 2.1.1 Exemplo LZ77 - Codicac a Sequ encia a codicar: bananabanabofana Nd = 6 (comprimento do dicion ario). Nb = 4 (comprimento do buffer).

b a
dicion ario

a n

b a

a b

o f

n a

(0, 0, b)

buffer

b a
dicion ario

a n

b a

a b

o f

n a

(0, 0, a)

buffer

b a
dicion ario

a n
buffer

b a

a b

o f

n a

(0, 0, n)

b a
dicion ario

a n

b a

a b

o f

n a

(2, 3, b)

buffer

b a

a n

b a

a b

o f

n a

(4, 4, o)

dicion ario

buffer

b a

a n

b a

a b

o f

n a

(0, 0, f)

dicion ario

buffer

b a

a n

b a

a b

o f

n a
buffer

(6, 3, Null)

dicion ario

2.2 LZ77 - Descodicador

2.2 LZ77 - Descodicador


O processo de descodicac a o consiste somente em interpretar as palavras de c odigo recebidas. ` medida que a sequ A encia e formada, serve de base para descodicar futuras palavras de c odigo. o: 2.2.1 Exemplo LZ77 - Descodicac a Sequ encia de palavras de c odigo: (0, 0, p), (0, 0, a), (2, 2, i), (4, 5, b), (0, 0, o), (0, 0, f), (6, 3, s). C odigo (0, 0, p) (0, 0, a) (2, 2, i) (4, 5, b) (0, 0, o) (0, 0, f) (6, 3, s) Sequ encia Descodicada p p a p a p p p p a a a a i i a p a i a i a i a i a b b b b o o f a i a s

p a p a p a p a p a

i a i a i a

p a p a p a

o f

3 Algoritmo LZ78
Este algoritmo difere do LZ77 na forma como gere e actualiza o dicion ario. Em vez de ter uma janela deslizante, o dicion ario e uma tabela de sequ encias que j a tenham sido analisadas no processo de codicac a o. N ao existe limite no n umero de sequ encias que formam o dicion ario, Assim e poss vel que uma determinada sequ encia encontre uma ocorr encia na tabela (dicion ario), mesmo que esta tenha acontecido muito atr as no processo de subdivis ao, o que n ao acontecia com o LZ77 dado que o dicion ario estava limitado pelo tamanho da janela. No algoritmo LZ78, o dicion ario tem a caracter stica de prexo, isto e , uma determinada sequ encia e guardada no dicion ario porque existe tamb em o seu prexo. O dicion ario n ao e enviado explicitamente mas e formado no processo de descodicac a o. O algoritmo LZ78 codica novas sequ encias com apenas um n umero e um caracter. O n umero corresponde a ` entrada do dicion ario que cont em

3.1 Pseudo-c odigo LZ78 - Codicador

a sequ encia com todos os s mbolos, a ` excepc a o do u ltimo, da nova sequ encia. O caracter e o u ltimo s mbolo da nova sequ encia. Este algoritmo e de seguida descrito.

3.1 Pseudo-c odigo LZ78 - Codicador


Dicion ario=Null (inicialmente o Dicion ario n ao cont em nenhuma sequ encia). String =Null. Enquanto houver s mbolos para codicar c= pr oximo s mbolo Se String +c e uma sequ encia presente no Dicion ario String = String +c Caso contr ario Enviar c odigo ( ndice de String no Dicion ario, c) Actualizar Dicion ario com String +c String =Null o: 3.1.1 Exemplo LZ78 - Codicac a Sequ encia a codicar: bananabanabofana cursor (in cio da sequ encia a codicar) b a b a n a n a n a n n n n n n a a a a a a n n n n n a b a b a b a b a b b a a a a a a n a n a n a n a n a n a n n n a b o b o b o b o b o b o b o o f f f f f f f f a a a a a a a a a n a n a n a n a n a n a n a n a n a Dic. 1. b 2. a 3. n 4. an 5. ab 6. ana 7. bo 8. f C odigo (0,b) (0, a) (0, n) (2, n) (2, b) (4, a) (1,o) (0,f) (6, Null)

b a b a b a b a b a b a b a

n a n a n a n a

b a b a b a

a b a b

o f

3.2 LZ78 - Descodicador

3.2 LZ78 - Descodicador


Mais uma vez, o processo de descodicac a o e extremamente simples: a sa da e composta pela sequ encia correspondente ao ndice enviado e acrescenta-se no m dessa sequ encia o s mbolo enviado. Por m, a sequ encia mais o s mbolo enviados s ao adicionados ao dicion ario, e o processo e repetido para o novo c odigo. o: 3.2.1 Exemplo LZ78 - Descodicac a Sequ encia de palavras de c odigo: (0, p), (0, a), (1, a), (0, i), (2, p), (2, i), (2, b), (0, o), (0, f), (6, a) C odigo (0, p) (0, a) (1, a) (0, i) (2, p) (2, i) (2, b) (0, o) (0, f) (6, a) Sequ encia Descodicada p p a p a p p p p p p p a a a a a a a i i a p p a i i a b b b b o o f a i a Dicin ario 1. p 2. a 3. pa 4. i 5. ap 6. ai 7. ab 8. o 9. f 10. aia

p a p a p a p a p a p a p a p a

i a i a i a i a i a

p a p a p a p a

i a i a i a

o f

3.3 Algoritmo LZW


O algoritmo LZW (Lempel-Ziv-Welch) e uma modicac a o do LZ78. Esta modicac a o consiste em excluir o s mbolo das palavras de c odigo. O algoritmo inicializa o dicion ario com todos os s mbolos do alfabeto da fonte. Assim, o dicion ario cont em o alfabeto b asico e todas a sequ encias codicadas podem ser representadas somente com ndices. O procedimento de codicac a o e descrito pelo seguinte pseudo-c odigo. 3.3.1 Pseudo-c odigo LZW - Codicador Dicion ario=todos os s mbolos da fonte (por exemplo a tabela ASCII) 6

3.3 Algoritmo LZW

String =1o s mbolo da sequ encia a codicar Enquanto houver s mbolos para codicar c= pr oximo s mbolo Se String +c e uma sequ encia presente no Dicion ario String = String +c Caso contr ario Enviar c odigo ( ndice de String no Dicion ario) Actualizar Dicion ario com String +c String = c Enviar c odigo ( ndice de String no Dicion ario) o: 3.3.2 Exemplo LZW - Codicac a Sequ encia a codicar: bananabanabofana Dicion ario inicializado com a tabela ASCII estendida (de 0 a 255) String inicializada com o 1o caracter da sequ encia
Iter.

String b a n a an a b ba n na b o f a an

c a n a n a b a n a b o f a n a b b b b b b b b b b b b b b b a a a a a a a a a a a a a a a n n n n n n n n n n n n n n n a a a a a a a a a a a a a a a n n n n n n n n n n n n n n n a a a a a a a a a a a a a a a

Sequ encia b b b b b b b b b b b b b b b a a a a a a a a a a a a a a a n n n n n n n n n n n n n n n a a a a a a a a a a a a a a a b b b b b b b b b b b b b b b o o o o o o o o o o o o o o o f f f f f f f f f f f f f f f a a a a a a a a a a a a a a a n n n n n n n n n n n n n n n a a a a a a a a a a a a a a a

Dic. 256. ba 257. an 258. na 259. ana 260. ab 261. ban 262. nab 263. bo 264. of 265. fa -

C odigo

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

(98) (97) (110) (257) (97) (256) (258) (98) (111) (102) (259)

3.3 Algoritmo LZW

3.3.3 Pseudo-C odigo LZW - Descodicador Dicion ario=todos os s mbolos da fonte (por exemplo a tabela ASCII) Stringold = sequ encia correspondente ao 1o c odigo Sa da = Stringold Enquanto houver c odigos para descodicar Ler novo c odigo Stringnew = sequ encia correspondente a novo c odigo Sa da = Stringnew c = 1o s mbolo de Stringnew Adicionar Stringold + c a Dicion ario Stringold = Stringnew 3.3.4 Exemplo LZW -Descodicador Sequ encia de palavras de c odigo: (112), (97), (256), (105), (257), (97), (259), (98), (111), (102), (261), (97) Dicion ario inicializado com tabela ASCII estendida.
C odigo Stringold Stringnew

Dic. 256. pa 257. ap 258. pai 259. ia 260. apa 261. ai 262. iab 263. bo 264. of 265. fa 266. aia p p p p p p p p p p p a a a a a a a a a a a p p p p p p p p p p

Sequ encia descodicada

(97) (256) (105) (257) (97) (259) (98) (111) (102) (261) (97)

p a pa i ap a ia b o f ai

a pa i ap a ia b o f ai a

a a a a a a a a a a i i i i i i i i i a a a a a a a a p p p p p p p p a a a a a a a i i i i i i a a a a a a b b b b b o o o o f f f a a i i a

Mais uma vez, o processo de descodicac a o e muito simples - e neste caso particular do algoritmo LZW - demasiado simples (e se aparecesse a sequ encia ananananona?).

Você também pode gostar