Algoritmo de compressao e descompressao

6 respostas
T

Alguem me poderia disponibilizar o codigo que faz o seguinte:

Realize um par de programas para compressão/descompressão de documentos de texto em formato txt. O programa que realiza compressão (com ponto de entrada na classe Compress) lê o texto a compactar do standard input e produz no standard output o resultado da compressão, doravante designado de texto compactado. O programa que realiza descompressão (com ponto de entrada na classe Uncompress) lê o texto compactado do standard input e produz no standard output o resultado da descompressão, idêntico ao texto inicialmente submetido ao programa de compressão.

Para a leitura e escrita de ficheiros redireccione o standard input e o standard output do programa para os respectivos ficheiros. Para o efeito considere as seguintes linhas de comando:

c:\> java Compress < input.txt > compressed.txt

  c:\> java Uncompress < compressed.txt > output.txt

A primeira promove a execução do programa de compressão (Compress) redireccionando o standard input (símbolo <) para o ficheiro input.txt e o standard output (símbolo >) para o ficheiro compressed.txt, que irá conter o texto compactado.

A segunda promove a execução do programa de descompressão (Uncompress) que realiza a operação inversa, colocando no standard output (redireccionado para o ficheiro output.txt) o texto não compactado, que se pretende igual ao originalmente contido em input.txt.

Algoritmo de compressão:
O algoritmo de compressão opera sobre o texto de entrada (no exemplo, conteúdo de input.txt) aplicando duas transformações em cascata: A primeira é designada de Burrows-Wheeler Transform (BWT); a segunda de Run-Length Encoding (RLE). A descrição de ambas as transformadas (assim como das transformadas inversas) encontra-se em apêndice. A figura seguinte ilustra o processo.

Algoritmo de descompressão:
O algoritmo de descompressão opera sobre o texto compactado (no exemplo, conteúdo de compressed.txt) aplicando as transformações inversas das usadas na compressão. O resultado (no exemplo, conteúdo de output.txt) é o texto original. A figura seguinte ilustra o processo.

A transformação BWT opera sobre blocos de dados (no contexto deste trabalho, sequências de caracteres) e produz blocos da mesma dimensão mas com formato mais adequado à compressão. Após a transformação, a sequência de caracteres de saída contém exactamente os mesmos caracteres da sequência original, diferindo apenas na sua ordem (a sequência de saída é uma rotação da sequência de entrada).

Esta transformação é reversível, ou seja, a ordem original dos caracteres é recuperável a partir da sequência de saída. A sua utilidade na compressão resulta da observação que, se a sequência de caracteres original contiver repetições de subsequências, então a sequência de saída irá conter várias repetições consecutivas dos mesmos caracteres. Nestas condições, a utilização do algoritmo Run-Length Encoding (RLE) produz a informação contida na sequência original mas usando uma codificação mais compacta, resultando na compressão dos dados. Abaixo encontra-se um exemplo da aplicação da transformada:

entrada:
SIX.MIXED.PIXIES.SIFT.SIXTY.PIXIE.DUST.BOXES

saida:
TEXYDST.E.IXIXIXXSSMPPS.B…E.S.EUSFXDIIOIIIT

Transformada directa:
A transformada é realizada ordenando todas as rotações da sequência de caracteres de entrada, e tomando como sequência de saída a formada pela última coluna da matriz resultante. Por exemplo, o texto ?^BANANA@? é transformado em ?BNN^AA@A? (o símbolo @ indica fim de bloco, EOB ? End Of Block[1]) através dos seguintes passos: criação da matriz composta por todas as rotações da sequência de entrada; ordenação lexicográfica das linhas da matriz; produção na saída da última coluna da matriz ordenada.

RLE

O algoritmo RLE é eficaz na compressão quando aplicado a sequências com repetições consecutivas do mesmo símbolo (designados de runs). Para o efeito, essas sequências são representadas por um único símbolo, seguido do número de ocorrências, em vez da sequência original. Por exemplo, considere-se a seguinte sequência:

AAAAAAAAAAAABAAAAAAAAAAAABBBAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAA

A representação resultante da aplicação do algoritmo é:

12A1B12A3B24A1B14A

Esta sequência é formada por doze A’s, um B, doze A’s, três B’s, etc. O algoritmo produziu a partir da sequência original (com 67 caracteres) uma representação com apenas 18 caracteres.

O algoritmo da transformação inversa (RLE-1) é imediato. Basta reproduzir, na saída, o carácter o número vezes indicado pela dimensão do run.

6 Respostas

dionat4n

Isso é um tema de casa, por acaso? hehe

E

Procure no e-mule, lá eles costumam ter essas coisas.

Sério, você mal começou as aulas e já está pedindo a resposta pronta? Aqui não é o Google.

Marcelo_FS

Posso, R$500.

Marky.Vasconcelos

E enquanto isso voce fica tomando um cafézinho?

Dieval_Guizelini

O assunto é muito interessante,

você deveria pesquisar um pouco sobre alguns algoritmos, teoria dos conjuntos, teoria da informação etc.

Se você quer apenas uma aplicação da APIs do java, veja os links abaixo:
http://java.sun.com/developer/technicalArticles/Programming/compression/
http://www.exampledepot.com/egs/java.util.zip/pkg.html

Se você quer conhecer um pouco sobre os algoritmos presentes em formatos de imagem (GIF,JPEG etc), ou de som, ou de vídeo… ou outros:
http://www.datacompression.info/

fw

Dieval_Guizelini

Cuidado,


12A…
(…)
O algoritmo da transformação inversa (RLE-1) é imediato. Basta reproduzir, na saída, o carácter o número vezes indicado pela dimensão do run.

se o seu dado de entrada tiver números… foi para o espaço a notação utilizada.

fw

Criado 10 de fevereiro de 2009
Ultima resposta 11 de fev. de 2009
Respostas 6
Participantes 6