[RESOLVIDO] Algoritmo de Compressao LZW

3 respostas
gpd38

Alguem me explique se possivel como poderia fazer esse algoritmo funcionar.

Olhei no google, wikipedia e outros sites e o que encontrei foi um pseudo-codigo(ate aqui beleza).

Site01: [url]http://pt.wikipedia.org/wiki/LZW[/url]
Site02: [url]http://www.cs.sfu.ca/CC/365/li/squeeze/LZW.html[/url]

Peguei este pseudo-codigo e implementei. Esta funcionando em parte pois existe um pequeno erro que nao consigo tratar.

É o seguinte.

O lzw funciona da seguinte maneira:
(minha interpretação)

Existe um dicionario de tamanho x onde nele sa existem os caracteres A...Z.mais o espaço(ascii-32)
dicionario d = new dicionario[10000];
//...
//...
posicao[ 0 ]  possui:  A;
posicao[ 1 ]  possui:  B;
posicao[ 2 ]  possui:  C;
posicao[ 3 ]  possui:  D;
//...
//...
posicao[ 25 ]  possui:  Y;
posicao[ 26 ]  possui:  W;
posicao[ 27 ]  possui:  espaço;
Leio de um arquivo o texto a ser comprimido.
String texto;
//ex: texto = "A CASA E AMARELA A CASA E BONITA A CASA TEM UM CARRO AZULADO";
Crio duas Strings que serao a minha concatenação para inserir no dicionario e uma outra para receber os caracteres
String concat = "";
String caracter = "";
Apos ter lido o texto o que faço?
1. No início o dicionário contém todas as raízes possíveis e I é vazio;
2. c <= próximo caractere da sequência de entrada;
3. A string I+c existe no dicionário?
        a. se sim,
                i. I <= I+c;
        b. se não,
                i. coloque a palavra código correspondente a I na sequência codificada;
                ii. adicione a string I+c ao dicionário;
                iii. I <= c;
4. Existem mais caracteres na sequência de entrada ?
        a. se sim,
                i. volte ao passo 2;
        b. se não,
                ii. coloque a palavra código correspondente a I na sequência codificada;
                iii. FIM.

Neste ponto se eu pedir para mostrar o que foi guardado no vetor ou melhor no dicionario ele deve sair assim:

/_ = ESPACO(REPRESENTAÇÃO)
 posicao[ 28 ]  possui:   A_              sucesso pos: 1    -      erro pos: 27
 posicao[ 29 ]  possui:   CA              sucesso pos: 2    -      erro pos: 1
 posicao[ 30 ]  possui:   SA              sucesso pos: 19    -      erro pos: 1
 posicao[ 31 ]  possui:    _E              sucesso pos: 27    -      erro pos: 5
 posicao[ 32 ]  possui:    _A              sucesso pos: 27    -      erro pos: 1
 posicao[ 33 ]  possui:   MA              sucesso pos: 13    -      erro pos: 1
 posicao[ 34 ]  possui:   RE              sucesso pos: 18    -      erro pos: 5
 posicao[ 35 ]  possui:   LA              sucesso pos: 12    -      erro pos: 1
 posicao[ 36 ]  possui:    _A_              sucesso pos: 32    -      erro pos: 27
 posicao[ 37 ]  possui:   CAS              sucesso pos: 29    -      erro pos: 19
 posicao[ 38 ]  possui:   A_E              sucesso pos: 28    -      erro pos: 5
 posicao[ 39 ]  possui:   _B                sucesso pos: 27    -      erro pos: 2
 posicao[ 40 ]  possui:   ON              sucesso pos: 15    -      erro pos: 13
 posicao[ 41 ]  possui:   IT              sucesso pos: 9    -      erro pos: 20
 posicao[ 42 ]  possui:   A_A              sucesso pos: 28    -      erro pos: 1
 posicao[ 43 ]  possui:   _C               sucesso pos: 27    -      erro pos: 3
 posicao[ 44 ]  possui:   AS              sucesso pos: 1    -      erro pos: 19
 posicao[ 45 ]  possui:   A_T              sucesso pos: 28    -      erro pos: 20
 posicao[ 46 ]  possui:   EM              sucesso pos:  5   -      erro pos: 13
 posicao[ 47 ]  possui:   _U              sucesso pos: 27    -      erro pos: 21
 posicao[ 48 ]  possui:   M_              sucesso pos: 13    -      erro pos: 27
 posicao[ 49 ]  possui:   CAR              sucesso pos: 29    -      erro pos: 18
 posicao[ 50 ]  possui:   RO              sucesso pos: 18    -      erro pos: 15
 posicao[ 51 ]  possui:   _AZ              sucesso pos: 32    -      erro pos: 25
 posicao[ 52 ]  possui:   UL              sucesso pos: 21    -      erro pos: 12
 posicao[ 53 ]  possui:   AD              sucesso pos: 1    -      erro pos: 4
 posicao[ 54 ]  possui:    (-------)AQUI ESTA O PROBLEMA O CARACTER 'O' NAO É GRAVADO POIS JA EXISTE E O TEXTO TBM ACABOU

Como eu consigo resolver este problema, pois as vezes nao sobra um caracter e sim varios

3 Respostas

Luca

Olá

Não posso responder corretamente agora pois isto me exigiria consultar coisas muito antigas ou procurar meus livros do Mark Nelson e agora preciso me preparar para ir no Falando em Agile mas sem examinar muito o que você fez vou dizer algo que me lembro de cabeça:

O método LZW, na verdade é um método LZ criado por Abraham Lempel e Jacob Ziv com uma ajeitada final criada pelo Terry Welch. Lembro que a gente construia o dicionário segundo LZ e depois dava uma modificada nos bits que foi a contribuição do Welch que na época trabalhava na Unisys e esta não deixava que se usasse o artifício pois julgava como patente sua. Esta era a encrenca com as figuras com formato GIF.

Do google para os curiosos:

LZ

W

[color=red]Achei também no google o artigo do Mark Nelson na DDJ que explica o LZW e que eu usei na época: [/color]

Boa sorte mas se quiser usar o LZW sem escovar bits, a API do Java já tem classes prontas e aqui no GUJ temos o ótimo artigo do Daniel Destro em http://www.guj.com.br/java.tutorial.artigo.181.1.guj

[]s
Luca

gpd38

VLW.

No livro do ZIVIANNI encontrei o que queria.

Rodrigo_Sasaki

gpd38:
VLW.

No livro do ZIVIANNI encontrei o que queria.


Encontrou 5 anos depois? Ou voltou aqui só pra dar uma resposta ao tópico?

Criado 24 de outubro de 2008
Ultima resposta 20 de set. de 2013
Respostas 3
Participantes 3