Titulo: Programa para Compactação de Dados Utilizando Códigos de Huffman.

 

Nome dos autores: Getúlio A. de Deus Júnior, Diego Vidier Oda Arruda e Rodrigo Silva Góes.

 

Unidade Acadêmica onde o trabalho foi desenvolvido: Escola de Engenharia Elétrica e de Computação (EEEC).

 

E-mail (do autor principal): getulio@eee.ufg.br

 

Palavras-Chave: Compactação de Dados, Códigos de Huffman, Lempel-Ziv.

 

Introdução:

 

Basicamente compactar dados significa reduzir o seu tamanho original de tal maneira que possamos reconstituí-lo originalmente sem perda de informação. Ela pode ser aplicada em arquivos de dados, documentos, imagens, etc. [1].

 

As duas técnicas mais utilizadas é a de código estatístico e a de supressão de seqüências repetitivas. Vamos fazer uma descrição sobre estas duas técnicas. O mais popular método de compactação que utiliza código estatístico é o Código de Huffman que consiste em traduzir pedaços de tamanho fixo em símbolos de tamanho variável [2]. Ele procura uma maneira de gerar códigos para os símbolos de entrada cujo tamanho deste código em bits é aproximadamente log2 (probabilidade do símbolo), onde a probabilidade do símbolo é a freqüência relativa de ocorrência de um símbolo dado expresso em probabilidade.

 

Material e Método (Metodologia):

 

Na implementação de nosso compactador utilizando Código de Huffman [2], tomamos um arquivo .txt que desejamos compactar e geramos um arquivo .huf cujo conteúdo é inteligível apenas quando aplicamos o processo inverso o que chamamos de descompactação.

 

Como propósito de pesquisa, optamos por fazer uma filtragem do arquivo texto inicial, que consiste basicamente em considerar somente caracteres maiúsculos; ou seja, qualquer texto que utilize nosso programa só poderá ser processado, para nível de pesquisa, se todos seus caracteres forem maiúsculos. Entretanto, o compactador de Huffman implementado funciona tanto para caracteres maiúsculos como para caracteres minúsculos.

 

Um formulário no programa implementado a partir da leitura de um texto retorna uma estatística de freqüência de caracteres. Para obter uma estatística fixa, fizemos uma compilação de cem arquivos textos diferentes das mais diversas fontes, em língua portuguesa, aplicando o programa implementado, cujos resultados foram tabulados e cuja tabulação será utilizada para se estimar a média em percentagem de caracteres de um texto qualquer em língua portuguesa.

 

Resultados e Discussão:

 

Como proposta para implementação do compactador de dados dividimos o programa em dois formulários principais [3]. O primeiro formulário é mostrado na Fig. 1 (a). O programa foi implementado em linguagem Borland Builder C/C++ [4].

 

 

(a)

 

(b)

 

Figura 1: Programa implementado.

 

A Fig. 1 (a) mostra dinamicamente o processo de compactação e descompactação, desde a filtragem dos dados, montagem da estatística ordenada por código ASCII, montagem da estatística ordenada por freqüência de incidência, montagem da tabela de Huffman, montagem da cadeia de bits, até a descompactação a partir da leitura da árvore de Huffman montada dinamicamente e da leitura seqüencial da cadeia de bits.

 

O outro formulário, mostrado na Fig. 2 (b), apresenta o processo de compactação nos retornando os índices de compactação, o tempo levado para montar a árvore de Huffman, o tempo levado para montar a cadeia de bits, o arquivo .huf gerado e o tempo de descompactação.

 

Para arquivos textos maiores que 40 KB, o compactador de arquivos implementado, apresentou uma ligeira demora na compactação, e na descompactação que tende a crescer exponencialmente com o aumento linear do arquivo. Isso porque ao compactarmos, temos que fazer sucessivas leituras na árvore de Huffman para montarmos a cadeia de caracteres. Ao descompactarmos, temos que fazer o processo inverso com a sobrecarga das comparações com o cabeçalho.

 

Constatamos um problema inerente ao Código de Huffman: a complexidade de descompactação [2]. O método básico para interpretar cada código é ler cada bit da seqüência. Operacionalmente, uma decisão lógica é feita para cada bit. Em geral, descompactação com símbolos de tamanho variável provê um custo/desempenho em decadência à medida que o volume de dados aumente.

 

Testes realizados:: Realizamos alguns testes comparativos utilizando três compactadores comerciais e o nosso programa que utiliza o Código de Huffman, com a finalidade de comparar os índices de compactação [3].

 

Os compactadores utilizados foram: Gzip, Winrar, Winzip e Huffman. Além de outros arquivos fontes, utilizamos dois arquivos em especial para teste: Manual de Sobrevivência.txt e o arquivo Programa.cpp. Os resultados obtidos estão na tabela I.

 

                        Tabela I - Comparação índices de compactação médios.

 

Arquivo

Tamanho

(bytes)

Gzip

(bytes)

WinRar

(bytes)

Winzip

(bytes)

Huffman

(bytes)

1.

.txt

3.972

1.721

1.827

1.855

3.715

2.

.cpp

4.105

1.469

1.529

1.575

2.557

3.

.log

16.497

1.541

1.578

1.664

9.842

4.

.htm

5.419

1.809

1.879

1.909

1.075

5.

.obj

6.642

2.103

2.205

2.256

2.450

 

Para o primeiro arquivo (Manual de Sobrevivência.txt) obtivemos o melhor índice de compactação para o programa Gzip, exatamente 43,33 %. Em seguida, vem o Winrar com 45,50%, depois o Winzip com 48,92% e o Huffman com 93,53%. Para o segundo arquivo (Programa.cpp) tivemos um índice de compactação para o código de Huffman de 62,28%. Em seguida, vem o Gzip com índice de 35,78%, depois o Winrar com 37,25% e o Winzip com 38,37%.

 

Conclusão:

 

Percebemos que, no primeiro caso, o Código de Huffman teve um índice de compactação em termos absoluto e relativo pior que no segundo caso. Isto se deve a dois motivos: primeiramente quanto menor a quantidade de símbolos diferentes entre si, melhor será o índice de compactação para o Compactador de Huffman. Não é o que acontece no primeiro arquivo, cujo texto está repleto de símbolos diferentes num universo total de caracteres relativamente pequeno, algo como 3.972 caracteres. Em segundo lugar, o código de Huffman, estabelece a menor cadeia de bits para o símbolo que apareceu a maior quantidade de vezes. Obtemos um arquivo com índice de compactação menor, quanto maior for a quantidade de vezes que esse símbolo apareça. Isto é o que ocorre num arquivo.cpp, pois neste arquivo, temos uma espantosa soma de espaços que o compactador de Huffman reduziu extraordinariamente bem.

 

Referências Bibliográficas:

 

[1] G. HELD. Comunicação de Dados. Rio de Janeiro: Editora Campus, 1999.

[2] J. L. SZWARCFITER e L. MARKENZON. Estrutura de dados e seus                            algoritmos. Rio de Janeiro: Editora LTC, 1994.

[3] D. V. O. Arruda e R. S. Góes, Compactação de Dados, Projeto Final de Curso, Universidade Federal de Goiás, 2003.

[4] B. R. PREISS. Data Structures and Algorithms with object – oriented desing patterns in C++.  New York: Editora John Wiley & Sons, Inc, 1999.

[5] J. ZIV e A. LEMPEL. Compression of individual sequences via variable-rate coding. IEEE Transactions on Information Theory, Vol. it-24, n 5. september 1978, 530 a 536.