Title: Algoritmo de Huffman
1Algoritmo de Huffman
2Código de Huffman
- Algoritmo para a compressão de arquivos,
principalmente arquivos textos - Atribui códigos menores para símbolos mais
freqüentes e códigos maiores para símbolos menos
freqüentes - Código é um conjunto de bits
3Código de Huffman
- Representação dos dados é feita com códigos de
tamanho variável
Código ASCII A01000001 B01000010 . . . a01100001 b01100010 Código de Huffman A? (0) B? (110) . . . a? (1111110) b? (11111111110)
4Exemplo
Símbolo A B C D Código 0 110 10 111
- Supondo A e C mais freqüentes que C e D no
conjunto de valores possíveis
ABACDA 0 110 0 10 111 0
ABACDA A B A C D A
5Requisito
- O código de um símbolo não pode ser prefixo de um
outro código - Se isso acontece, tem-se ambigüidade na
decodificação - Ex ACBA 01010
- Os dois bits em vermelho
- são A e C ou B?
- Veja que o código de A é
- prefixo do código de B
Símbolo A B C Huffman 0 01 1
6Problema
- Dada uma tabela de freqüências como determinar o
melhor conjunto de códigos, ou seja, o conjunto
que comprimirá mais os símbolos? - Huffman desenvolveu um algoritmo para isso e
mostrou que o conjunto de símbolos obtidos é o
melhor para conjuntos de dados que têm a
freqüência de seus símbolos igual a tabela de
freqüência usada
7Informações de frequência
- Algoritmo de Huffman produz tabela de códigos
baseada em informações de freqüência - Dependência do tipo de dado primário
8O algoritmo em si
- Dado Tabela de freqüências dos N símbolos de um
alfabeto - Objetivo Atribuir códigos aos símbolos de modo
que os mais freqüentes tenham códigos menores
(menos bits)
9O processo de compressão
Huffman
A-0.2 B-0.1 a-0.1 . . .
A-0 B-10 a-110 . . .
Fdjoiasdjfoidsjfoisofnsdo Sdjfoisdjfoisdfoisdfoid
Oidsfoisdnfosdf Sdoifsjfsdfskodnfsdknf
Arquivo comprimido
10Idéia básica
- Construir uma árvore binária tal que
- A) suas folhas sejam os N símbolos do alfabeto
- B)cada ramo da árvore seja um valor 1 (esquerda)
ou 0 (direita) - Isso é uma convenção, o contrário também funciona
- O código de um símbolo será a seqüência de bits
dos ramos da raiz até sua posição na árvore
11Exemplo
Símbolo A B C D Código 0 110 10 111
12Exemplo
Símbolo A B C D E F G H I Freq. 25 20 15 15 10 8 8 4 4
13Exemplo
Símbolo A B C D E F G H I Freq. 25 20 15 15 10 8 8 4 4 Código 01 00 101 100 1111 1101 1100 11101 11100
14Codificando
a b c a
01100001 01100010 01100011 01100001
a 1 0
b 2 10
c 3 11
010110
15Decodificando
010110
a b c a
16A árvore no algoritmo de Huffman
- Árvore é de tamanho fixo (2N-1 nós)
- Logo sua representação pode ser seqüencial (em um
array) ao invés de dinâmica - Construção da árvore é das folhas para a raiz,
então os ponteiros serão - filho?pai
- Os nós não têm os campos filhoEsquerda e
filhoDireita
17Os nós da árvore
- Cada nó tem 4 campos
- Father ponteiro para a posição do pai do nó
- isLeft (para que este campo?)
- True se o nó é filho à esquerda
- False se o nó é filho à direita
- symbol o símbolo representado pelo nó
- freq a freqüência do símbolo
18Processo
- Árvore construída botton-up, a partir dos 2
símbolos de menor freqüência e, recursivamente
tomando-se sempre as 2 sub-árvores menos
freqüentes - Definição A freqüência de uma sub-árvore é a
soma das freqüências de seus 2 filhos
19Processo
- Cria-se um nó (nó folha) para cada símbolo da
tabela de freqüência - Cria-se um vetor que aponta para cada um desses
nós - Insere-se também esses nós em uma uma fila de
prioridades (os nós menos freqüentes primeiro) - Notem temos uma árvore E uma fila de prioridades
- A árvore nós estamos construindo
- A fila de prioridades nós usamos para construir a
árvore - O processo termina quando todos os nós da fila de
prioridades forem eliminados - Os últimos dois juntam-se e formam a raiz da
árvore
20Processo(visão geral)
- Enquanto existir mais de 1 nó na fila
- Retiram-se os dois primeiros
- Gera-se um novo nó a partir destes
- Insere estes dois na árvore
- No final restará um nó na fila de prioridades
21N-nº símbolos tratados Frequencias uma tabela
com os símbolos e suas freqüências Code Saída
do algoritmo. Uma tabela com os símbolos e os
seus respectivos códigos Rootnodes fila de
prioridades Position vetor de ponteiros para os
nós iniciais (nós folhas)
Code Huffman(N,Frequencias) rootnodesFilaVazia
//inicializa o conjunto de root
nodes for(i0iltni) PmakeNode(frequencias
i) positioniP //P ponteiro para
folha pqinsert(rootnods,P) //este for cria
todos os nós folhas ...continua no próximo
slide
22remQueueElem retorna o primeiro elemento da
fila de prioridades makeNode gera um novo nó da
árvore Setleft(P,P1) seta o pai de P1 e seta
que P1 é filho esquerdo Setright(P,P2) seta o
pai de P2 e seta que P2 pe filho
direito addQueueElem insere um nó na fila de
prioridades
- //geração da árvore
- while(size(rootnodes) gt 1)
- P1remQueueElem(rootnodes)
- P2remQueueElem (rootnodes)
- //combina P1 e P2 em um nó
- PmakeNode(info(P1)info(P2))
- setleft(P,P1) setRight(P,P2)
- setQueueElem(rootnodes,P) //nó pai na fila de
prioridades - //este while contrói a árvore
- Continua....
23- //gerando os códigos a partir da árvore
- rootremQueueElem (rootnodes)
- for (i0 iltn i)
- Ppositioni //i-esimo símbolo
- codei //string de bits nula
- while(P!root) //sobe na árvore
- if (isleft(P))
- codei0 codei
- else
- codei1codei
- Pfather(P)
- //end while
- //end for
- Fim do algoritmo de Huffman
Algoritmo de Huffman
Gera os nós iniciais e Constrói a fila
de prioridades
Gera a árvore binária
Gera os códigos a partir da árvore
24A tabela de códigos (code)
a 1 0
b 2 10
c 3 11
25Exemplo do algoritmo
A 25 01
B 20 00
C 15 101
D 15 100
E 10 1111
F 8 1101
G 8 1100
H 4 11101
I 4 11100
26Tabela de códigos
Símbolo Nº bits Código
A 2 01
B 2 00
C 3 101
D 3 100
E 4 1111
F 4 1101
G 4 1100
H 5 11101
I 5 11100
27Codificando
a b c a
01100001 01100010 01100011 01100001
a 1 0
b 2 10
c 3 11
010110
28Decodificando
010110
a b c a
29Operadores bit a bit no C
gtgt ltlt AND OR OR exclusivo (XOR) Deslocamento à direita Deslocamento à esquerda
30AND bit a bit
AND bit a bit
1 1 0 0 0 0 0 1
0 1 1 1 1 1 1 1
-----------------
0 1 0 0 0 0 0 1
void main(void) char a,b,c a193
b127 ca b//c65 printf(i\n,c)
31OR bit a bit
void main(void) char a,b,c a193
b127 ca b//c255 printf(i\n,c)
OR bit a bit
1 1 0 0 0 0 0 1
0 1 1 1 1 1 1 1
-----------------
1 1 1 1 1 1 1 1
32XOR bit a bit
void main(void) char a,b,c a193
b127 ca b//c190 printf(i\n,c)
XOR bit a bit
1 1 0 0 0 0 0 1
0 1 1 1 1 1 1 1
-----------------
1 0 1 1 1 1 1 0
33Deslocamento à direita e à esquerda
X7 0000 0111 7
Xltlt1 0000 1110 14
Xltlt3 0111 0000 112
Xltlt2 1100 0000 192
Xgtgt1 0110 0000 96
Xgtgt2 0001 1000 24
void main(void) char x xltlt1
xltlt3 xltlt2 xgtgt1 xgtgt2