Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da...
Transcript of Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da...
Codificação Huffman: Uma aplicação de Árvore
Binária e fila de Prioridade
Codificação de Huffman
• Proposta por Dr. David A. Huffman em 1952– “A Method for the Construction of Minimum Redundancy Codes”
O Algoritmo
• A codificação de Huffman é uma forma de codificação estatística
• Nem todos os caracteres ocorre com a mesma frequência!
• Entretanto, todos os caracteres utilizam a mesma quantidade de memória
– 1 caracter = 1 byte, seja e ou x
O Algoritmo
• Existe alguma economia em reduzir os códigos baseado na frequência dos caracteres?
• Tamanho das codificações são variáveis, diferente do ASCII.
• Tamanho varia e será menor para os caracteres de maior frequência.
O Algoritmo (Real)
1. Percorrer o texto a ser comprimido e conta a ocorrência de todos os caracteres.
2. Ordenar e priorizar os caracteres baseado no número de ocorrência no texto.
3. Construir a árvore da codifição de Huffman baseado em uma lista priorizada.
4. Executar um caminhamento na Árvore para determinar todos os códigos das palavras.
5. Busca o texto novamente e cria um novo arquivo com a nova codificação.
Construindo a ÁrvoreBusca o texto original
• Considere o seguinte texto:
Eerie eyes seen near lake.
• Conta as ocorrências de todos os caracteres do texto
Construindo a ÁrvoreBusca o texto original
Eerie eyes seen near lake.• Que caracteres aparecem?
E e r i space
y s n a r l k .
Construindo a ÁrvoreBusca o texto original
Eerie eyes seen near lake.• Qual é a frequência de cada caracter no texto?
Car. Freq. Car. Freq. Car. Freq. E 1 y 1 k 1 e 8 s 2 . 1 r 2 n 2 i 1 a 2 space 4 l 1
Construindo a ÁrvorePriorização de caracteres
• Criar nós da Árvore binária com caracter e frequência de cada caracter
• Colocar nós em uma fila de prioridade– O nó com menor ocorrência primeiro, na fila de prioridade.
Construindo a ÁrvorePriorização de caracteres
• Nós de uma Árvore binária
typedef struct no* TNoAB;struct noAB{char caracter;int frequencia;TNoAB esq, dir;
};
Construindo a ÁrvorePriorização de caracteres
• Elementos da fila de prioridade
struct elemento{
int chave;
TNoAB no;};
Construindo a Árvore
• A fila após a inserção de todos os nós
E
1
i
1
y
1
l
1
k
1
.
1
r
2
s
2
n
2
a
2
sp
4
e
8
Construindo a Árvore
• Enquanto a fila de prioridade contém dois ou mais nós– Criar o novo nó– Remover o nó e definir a SAE– Remover o próximo nó e definir a SAD– A frequência do novo nó é igual a soma das frequências da esquerda e da direita
– Enfileirar o novo nó na fila
Construindo a Árvore
E
1
i
1
y
1
l
1
k
1
.
1
r
2
s
2
n
2
a
2
sp
4
e
8
Construindo a Árvore
E
1
i
1
y
1
l
1
k
1
.
1
r
2
s
2
n
2
a
2
sp
4
e
8
2
Construindo a Árvore
E
1
i
1
y
1
l
1
k
1
.
1
r
2
s
2
n
2
a
2
sp
4
e
8
2
Construindo a Árvore
E
1
i
1
k
1
.
1
r
2
s
2
n
2
a
2
sp
4
e
8
2
y
1
l
1
2
Construindo a Árvore
E
1
i
1
k
1
.
1
r
2
s
2
n
2
a
2
sp
4
e
8
2
y
1
l
1
2
Construindo a Árvore
E
1
i
1
r
2
s
2
n
2
a
2
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
Construindo a Árvore
E
1
i
1
r
2
s
2
n
2
a
2
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
Construindo a Árvore
E
1
i
1
n
2
a
2sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
Construindo a Árvore
E
1
i
1
n
2
a
2
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
4
Construindo a Árvore
E
1
i
1
sp
4
e
82
y
1
l
1
2k
1
.
1
2
r
2
s
2
4
n
2
a
2
4 4
Construindo a Árvore
E
1
i
1
sp
4
e
82
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4 4
6
Construindo a Árvore
E
1
i
1
sp
4
e
82
y
1
l
1
2
k
1
.
1
2r
2
s
2
4
n
2
a
2
4 4 6
O que acontece com os nós com menor número de ocorrências?
Construindo a Árvore
E
1
i
1
sp
4
e
82
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
4 6
8
Construindo a Árvore
E
1
i
1
sp
4
e
82
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
4 6 8
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46
8
10
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2r
2
s
2
4
n
2
a
2
4 46
8 10
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46
8
10
16
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46
8
10 16
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46 8
1016
26
Construindo a Árvore
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46 8
1016
26
•Após enfileirar o nó existirá somente um único nó na fila de prioridade
Construindo a Árvore
Remover o único nó restante na fila.
Essa Árvore contém os nós para cada caracteres.
A Frequência do nó raiz deve ser igual ao número de caracteres no texto.
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46 8
1016
26
Eerie eyes seen near lake. 26 caracteres
Codificando o ArquivoCaminhamento na Árvore
• Caminhar na Árvore para obter o novo código das palavras
• Para esquerda é um 0(zero) e para direita é 1(um)
• O código só estará completo quando um nó folha for alcançado
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46 8
1016
26
Codificando o ArquivoCaminhando na árvore
Car. CodigoE 0000i 0001y 0010l 0011k 0100. 0101space 011e 10r 1100s 1101n 1110a 1111
E
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46 8
1016
26
Codificando o Arquivo
• Reavaliar o texto e codificar o arquivo usando o novo codigo de palavras
Eerie eyes seen near lake.
Char CodeE 0000i 0001y 0010l 0011k 0100. 0101space 011e 10r 1100s 1101n 1110a 1111
0000101100000110011100010101101101001111101011111100011001111110100100101• Porque não existe necessidade de um separador de caracteres?
.
Codificando o ArquivoResultados
• Melhorou?• 73 bits para códificar o texto
• ASCII deveria ser 8 * 26 = 208 bits
0000101100000110011100010101101101001111101011111100011001111110100100101
Se o código modificado fosse de 4 bits por caracter. Total de bits 4 * 26 = 104. Melhoria seria pouca.
Decodificando o Arquivo
• Como o receptor sabe quais são os códigos?• Árvore construída para cada arquivo.
– Considera a frequência para cada arquivo– Impacta a compressão, especialmente para pequenos arquivos
• Árvore pré determinada– Baseada em analise estatística de arquivos texto o do tipo do arquivo
Decodificando o Arquivo
• Tendo o receptor a Árvore ele pode avaliar o fluxo de bits que chega
• 0 ⇒ esquerda
• 1 ⇒ direitaE
1
i
1
sp
4
e
8
2
y
1
l
1
2
k
1
.
1
2
r
2
s
2
4
n
2
a
2
4
46 8
1016
26
10100011011110111101111110000110101
Resumo
• A codificação de Huffman é uma técnica de compressão de dados
• Usa codificação estatística– Simbolos usados com mais frequência tem codificação mais curta.
• Tem bom desempenho com texto• Uma aplicação usual de estruturas de dados