Universidade Estadual de Campinas
Instituto de Computação


Ata ded Exercícios - Complexidade de Algoritmos (MO417)
Redator: Patrick Henrique
RA: 022279


Capítulo 16 - Algoritmos Gulosos (Códigos de Huffman)



Questão 16.3-2 - Enunciado: O que é um código de Huffman ótimo para o conjunto de freqüências a seguir, baseado nos primeiros 8 números de Fibonacci?
a:1  b:1  c:2  d:3  e:5  f:8  g:13  h:21
Você pode generalizar sua resposta para encontrar o código ótimo quando as freqüências forem os n primeirosnúmeros de Fibonacci?

RESPOSTA: Seguindo o Algoritmo de Huffman, chega-se à construção da seguinte árvore:

Árvore (Huffman) para os 8 primeiros números de Fibonacci

Percorrendo essa árvore a partir da raiz é possível saber qual o código binário ótimo para cada letra, de acordo com sua freqüência:

h
0
g
10
f
110
e
1110
d
11110
c
111110
b
1111110
a
1111111
0 - caminho esquerdo da árvore (nesta implementação)
1 - caminho direito da árvore (nesta implementação)



É intuitiva a percepção de que existe um caso geral quando as freqüências forem os primeiros n números de Fibonacci, porém, para provar que funciona sempre é necessário mostrar que:
 Condição a ser satisfeita

Como vemos, a prova se divide em duas etapas: a primeira mostra que um número de Fibonacci é sempre <= a soma de todos os seus antecessores:
Primeira parte: Condicao de prova 1:
Parte1a e Parte1-bentaoconclusao Prova1

Segunda parte: condicao2:
De acordo com o Lema 20.2 do livro Algoritmos de Thomas H. Cormen, que diz que dada uma série de números de Fibonacci (Fn), onde n é a ordem do número: Lema20.2,
etapa2-a
etapa2-bentãoconclusao2




Anexo:

Algoritmo de Huffman

Huffman(C)
1 n := |C|
2 Q := C
3 for i:=1 to n-1 do
4    alocar um nó z
5    esquerda[z] := x := EXTRACT-MIN(Q)
6    direita[z] := y := EXTRACT-MIN(Q)
7    f[z] := f[x] + f[y]
8    INSERT(Q,z)
9 return EXTrACT-MIN(Q) // Retornar a raiz da árvore.