Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da...

44
Codificação Huffman: Uma aplicação de Árvore Binária e fila de Prioridade

Transcript of Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da...

Page 1: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

Codificação Huffman: Uma aplicação de Árvore

Binária e fila de Prioridade

Page 2: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

Codificação de Huffman

• Proposta por Dr. David A. Huffman em 1952– “A Method for the Construction of Minimum Redundancy Codes”

Page 3: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 4: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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.

Page 5: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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.

Page 6: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 7: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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 .

Page 8: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 9: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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.

Page 10: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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;

};

Page 11: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

Construindo a ÁrvorePriorização de caracteres

• Elementos da fila de prioridade

struct elemento{

int chave;

TNoAB no;};

Page 12: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 13: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 14: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 15: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 16: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 17: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 18: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 19: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 20: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 21: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 22: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 23: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 24: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 25: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 26: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 27: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 28: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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?

Page 29: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 30: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 31: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 32: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 33: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 34: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 35: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 36: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 37: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 38: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 39: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 40: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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?

.

Page 41: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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.

Page 42: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 43: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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

Page 44: Codificação Huffman: Uma aplicação de Árvore …Priorização de caracteres •Criar nós da Árvore binária com caracter e frequência de cada caracter •Colocar nós em uma

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