Vous êtes sur la page 1sur 57

Codificação de Huffman

Bruna Gregory Palm

11 de setembro de 2017
A codificação de Huffman é um método de compressão que
considera as probabilidades de ocorrência de cada sı́mbolo no
conjunto de dados a ser comprimido, para determinar códigos
prefixos de tamanho variável para cada sı́mbolo.

Tabela 1 : Exemplos de códigos

Sı́mbolo Probabilidade Código I Código II Código III Código IV


a1 0,500 0 0 0 0
a2 0,250 0 1 10 01
a3 0,125 1 00 110 011
a4 0,125 10 11 111 0111
Ele foi desenvolvido em 1952, por David A. Huffman. Na época,
David era estudante de doutorado no MIT.

Huffman teve a ideia de usar uma árvore binária utilizando frequências


relativas para fazer a demonstração que precisava.
O código de Huffman é baseado em duas hipóteses:
1 Os sı́mbolos mais frequentes, aqueles com maiores
probabilidades, são representados por códigos mais
curtos.
2 Os sı́mbolos menos frequentes recebem palavras-código
de mesmo tamanho.
De acordo com a primeira hipótese, quanto mais provável um
sı́mbolo é, será também mais frequentes e devem ser tão curtos
quanto possı́vel, para diminuir o comprimento do código.

Ainda, no código de Huffman, as palavras-código mais longas


que correspondem aos sı́mbolos menos frequentes, diferem ape-
nas no último dı́gito.
Construindo um Código de Huffman binário

1 Os sı́mbolos fonte estão dispostos ordem decrescente de


acordo com sua probabilidade. Os sı́mbolos menos
prováveis recebem as atribuições 0 e 1.
2 Ambos os sı́mbolos são combinados para criar um novo
sı́mbolo de fonte, cuja probabilidade é a soma dos
originais. A lista é reduzida por um sı́mbolo. O novo
sı́mbolo está posicionado na lista de acordo com a sua
probabilidade.
3 Este procedimento continua até que a lista tenha apenas
dois sı́mbolos, que recebem as atribuições 0 e 1.
4 Finalmente, a palavra-código binária para cada sı́mbolo é
obtida por um processo reverso.
Medidas de um Código de Huffman binário

O comprimento médio é definido como:


K
X
L= pk lk
k=0

A entropia é definida como:


K  
X 1
H(X ) = pk log2
pk
k=0
Medidas de um Código de Huffman binário

O código de eficiência é dada por:

H(X )
η=
L
Desigualdade de Kraft
K
X
D −nk ≤ 1
k=1

Todos os códigos prefixos satisfazem a desigualdade de Kraft.


Exemplo de um Código de Huffman binário

Tabela 2 : Fonte discreta com cinco sı́mbolos e suas probabilidades.

Sı́mbolo Probabilidade
x0 0,4
x1 0,2
x2 0,2
x3 0,1
x4 0,1
Exemplo de um Código de Huffman binário

Tabela 3 : Exemplo do algoritmo de codificação de Huffman para


obter as palavras-código.

Sı́mbolo Fase 1 Fase 2 Fase 3 Fase 4 Fase 5


x0 0,4 0,4 0,4 0,6 1,0
x1 0,2 0,2 0,4 0,4
x2 0,2 0,2 0,2
x3 0,1 0,2
x4 0,1
Exemplo de um Código de Huffman binário

Tabela 4 : Código resultante.

Sı́mbolo Probabilidade palavra-código


x0 0,4 00
x1 0,2 10
x2 0,2 11
x3 0,1 010
x4 0,1 011
Exemplo de um Código de Huffman binário

Para o exemplo, o comprimento médio da palavra-código para


o código de Huffman é dado por:
4
X
L= pk lk = 0,4(2) + 0,2(2) + 0,2(2) + 0,1(3) + 0,1(3) = 2,2 bits.
k=0
Exemplo de um Código de Huffman binário

A entropia é dada por:


