Compactação de Dados

Eliminação de repetições

A idéia básica consiste em substituir uma seqüência de caracteres repetidos por um número e um caracter.

Ex.:    Entrada:  AAA333333333BBBBBBBBCCCC555555
           Saída:      3A939B4C65.

Problemas:  (Refletir sobre possíveis soluções)
1) E se houverem mais do que 10 caracteres em seqüência ?
2) E se houverem muitos caracteres que aparecem apenas uma única vez ?
3) Existem tipos de arquivos cuja compactação seria mais eficiente ? (.jpg , .txt, .doc, .bmp, .xpm ?)
 

Utilização de menos bits

Em arquivos do tipo "texto", o espaço gasto para armazer um único caracter é, geralmente, de um byte (8 bits). No entanto, é fácil perceber que a grande maioria dos textos não utiliza todas as 256 opções de símbolos que um byte pode representar. Um texto que utilize, por exemplo,  apenas letras minúsculas, sem acentos e alguns sinais de pontuação, não precisará mais do que 5 bits para representar cada diferente caracter. O compactador, nesse caso, realiza um mapeamento do símbolo inicial para símbolos de 5 bits. Esse mesmo mapeamento é usado pelo descompactador. Note que o total de bits a ser utilizado no armazenamento de cada caracter pode ser calculado dinamicamente, através de um "pré-processamento" no arquivo a ser compactado, para saber quantos símbolos diferentes aparecem no texto.

Problemas:
1) Além dos bits resultantes da compactação do texto original, o que mais deverá ser armazenado no arquivo compactado ?
2) Podemos utilizar a eliminação de repetições juntamente com a utilização de menos bits ?
3) Existem tipos de arquivos cuja compactação seria mais eficiente ? (.jpg , .txt, .doc, .bmp, .xpm ?)

Dicas:
1) Estudar operador "bitwise" para manipulação de bits em C ( & , | , << , >> , ~)

Algoritmo de Huffman

Passo 1) Calcular, para cada diferente símbolo do arquivo original, o total de ocorrências desse símbolo (freqüência do símbolo).
Exemplo:

Entrada: AAABCBAABAZX  (96 bits)

Freqüências:
A - 6
B - 3
C - 1
Z - 1
X - 1


Passo 2) Encontrar símbolos binários para representar os símbolos originais de forma que os símbolos de maior freqüência sejam representados pelos símbolos binários com menor quantidade de bits.

Passo 3) Gerar Arquivo Compactado
  • Gravar informações sobre Árvore Digital Binária, calculada no passo anterior, para que o descompactador possa "recuperar" as associações entre símbolos originais e novos.
  • Utilizar as associações para "substituir" os simbolos originais.

  • Exemplo de um arquivo compactado: [Dados sobre a ADB] 11101001011101100010000
     

    Material de Apoio

  • Exemplo de utilização de operadores bitwise em Java código produzido pelo acadêmico Bruno Cesar Gonçalves de Toleto, Engenharia de Computação, em 2006