Algoritmo de Huffman - PowerPoint PPT Presentation

About This Presentation
Title:

Algoritmo de Huffman

Description:

Algoritmo de Huffman C digo de Huffman Algoritmo para a compress o de arquivos, principalmente arquivos textos Atribui c digos menores para s mbolos mais ... – PowerPoint PPT presentation

Number of Views:99
Avg rating:3.0/5.0
Slides: 34
Provided by: Joao63
Category:

less

Transcript and Presenter's Notes

Title: Algoritmo de Huffman


1
Algoritmo de Huffman
2
Có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

3
Có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)
4
Exemplo
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
5
Requisito
  • 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
6
Problema
  • 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

7
Informaçõ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

8
O 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)

9
O 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
10
Idé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

11
Exemplo
Símbolo A B C D Código 0 110 10 111
12
Exemplo
Símbolo A B C D E F G H I Freq. 25 20 15 15 10 8 8 4 4
13
Exemplo
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
14
Codificando
a b c a
01100001 01100010 01100011 01100001
a 1 0
b 2 10
c 3 11
010110
15
Decodificando
010110
a b c a
16
A á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

17
Os 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

18
Processo
  • Á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

19
Processo
  • 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

20
Processo(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

21
N-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
22
remQueueElem 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
24
A tabela de códigos (code)
a 1 0
b 2 10
c 3 11
25
Exemplo 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
26
Tabela 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
27
Codificando
a b c a
01100001 01100010 01100011 01100001
a 1 0
b 2 10
c 3 11
010110
28
Decodificando
010110
a b c a
29
Operadores bit a bit no C
gtgt ltlt AND OR OR exclusivo (XOR) Deslocamento à direita Deslocamento à esquerda
  • Operam sobre char e int

30
AND 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)
31
OR 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
32
XOR 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
33
Deslocamento à 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
Write a Comment
User Comments (0)
About PowerShow.com