4  
X 1
H(X ) = pi log2
pi
k=0
     
1 1 1
H(X ) = 0,4 log2 + 0,2 log2 + 0,2 log2
0,4 0,2 0,2
   
1 1
+ 0,1 log2 + 0,1 log2
0,1 0,1
H(X ) = 2,12193 bits.

(Tamanho mı́nimo necessário para se projetar o código)


Exemplo de um Código de Huffman binário

A eficiência do código é dada por:

H(X ) 2,12193
η= = = 96,45%
L 2,2
Exemplo de um Código de Huffman binário

É importante dizer que o código de Huffman não é único, e


existem variações que podem ser obtidas para o conjunto fi-
nal de palavras-código, dependendo da forma como os bits são
atribuı́dos.

Mas, independente da forma como as probabilidades são posi-


cionadas, o comprimento médio será sempre o mesmo, se as
regras forem seguidas.

Ou seja, qualquer outro código para o mesmo alfabeto não pode


ter um comprimento esperado menor do que o código cons-
truı́do por este algoritmo.
Exemplo de um Código de Huffman binário

A diferença é a variância dos comprimentos de palavras-código,


definidos como:
K
X −1
V [L] = pk (lk − L)2 ,
k=0

em que pk e lk indicam a probabilidade de ocorrência da


k -ésima sı́mbolo fonte e o comprimento da respectiva
palavra-código.
Exemplos de um Código de Huffman binário

Tabela 5 : Quatro formas diferentes de obter o código de Huffman.

Sı́mbolo Código I Código II Código III Código IV


x0 00 11 1 0
x1 10 01 01 10
x2 11 00 000 111
x3 010 101 0010 1101
x4 011 100 0011 1100
Exemplos de um Código de Huffman binário

Os códigos I e II foram obtidos deslocando o novo sı́mbolo


para a posição mais alta na lista de probabilidades
decrescentes.

Os códigos III e IV foram produzidos ao mudar o novo


sı́mbolo para a posição mais baixa da lista.

Os códigos I e III usaram a atribuição sistemática de 0


seguido de 1 aos sı́mbolos menos frequentes.

Os códigos II e IV usaram a atribuição sistemática de 1


seguido de 0 aos sı́mbolos menos frequentes.
Exemplos de um Código de Huffman binário

Para todos os códigos, o comprimento médio da palavra


de código é de 2,2 bits.

Para os códigos I e II, a variância dos comprimentos de


palavras-código é 0,16.

Para os códigos III e IV, a variância é de 1,36.


Exemplos de código Huffman

Considere uma variável aleatória X

X 1 2 3 4 5
probabilidade 0,25 0,25 0,20 0,15 0,15

Esperamos que o código binário ideal para X seja o que tenha


as mais longa palavras-código atribuı́das aos sı́mbolos 4 e 5
(menores probabilidades associadas).

Estes dois comprimentos devem ser iguais, pois, de outra forma,


podemos excluir um bit da palavra-código mais longa e ainda
assim, ter um código de prefixo, mas com um comprimento es-
perado mais curto.
Exemplos de código Huffman

Em geral, podemos construir um código no qual as duas palavras-


código mais longas diferem apenas no último bit.

Para este código, podemos combinar os sı́mbolos 4 e 5 em um


único sı́mbolo de fonte, com uma atribuição de probabilidade de
0,30.
Exemplos de código Huffman

Procedendo desta forma, combinando os dois sı́mbolos me-


nos prováveis em um sı́mbolo até finalmente ficamos com ape-
nas um sı́mbolo e depois atribuı́mos palavras-código para os
sı́mbolos, obtemos a seguinte tabela:

Tabela 6 : Exemplo do algoritmo de codificação de Huffman para


obter as palavras-código.

X Fase 1 Fase 2 Fase 3 Fase 4 Fase 5


1 0,25 0,30 0,45 0,55 1
2 0,25 0,25 0,30 0,45
3 0,20 0,25 0,25
4 0,15 0,20
5 0,15
Exemplo de um Código de Huffman binário

