Algoritmo de Huffman para compressão de dados

Livro de SW: sec.5.5, p.826-838.  Website do livro: resumo sec.5.5, slides. Veja também a página http://algs4.cs.​princeton.edu/​code/, que tem o código fonte, a API, e dados de teste de todos os programas do livro.

Resumo:

Pré-requisitos:

Ideias básicas

Compressão (codificação)

Expansão (decodificação)

Exercícios 1

  1. Qual a diferença entre código de comprimento fixo e código de comprimento variável? Por que código de comprimento variável precisa ser livre de prefixos? Código de comprimento fixo precisa ser livre de prefixos?
  2. (SW 5.5.1)  Quais das tabelas de códigos abaixo são livres de prefixos?
    A   0    0   1     1
    B   100  1   01    01
    C   10   00  001   001
    D   11   11  0001  000
    

Tabelas inversas e suas tries

Exercícios 2

  1. Qual a relação entre tries binárias e códigos livres de prefixos? Qualquer trie binária representa um código livre de prefixos?
  2. Todos os códigos livre de prefixo produzem strings codificadas de comprimento mínimo?

Construção da trie de Huffman

Exercícios 3

  1. Escreva a cadeia de bits que codifica a string   ABRACADABRA!   usando o código de Huffman calculado acima.  Quantos bits tem a cadeia?  Insira espaços para facilitar a leitura.
  2. Escreva a cadeia de bits que codifica a string   it was the best of times it was the worst of timesLF   usando o código de Huffman calculado acima.  Quantos bits tem a cadeia?  Qual a taxa de compressão?  Insira espaços e quebras de linha para facilitar a leitura.
  3. Suponha dada a tabela de códigos Huffman de uma string s.  Dê a tabela de códigos de uma permutação de s.
  4. Unicidade. Mostre que a trie de Huffman não é unica.  Use a string  ABRACADABRA!  como exemplo.  Faça um exemplo mais interessante que a mera troca de 0 por 1 e vice-versa.
  5. (SW 5.5.14)  Suponha que as frequências dos caracteres de uma string são todas diferentes. A trie de Huffman é única?
  6. (SW 5.5.19)  Mostre que há pelo menos 2N−1 diferentes códigos de Huffman para cada string de N caracteres.
  7. (SW 5.5.10)  Construa a trie de Huffman para a string  it was the age of foolishness .  Quantos bits tem a cadeia codificada?
  8. (SW 5.5.11)  Como é o código de Huffman de uma string sobre um alfabeto de duas letras? Dê um exemplo para mostrar o número máximo de bits na versão codificada de uma string de N letras sobre um alfabeto de duas letras?
  9. (SW 5.5.12)  Suponha que as frequências relativas dos caracteres (número de ocorrências dividido pelo número total de caracteres) sejam potências negativas de 2 (ou seja, 2−1, 2−2, etc.)  Descreva o código de Huffman.
  10. Suponha que o alfabeto de uma string s tem apenas 6 caracteres diferentes e que todos os caracteres têm a mesma frequência. Submeta s ao algoritmo de compressão de Huffman e seja h(s) a string de bits que resulta da substituição de cada caractere de s pelo seu código. (Portanto, h(s) não inclui a representação da trie de Huffman, nem a representação do comprimento de s, nem qualquer enchimento.)  Calcule a taxa m/n, sendo m o número de bits de h(s) e n é o número de bits de s. Repita o exercício com 5 no lugar de 6. 
  11. (SW 5.5.13)  Suponha que todos os caracteres de uma string têm a mesma frequência. Descreva o código de Huffman.
  12. (SW 5.5.18)  Seja Fk o k-ésimo número de Fibonacci.  (Lembrete: F1 = 1.)  Considere um conjunto de n caracteres tal que a frequência do k-ésimo é Fk.  Note que F1 + F2 + … + Fn = Fn+2 − 1.  Descreva o código de Huffman. Dica: o código mais longo tem n−1 bits.
  13. (SW 5.5.20)  Dê uma cadeia codificada de Huffman que tenha muito mais 0s que 1s.
  14. (SW 5.5.21)  Prove que o código mais longo e o segundo mais longo de uma tabela de Huffman têm o mesmo comprimento.
  15. (SW 5.5.22)  Suponha que a frequência de um caractere c é estritamente maior que a frequência de um caractere d. Mostre que o código de Huffman de c tem comprimento menor ou igual que o comprimento do código de d.
  16. (SW 5.5.9b)  Estime a taxa de compressão da codificação de Huffman de uma sequência de N de caracteres ASCII aleatórios (em cada posição, todos os caracteres são igualmente prováveis).

Mais detalhes do método de compressão

Exercícios 4

  1. Discuta a seguinte maneira alternativa de calcular as frequências:
       int[] freq = new int[R];
       for (int c = 0; c < R; c++)
          for (int i = 0; i < input.length; i++)
             if (input[i] == c) freq[c]++;
    

A trie de Huffman é ótima

A história ainda não terminou

Exercícios 5

  1. Quantos nós internos tem uma trie de Huffman para n caracteres?
  2. O fluxo de bits produzido pelo algoritmo de Huffman começa com uma string de bits t que representa a trie de codificação e é seguido por uma string de bits N que representa o número de caracteres do texto original. Como sei onde termina a string t e começa a string N?
  3. Um fluxo de bits produzido pelo método compress da classe Huffman começa assim:
    00010101011010011001110100111100101010000101000001101010010000101110100...
    

    Desenhe a trie do código de compressão.

Classe Huffman completa

Exemplos

Comparação com outros algoritmos