Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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.
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:
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
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
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.
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
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
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
(98) (97) (110) (257) (97) (256) (258) (98) (111) (102) (259)
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
(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?).