Tabela 7 : Código resultante.

X Probabilidade palavra-código Comprimento


1 0,25 01 2
2 0,25 10 2
3 0,20 11 2
4 0,15 000 3
5 0,15 001 3

Para o exemplo, o comprimento médio da palavra-código para


o código de Huffman é dado por:
5
X
L= pk lk = 0,25(2) + 0,25(2) + 0,20(2) + 0,15(3) + 0,15(3)
k=0
= 2,3 bits.
Exemplo de um Código de Huffman ternário

Considere agora um código ternário para a mesma variável aleatória.


Iremos combinamos os três sı́mbolos menos prováveis e obte-
mos o seguinte espaço amostral:

Tabela 8 : Exemplo do algoritmo de codificação de Huffman para


obter as palavras-código.

palavra-código X Probabilidade Fase 1 Fase 2


1 1 0,25 0,50 1
2 2 0,25 0,25
00 3 0,20 0,25
01 4 0,15
02 5 0,15

Para o exemplo, o comprimento médio da palavra-código para


o código de Huffman é 1,5 dı́gitos ternário.
Código de Huffman

Agora, se tivermos D ≥ 3, podemos não ter um número sufici-


ente de sı́mbolos para que possamos combiná-los.

Nesse caso, adicionamos sı́mbolos dummy até o final do con-


junto de sı́mbolos.

Os sı́mbolos dummy possuem probabilidade 0 e são inseridos


para preencher a árvore.

Como em cada estágio da redução, o número de sı́mbolos é


reduzido por D − 1, queremos o número total de sı́mbolos a
serem 1 + k(D − 1), onde k é o número de mesclas.

Por isso, adicionamos sı́mbolos dummys suficientes para que o


número total de sı́mbolos seja desta forma.
Exemplo de um Código de Huffman ternário

Tabela 9 : Exemplo do algoritmo de codificação de Huffman para


obter as palavras-código.

X Probabilidade Fase 1 Fase 2 Fase 3


1 0,25 0,30 0,70 ?
2 0,25 0,25 0,30
3 0,20 0,25
4 0,10 0,20
5 0,10
6 0,10
Exemplo de um Código de Huffman ternário

Tabela 10 : Exemplo do algoritmo de codificação de Huffman para


obter as palavras-código.

X Probabilidade Fase 1 Fase 2 Fase 3


1 0,25 0,25 0,50 1
2 0,25 0,25 0,25
3 0,20 0,20 0,25
4 0,10 0,20
5 0,10 0,10
6 0,10
Dummy 0,00
Exemplo de um Código de Huffman ternário

Tabela 11 : Código resultante.

X Probabilidade palavra-código
1 0,25 1
2 0,25 2
3 0,20 01
4 0,10 02
5 0,10 000
6 0,10 001
Dummy 0,00 002

Para o exemplo, o comprimento médio da palavra-código para


o código de Huffman é 1,7 dı́gitos ternário.
Alguns comentários sobre o código de Huffman

Equivalência da codificação de origem e as 20 questões

Suponhamos que desejemos encontrar a série mais eficiente


de sim-não

Pergunta: Suponha que conhecemos a distribuição de probabi-


lidade dos objetos, podemos obter uma sequência de perguntas
mais eficiente? (Para determinar um objeto, precisamos garantir
que as respostas à sequência de perguntas identifique exclusi-
vamente o objeto a partir do conjunto de objetos possı́veis; isto
é não é necessário que a última pergunta tenha uma resposta
“sim”.)
Alguns comentários sobre o código de Huffman

Primeiro mostramos que uma sequência de perguntas é equi-


valente a um código para o objeto. Qualquer pergunta depende
apenas das respostas a pergunta anterior.

Uma vez que a sequência de respostas determina de forma ex-


clusiva o objeto, cada objeto tem uma sequência de respostas
diferente, e se representarmos as respostas sim e não por 0 e
1, temos um código binário para o conjunto de objetos.

