O documento discute o algoritmo Lempel-Ziv-Welch (LZW) para compressão de dados. O LZW substitui sequências de caracteres por códigos para reduzir o tamanho dos arquivos, é sem perdas e rápido. O documento exemplifica o processo de compressão e descompressão usando uma tabela de strings codificadas.
13. Algoritmos de Compressão
› Um minuto de um vídeo HD pode
ocupar mais de 1 GB.
Como colocar duas horas de filme
em um disco blu-ray de 25 GB
apenas?
14. Algoritmos Lempel-Ziv-Welch (LZW)
› O algoritmo Lempel-Ziv-Welch é um dos
muitos algoritmos utilizados para comprimir
arquivos.
› É conhecido como um algoritmo sem
perdas, ou seja, durante a compressão
dados não são perdidos.
› Foi criado por Abraham Lempel, Jacob Ziv e
Terry Welch. Foi publicado por Welch em
1984 como um refinamento do algoritmo
LZ78 publicado por Lempel e Ziv, em 1978.
15. Algoritmo Lempel-Ziv-Welch
› Algoritmo LZW utiliza uma tabela
de strings.
› Em poucas palavras, a
compressão LZW substitui
sequências de caracteres por
códigos individuais.
› Os códigos 0-255 na tabela de
strings representam bytes
individuais do arquivo de entrada e
os códigos de 256 a 4.095 são
usados para representar as
sequências de bytes.
17. Compressão
› É baseada na construção de um dicionário de dados (grupo de um ou mais
caracteres) a partir do fluxo de entrada;
› Os padrões dos dados são identificados e registrados no dicionário;
› Quando é iniciado o algoritmo, verifica-se se o caractere já está inserido no
dicionário;
18. Pseudocódigo da Compressão
› As convenções adotadas são:
– raiz caracter individual
– string uma sequência de um ou mais caracteres
– palavra código valor associado a uma string
– dicionário tabela que relaciona palavras código e strings
– P string que representa um prefixo
– C caracter
– cW palavra código
– pW palavra código que representa um prefixo
– X <= Y string X assume o valor da string Y
– X+Y concatenação das string X e Y
– string(w) string correspondente à palavra código w
19. Pseudocódigo da Compressão
1. No início o dicionário contém todas as raízes possíveis e P é vazio;
2. C <= próximo caractere da sequência de entrada;
3. A string P+C existe no dicionário ?
a. se sim,
i. P <= P+C;
b. se não,
i. coloque a palavra código correspondente a P na seqüência
codificada;
ii. adicione a string P+C ao dicionário;
iii. P <= C;
4. Existem mais caracteres na seqüência de entrada ?
a. se sim,
i. volte ao passo 2;
b. se não,
ii. coloque a palavra código correspondente a P na seqüência
codificada;
iii. FIM.
22. Descompressão
› Na descompressão cada código é lido e comparado
com a tabela de códigos para fornecer a tradução.
› O primeiro passo é reconstruir a tabela de string da
mesma maneira como foi construída durante a
codificação;
› Desta forma, o decodificador baseia-se em uma
tabela, que é idêntica a utilizada pelo codificador, e
usa-a para decodificar os valores de entrada
subsequentes.
25. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
1º Passo: A tabela é
inicializada com todos os
valores possíveis de
caracteres.
Para o nosso exemplo serão
necessários apenas exibir os
caracteres que nos
interessa.
26. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
2º Passo:
pw = string.pw =
cw = 3 string.cw = w
A string.cw consta na tabela;
Imprime string.cw.
pw = cw => pw = 3
Console:
W
27. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
3º Passo:
pw = 3 string.pw = w
cw = 1 string.cw = a
A string.cw consta na tabela;
Imprime string.cw.
p = w p+c = wa
c = a
Adiciona p+c na tabela;
pw = cw => pw = 3
Console:
W A
28. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
4 wa
4º Passo:
pw = 1 string.pw = a
cw = 2 string.cw = b
A string.cw consta na tabela;
Imprime string.cw.
p = a p+c = ab
c = b
pw = cw => pw = 2
Console:
W A B
29. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
4 wa
5 ab
5º Passo:
pw = 2 string.pw = b
cw = 2 string.cw = b
A string.cw consta na tabela;
Imprime string.cw.
p = b p+c = bb
c = b
pw = cw => pw = 2
Console:
W A B B
30. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
4 wa
5 ab
6 bb
6º Passo:
pw = 2 string.pw = b
cw = 1 string.cw = a
A string.cw consta na tabela;
Imprime string.cw.
p = b p+c = ba
c = a
pw = cw => pw = 1
Console:
W A B B A
31. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
4 wa
5 ab
6 bb
7 ba
7º Passo:
pw = 1 string.pw = a
cw = 4 string.cw = wa
A string.cw consta na tabela;
Imprime string.cw.
p = a p+c = aw
c = w
pw = cw => pw = 4
Console:
W A B B A W A
32. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
4 wa
5 ab
6 bb
7 ba
8 aw
8º Passo:
pw = 4 string.pw = wa
cw = 6 string.cw = bb
A string.cw consta na tabela;
Imprime string.cw.
p = wa p+c = wab
c = b
pw = cw => pw = 6
Console:
W A B B A W A B B
33. Exemplo de Descompressão
Índice Dicionário
1 A
2 B
3 W
4 wa
5 ab
6 bb
7 ba
8 aw
9 wab
10 bba
9º Passo:
pw = 6 string.pw = bb
cw = 1 string.cw = a
A string.cw consta na tabela;
Imprime string.cw.
p = bb p+c = bba
c = a
pw = cw => pw = 1
Console:
O algoritmo terminou!
W A B B A W A B B A
34. Vantagens
› É muito eficaz na compressão de
sequências que apresentam algum tipo de
repetição nos dados de entrada;
› È simples de entender;
› Rápida execução;
› Não necessita de nenhuma informação a
priori sobre os dados de entrada;
› Pode comprimir dados em apenas um
passo;
› Faz a compressão e descompressão dos
arquivos.
35. Desvantagens
› Não comprime bem sequências pequenas;
› Não comprime bem sequências com caracteres muito
diversos;
› Arquivos longos degradam a taxa de compressão
conforme o arquivo é lido.
› A razão para isso é simples. Uma vez que a
tabela de strings é de tamanho finito, depois
que certo número de inserções foram feitas,
strings não mais podem ser adicionadas.
36. Considerações Finais
› Este método de compressão sem perdas é de baixa complexidade,
pelo fato de o LZW usar como seu principal foco a criação de
dicionários com comprimento fixo. Com isso, o desempenho
proporcionado pela compressão e descompressão é rápida.
› Comparando-o com algoritmos semelhantes, anteriores ao mesmo
(LZ77 e LZ78), é um dos algoritmos mais eficaz na redução do
tamanho do fluxo de dados comprimidos, obtendo uma maior
rapidez de execução.
37. Referências Bibliográficas
[1] WIKIPÉDIA. Disponível em:<
http://en.wikipedia.org/wiki/Lempel%E2%80%93Ziv%E2%80%93Welch > Acesso em 25 de maio
de 2015.
[2] The Scientist and Engineer’s Guide to Digital Sign Processing. Data 27: Data Compression – LZW
Compression. Disponível em: < http://www.dspguide.com/ch27/5.htm > Acesso em: 28 de maio de
2015.
[3] YOUTUBE. Lempel-Ziv-Welch Compression Algoritm – Tutorial. Disponível em:
<https://www.youtube.com/watch?v=j2HSd3HCpDs> Acesso em 27 de maio de 2015.
[4] Terry Welch, "A Technique for High-Performance Data Compression", Computer, June 19
[5] Mark Nelson. Programming mostly. Disponível em: < http://marknelson.us/1989/10/01/lzw-
data-compression/ > Acesso em: 27 de maio de 2015.
[6] MITOPENCOURSEWARE.Massachusetts Institute of Technology. Unit Two: Compression, Lecture
One. Disponível em: >http://ocw.mit.edu/courses/electrical-engineering-and-computer-
science/6-050j-information-and-entropy-spring-2008/videos-homework-and-readings/unit-2-
lecture-1/ > Acesso em 28 de maio de 2015.
[7] Implementações do LZW. Disponível em: <http://rosettacode.org/wiki/LZW_compression>
Acesso em 27 de maio de 2015.