LZ77: diferenças entre revisões

Conteúdo apagado Conteúdo adicionado
ArthurBot (discussão | contribs)
m Bot: Adicionando: cs:LZ77
LeoBot (discussão | contribs)
Checkwiki: limpeza de sintaxe a partir do erro 61 utilizando AWB
Linha 1:
'''LZ77''' foi um dos [[algoritmo]]s de [[compressão de dados]] desenvolvidos por Abraham Lempel e Jacob Ziv em [[1977]], juntamente com o outro algoritmo de compressão [[LZ78]] publicado em [[1978]]. Nos primeiros artigos publicados eles eram conhecidos por LZ1 e LZ2 respectivamente e só depois ganharam o ano de sua publicação em suas siglas.<ref name="salomon">{{referência a livro|Autor=SALOMON, David|Título=Data Compression|Subtítulo=The Complete Reference|Editora=Springer|Local de publicação=Nova Iorque|Ano=2000|Edição=2}}</ref>.
 
O algoritmo LZ77 se baseia na utilização das partes que já foram lidas de de um [[arquivo]] como um dicionário, substituindo as próximas ocorrências das mesmas seqüências de [[caracteres]] pela posição (absoluta ou relativa) da sua última ocorrência. Para limitar o espaço de busca e de [[endereço|endereçamento]] necessário, as ocorrências anteriores são limitadas por uma "janela deslizante" (do inglês ''sliding window'') que tem tamanho fixo e "desliza" sobre o arquivo, delimitando o início e fim da área onde serão buscadas as ocorrências anteriores. O tamanho desta janela é um dos fatores primordiais para se ajustar a performance desse algoritmo.
 
== Algoritmo ==
 
O [[algoritmo]] LZ77 é relativamente simples. Define-se inicialmente duas estruturas que serão usadas: A ''janela'' de procura, e o ''buffer'' de ''look-ahead'' (num tradução livre poderia ser chamado de ''buffer'' de pré-visualização). A janela representa as partes do [[arquivo]] que já foram lidos, enquanto o ''look-ahead'' representa o que ainda será lido e processado pelo algoritmo. Na prática, o ''look-ahead'' é preenchido de antemão com os próximos [[byte]]s a serem processados pelo compressor. A janela tem tamanho definido, e deve permitir que os dados sejam [[fila|enfileirados]] dentro dela, eliminando os bytes mais antigos quando seu limite de tamanho é atingido. O ''buffer'' de ''look-ahead'' também tem tamanho definido, em geral dezenas de vezes menor que a ''janela''.
 
Linha 18 ⟶ 17:
 
== Exemplo ==
 
Abaixo ilustramos o [[algoritmo]] LZ77 com um exemplo da compressão da cadeia <code>A_ASA_DA_CASA</code>, usando janela de tamanho 8 e ''buffer'' de ''look-ahead'' de tamanho 4.
 
Linha 62 ⟶ 60:
== Aplicações ==
Alguns programas e formatos de compressão de dados largamente utilizados usam este algoritmo, pois ao contrário do [[LZ78]] e do [[LZW]], seus parentes mais próximos, ele não estava coberto por patentes. A variante mais comum do LZ77 é conhecida como [[DEFLATE]] e combina o uso de LZ77 com o uso de [[Codificação de Huffman|Código Huffman]]. Entre os programas e formatos que usam LZ77 e [[DEFLATE]] temos:
* O programa [[PKZIP]] e o formato de arquivos [[ZIP]] (além de todos os outros programas baseados nesse formato).
* O programa [[gzip]].
* O formato de imagens [[PNG]].
 
== Exemplo de implementação ==
<source lang="python">
# !/usr/bin/python
# coding: utf-8
 
Linha 109 ⟶ 107:
buffer = str[i:i+self.buffer_size]
tuple = (0, 0, str[i])
# Este "loop" é o "coração" do algoritmo. Aqui procuramos
# a maior seqüência dentro da janela (window) que case
# com o início do buffer. A implementação atual simplesmente
# procura por ocorrências de substrings cada vez menores
# do buffer até encontrar alguma. Implementações mais
# eficientes usariam um dicionário de prefixos, uma trie
# ou uma tabela de espalhamento.
for size in range(len(buffer), 0, -1):
index = window.rfind(buffer[0:size])
if index >= 0:
literal = '' # a string vazia representa
# o final do arquivo.
if i + size < len(str):
literal = str[i+size]
Linha 150 ⟶ 148:
print decoded
</source>
{{ref-section}}
== Referências ==
<references />
 
== {{Bibliografia}} ==
* ZIV, Jacob, LEMPEL, Abraham; ''A Universal Algorithm for Sequential Data Compression'', IEEE Transactions on Information Theory, 23(3), pp.&nbsp;337-343, maio de 1977. Disponível em formato PDF em http://www.cs.duke.edu/courses/spring03/cps296.5/papers/ziv_lempel_1977_universal_algorithm.pdf
 
*ZIV, Jacob, LEMPEL, Abraham; ''A Universal Algorithm for Sequential Data Compression'', IEEE Transactions on Information Theory, 23(3), pp.337-343, maio de 1977. Disponível em formato PDF em http://www.cs.duke.edu/courses/spring03/cps296.5/papers/ziv_lempel_1977_universal_algorithm.pdf
 
== {{Ver também}} ==
* [[LZ78]]
 
* [[LZ78DEFLATE]]
* [[compressão sem perda de dados]]
*[[DEFLATE]]
* [[Codificação Run-length]]
*[[compressão sem perda de dados]]
*[[Codificação Run-length]]
 
{{esboço-prog}}