O comprimento médio deste código é o número médio de per-


guntas para o esquema de questionamento.
Alguns comentários sobre o código de Huffman

Além disso, a partir de um código binário para o conjunto de


objetos, podemos encontrar uma sequência de perguntas que
correspondem ao código, com o número médio de perguntas
iguais ao comprimento esperado da palavra-código do código.

Pergunta: A primeira questão neste esquema torna-se: o pri-


meiro bit é igual a 1 na palavra-código do objeto?
Alguns comentários sobre o código de Huffman

Uma vez que o código Huffman é o melhor código fonte para


uma variável aleatória, a série ótima de perguntas é a que de-
termina o código Huffman.

Pergunta: No exemplo em que X assume valores 1, 2, 3, 4 e 5


com probabilidade de 0,25, 0,25, 0,20, 0,15 e 0,15, respectiva-
mente, a primeira pergunta ótima é: X é igual a 2 ou 3?

A resposta a isso determina o primeiro bit do código Huffman.


Alguns comentários sobre o código de Huffman

Supondo que a resposta para a primeira pergunta é “sim”, a


próxima pergunta deve ser ”X é igual a 3?”, que determinará o
segundo bit.

No entanto, não precisamos esperar pela resposta à primeira


pergunta para responder a segunda.

Podemos pedir como nossa segunda pergunta “X é igual a 1


ou 3?”, determinando assim, o segundo bit do código Huffman
independente do primeiro.
Alguns comentários sobre o código de Huffman

O número esperado de questões E Q neste esquema ótimo sa-


tisfaz a seguinte equação:

H(X ) ≤ E Q < H(X ) + 1.


Alguns comentários sobre o código de Huffman

Código Huffman para palavras-código ponderadas


P
O algoritmo de Huffman para minimizar pk lk pode ser apli-
P conjunto de números pk ≥ 0, independen-
cado a qualquer
temente de pk . Neste caso, o código Huffman Pminimiza a
soma dos comprimentos dos códigos ponderados wk lk , em
vez comprimento médio do código.
Alguns comentários sobre o código de Huffman

Exemplo para realizar a minimização ponderada (utilizando o


mesmo algoritmo).

Tabela 12 : Código resultante.

X palavra-código Pesos Fase 1 Fase 2 Fase 3


1 00 5 8 10 18
2 01 5 5 8
3 10 4 5
4 11 4

Nesse caso, o código minimiza o comprimento da soma ponde-


rada da palavra-código, que neste caso será igual a 36.
Alguns comentários sobre o código de Huffman

Codificação Huffman e perguntas “fatiadas” (códigos alfabéticos)

Até agora, vimos a equivalência da codificação de origem com


o jogo de 20 questões.

A sequência ótima de perguntas corresponde a um código fonte


ideal para a variável aleatória. No entanto, os códigos de Huff-
man fazem perguntas arbitrárias da forma “X ∈ A?” para qual-
quer conjunto A ⊆ {1,2,3, . . . ,m}.
Código de Huffman e código de Shannon

Usando palavras-código de comprimento dlog p1k e (chamado de


código de Shannon) pode ser muito pior do que o código ideal
para algum sı́mbolo em particular.

Por exemplo, considere dois sı́mbolos, um dos quais ocorre com


probabilidade 0,9999 e o outro com probabilidade de 0,0001.

Em seguida, usando os comprimentos de palavras-código dlog p1k e


obteremos palavras-código de comprimento de 1 bit e 14 bits,
respectivamente.
Código de Huffman e código de Shannon

O comprimento ideal da palavra-código é, obviamente, 1 bit


para ambos os sı́mbolos.

Por isso, a palavra-código do sı́mbolo não frequente é muito


maior no código Shannon do que no código ótimo.

É verdade que os comprimentos das palavras-código para um


código ótimo são sempre menores que dlog p1k e?

O exemplo a seguir ilustra que isso não é sempre verdade.


Código de Huffman e código de Shannon

Considere uma variável aleatória X probabilidades ( 13 , 13 , 14 , 12


1
).
O código de Huffman produz palavras-códigos de comprimento
(2,2,2,2) ou (1,2,3,3), dependendo de onde colocar as probabi-
lidades mescladas.

Ambos os códigos alcançam o mesmo comprimento esperado


de palavras-código. No segundo código, o terceiro sı́mbolo tem
o comprimento 3, que é maior do que dlog p1k e.
Código de Huffman e código de Shannon

Assim, o comprimento da palavra-código para um código Shan-


non poderia ser menor que o comprimento da palavra-código
do sı́mbolo correspondente de um código ótimo (Huffman).

Este exemplo também ilustra o fato de que o conjunto de


comprimentos de palavras-código para um código ideal não é
exclusivo (pode haver mais de um conjunto de comprimentos
com o mesmo valor esperado).
Código de Huffman e código de Shannon

Embora o código de Shannon ou o código de Huffman possam


ser mais curtos para sı́mbolos individuais, o código de Huffman
é menor em média.

Além disso, o código Shannon e o código Huffman diferem em


menos de 1 bit no comprimento esperado, uma vez que ambos
estão entre H e H + 1.
Otimalidade do código Huffman

Provamos por indução que o código binário de Huffman é ótimo.

É importante lembrar que existem muitos códigos ótimos: in-


verter todos os bits ou trocar duas palavras-código do mesmo
comprimento darão outro código ótimo.

O código de Huffman constrói um desses códigos ótimos.

Para provar a otimidade dos códigos Huffman, primeiro prova-


mos algumas propriedades de um código ótimo em particular.
Otimalidade do código Huffman

Sem perda de generalidade, assumiremos que as probabilida-


des são ordenadas de modo que p1 ≥ p2 ≥ . . . ≥ pm .
P
Temos que um código é ótimo se pk lk é mı́nimo.
Otimalidade do código Huffman

Lema
Para qualquer distribuição, existe um código ótimo instantâneo
(com comprimento esperado mı́nimo) que satisfaz as seguintes
propriedades:
1 Os comprimentos são ordenados inversamente com as
probabilidades, ou seja, se pj > pk , então lj ≤ lk .
2 Os dois códigos mais longos têm o mesmo comprimento.
3 Duas das palavras-códigos mais longas diferem apenas
no último bit e correspondem aos dois sı́mbolos menos
prováveis.
Otimalidade do código Huffman

Prova

A prova equivale a trocar, cortar e reorganizar, como mostrado


na Figura a seguir. Considere um código ideal Cm :
Se pj > pk , então, lj ≤ lk . Aqui trocamos as
palavras-códigos. Considere Cm 0 , com as palavras-códigos

j e k de Cm trocadas. Então
X X
0
L(Cm ) − L(Cm ) = pi li0 − pi li
= pj lk + pk lj − pj lj − pk lk
= (pj − pk )(lk − lj )

Mas se pj − pk > 0, e desde que Cm seja ótimo,


0 ) − L(C ) ≥ 0. Então, C satisfaz a propriedade 1.
L(Cm m m
Otimalidade do código Huffman

Prova

A prova equivale a trocar, cortar e reorganizar, como mostrado


na Figura a seguir. Considere um código ideal Cm :
Se pj > pk , então, lj ≤ lk . Aqui trocamos as
palavras-códigos. Considere Cm 0 , com as palavras-códigos

j e k de Cm trocadas. Então
X X
0
L(Cm ) − L(Cm ) = pi li0 − pi li
= pj lk + pk lj − pj lj − pk lk
= (pj − pk )(lk − lj )

Mas se pj − pk > 0, e desde que Cm seja ótimo,


0 ) − L(C ) ≥ 0. Então, C satisfaz a propriedade 1.
L(Cm m m
Otimalidade do código Huffman

Figura 1 : Propriedades dos códigos ótimos. Assumimos que


p1 ≥ p2 ≥ . . . ≥ pm . Um possı́vel código instantâneo é dado em (a).
Ao cortar ramos sem irmãos, melhoramos o código para (b).
Otimalidade do código Huffman

Figura 2 : Agora reorganizamos a árvore como mostrado em (c), de


forma que os comprimentos de palavras sejam ordenados pelo
aumentando do comprimento de cima para baixo. Finalmente,
trocamos atribuições de probabilidade para melhorar a profundidade
esperada da árvore, como mostrado em (d). Todo código ótimo pode
ser reorganizado e trocado em forma canônica como em (d), onde
l1 ≤ l2 ≤ . . . ≤ lm e lm−1 = lm , e as últimas duas palavras-códigos
diferem apenas no último bit.
Otimalidade do código Huffman

As duas palavras-códigos mais longas são do mesmo


comprimento.

Se as duas palavras-códigos mais longas não tiverem o


mesmo comprimento, pode-se apagar o último bit do mais
longo, preservando a propriedade de prefixo e alcançando
menor comprimento esperado de palavras-código.

Assim, as duas palavras-códigos mais longas devem ter o


mesmo comprimento.

Pela propriedade 1, as palavras-códigos mais longas


devem pertencer aos sı́mbolos de fonte menos prováveis.
Otimalidade do código Huffman

As duas palavras-códigos mais longas diferem apenas no


último bit e correspondem para aos dois sı́mbolos menos
prováveis.

Nem todos os códigos ótimos satisfazem isso mas, ao


reorganizar, podemos encontrar um código ótimo que o
faça.

Se houver uma palavra-código de comprimento máximo


sem um irmão, podemos excluir o último bit da
palavra-código e ainda satisfazer a propriedade do prefixo.

Isto reduz o comprimento médio das palavras-códigos e


contradiz a otimização do código.
Otimalidade do código Huffman

Portanto, todas as palavras-códigos de tamanho máximo


em qualquer código ótimo tem um irmão.

Agora, podemos trocar as palavras-códigos mais longas,


então os dois sı́mbolos de origem de menor probabilidade
estão associados a dois irmãos na árvore.
P
Isso não altera o comprimento esperado, pk lk .

Assim, as palavras-códigos para as duas probabilidades


mais baixas têm o comprimento máximo e concordam em
todos, exceto o último bit.
Otimalidade do código Huffman

Resumindo, mostramos que, se p1 ≥ p2 ≥ . . . ≥ pm , existe um


código ideal com l1 ≤ l2 ≤ . . . ≤ lm−1 = lm , e palavras-código
C(xm − 1) e C(xm ) que diferem apenas no último bit.
Otimalidade do código Huffman

Assim, mostramos que existe um código ótimo que satisfaz as


propriedades do lema.

Chamamos esses códigos de códigos canônicos.

Para qualquer função valor de probabilidade de um alfabeto de


tamanho m, p = (p1 , p2 , . . . , pm ) com p1 ≥ p2 ≥ . . . ≥ pm ,
definimos a redução de Huffman p0 = (p1 , p2 , . . . , pm−2 , pm−1 +
pm ) sobre um alfabeto de tamanho m − 1, como mostrado na
figura a seguir.
Otimalidade do código Huffman

Figura 3 : Passo de indução para a codificação de Huffman. Seja


p1 ≥ p2 ≥ . . . ≥ p5 . Um canônico código ótimo canônico é ilustrado
em (a). Combinando as duas probabilidades mais baixas, obtemos o
código em (b). Reorganizando as probabilidades em ordem
decrescente, obtemos o código canônico em (c) para m − 1 sı́mbolos.
Otimalidade do código Huffman

Teorema
O código de Huffman é ótimo, ou seja, se C ∗ é um código de
Huffman e C 0 é um código qualquer unicamente decodificável,
L(C ∗ ) ≤ L(C 0 ).

Vous aimerez peut-être aussi