Você está na página 1de 4

Codicao aritmtica

Algoritmo para compresso de dados, no-baseado em


tabelas de smbolos. O codicador aritmtico elimina a
associao entre smbolos individuais e palavras-cdigos
de comprimento inteiro e, com isto, capaz de praticamente igualar a entropia da fonte em todos os casos.

e encontra-se novamente o intervalo que corresponde ao


prximo smbolo. Ao nal do processo, teremos um intervalo que corresponde a probabilidade da ocorrncia de
todos os smbolos na ordem correta. A gura ao lado ilustra essa diviso e subdiviso sucessiva dos intervalos.

A partir de um modelo estatstico, constri-se uma tabela


onde so listadas as probabilidades de o prximo smbolo lido ser cada um dos possveis smbolos. Em geral
esta probabilidade simplesmente a contagem de todas
as ocorrncias do smbolo no arquivo dividida pelo tamanho do arquivo:

A sada do algoritmo ento um valor que esteja contido


neste intervalo e possa ser representado com o menor nmero possvel de dgitos. Na prtica no se tenta encontrar o menor nmero de dgitos, mas apenas um nmero
razovel de dgitos.

P () =

n
N

onde P () a probabilidade de ocorrncia do smbolo 1 Descrio do algoritmo


, n o nmero de ocorrncias desse smbolo e N o
tamanho do arquivo. Em contextos especcos (ao asso- A codicao aritmtica pode ser descrita como se segue:
ciar a codicao aritmtica com outros mtodos de compresso como o BWT por exemplo) outros modelos mais
1. Cria-se um intervalo corrente iniciado com [0,1)
apropriados podem ser adotados, que desprezam parte do
contexto, ou usam probabilidades determinadas dinami2. Para cada elemento da mensagem:
camente a medida que o arquivo processado.
(a) Particiona-se o intervalo corrente em subinterEsta tabela expressa na forma de intervalos cumulativos,
valos, um para cada letra do alfabeto. O tamade tal forma que se ordenarmos os smbolos em uma ornho do subintervalo associado a uma dada letra
dem qualquer, o incio do intervalo de um smbolo coin proporcional probabilidade de que esta lecide com o nal do intervalo do smbolo anterior. O pritra seja o prximo elemento da mensagem, de
meiro smbolo tem seu intervalo comeado em 0 e o lacordo com o modelo assumido.
timo smbolo tem seu intervalo terminado em 1. Sejam
os smbolos ordenados de 1 a N chamados respectiva(b) O subintervalo correspondente letra que
mente de 1 , 2 , ..., N e I(n ) o intervalo do n-simo
realmente o prximo elemento selecionado
smbolo:
como novo intervalo corrente.
)
[
n
n1
I(n ) =
i=1 P (i )
i=1 P (i ),
3. Codica-se a mensagem com o menor nmero de
[[Imagem:Arithmetic
encobits necessrio para distinguir o intervalo corrente
ding.svg|thumb|300px|Diagrama
representando
a
nal de todos os outros possveis intervalos correntes
subdiviso dos intervalos na codicao aritmtica,
nais.
usando-se quatro smbolos de probabilidades 0.6, 0.2,
0.1, e 0.1. Os crculos negros representam a mensagem
codicada, que pode ser decodicada para o primeiro Pode-se ver uma implementao em linguagem python
smbolo, depois o terceiro, em seguida o quarto. A deste algoritmo ao nal do artigo, na seo #Exemplo de
primeira linha mostra o intervalo completo [0,1) en- implementao
quanto as linhas subsequentes mostram as subdivises
proporcionais do intervalo anterior.]]
O algoritmo de codicao aritmtica consiste em repre- 2 Clculo com preciso nita
sentar a probabilidade de ocorrncia de cada caractere de
acordo com esses intervalos. Parte-se do intervalo [0, 1) Se nos basearmos diretamente na denio da codicao
e nele identica-se o subintervalo ao qual corresponde o aritmtica iremos esbarrar em dois problemas prticos:
primeiro smbolo lido do arquivo. Para cada smbolo subseqente, subdivide-se o intervalo atual em sub-intervalos
1. nenhuma codicao produzida antes que toda a
proporcionais s probabilidades da tabela de intervalos,
mensagem tenha sido processada.
1

EXEMPLO

2. o clculo dos limites do intervalo corrente para men- No nal deste processo, emitimos o valor de low na sada,
sagens genricas exige aritmtica de altssima preci- que representa os ltimos dgitos do nosso cdigo aritmso;
tico (os outros dgitos j foram emitidos durante o processo).
Entretanto a soluo para tal problema relativamente
simples. Um codicador aritmtico prtico usa apenas de 2.1 Underow
aritmtica inteira para simular a aritmtica de nmeros
reais. Para isso ele trabalha da seguinte maneira:
Nessa abordagem temos ainda um problema:
Denem-se dois valores que chamaremos de high e low
O que acontece se nosso intervalo se aproxima cada
que representam o intervalo atual. No incio esse intervez mais, mas o ltimo digito no se torna o mesmo?
valo entre [0, 1) . Entretanto estamos trabalhando apePor exemplo,
nas com inteiros, de preciso nita. Ento vamos considerar que high e low so apenas os primeiros dgitos
aps da vrgula no nosso intervalo. Sabemos tambm que low = 4999 high = 5000
0, 999... equivalente a 1 [1] . Ento podemos representar
Nessa situao apenas se a probabilidade dor prximo
(considerando base decimal e preciso de 4 dgitos):
smbolo for 100% que conseguimos emitir um dgito
high = 9999 low = 0000
na sada. Entretanto, podemos observar que quando essa
Representando nosso intervalo inicial. Para cada carac- situao acontece temos:
tere lido, devemos estreitar esse intervalo proporcionalmente a probabilidade do caractere. Assim teremos a
cada passada:

o primeiro dgito de low um a menos que o primeiro dgito de high

new_low = low + (high-low+1) * prob_inicial new_high


= low + (high-low+1) * prob_nal - 1

o segundo dgito de low 9

onde new_low e new_high so os novos valores para low


e high, e prob_inicial e prob_nal so respectivamente
o incio e o m do intervalo das probabilidades cumulativas de ocorrncia do caractere[2] . A cada caractere
lido reaplica-se essa frmula at que tenham sido lidos
todos os caracteres. Entretanto isto ainda no resolve o
problema da preciso nita da nossa aritmtica: caso o
resultado desejado tenha mais de 4 dgitos depois da vrgula, no seremos capazes de calcular este valor. O passo
a seguir soluciona os dois problemas listados no inicio
dessa seo:
Caso o primeiro dgito (o dgito mais a esquerda)
dos dois valores, low e high venha a se tornar idntico, sabemos que ele no mais mudar[1] e com isso
podemos elimin-lo dos nossos clculos e escrev-lo
na sada do nosso programa.

o segundo dgito de high 0


Essa situao chamada de underow. A soluo para
esse caso tambm simples: mantemos um contador para
as vezes onde ela acontece e eliminamos o segundo dgito
de low e high. Quando o primeiro dgito dos dois nmeros se igualarem, emitimos normalmente o dgito que se
igualou e ento vericamos:
se ele se igualou para cima, ou seja foi o primeiro
dgito de low que cresceu para se igualar ao primeiro
dgito de high, ento emitimos uma seqncia de
dgitos 0 do tamanho do contador (se o contador for
3, emitimos 000, se for 4 emitimos 0000 e assim por
diante).
se ele se igualou para baixo emitimos a mesma
seqncia, s que de dgitos 9.

No momento da descompresso basta seguir o mesmo


Assim, caso os dgitos mais signicativos do nosso inter- procedimento, ignorando os dgitos introduzidos pela
valo se igualem, escrevemos o dgito na sada (resolvendo tcnica acima semrpe que ocorrer um underow.
o problema 1) e atualizamos nosso intervalo para ignorar
esse dgito (i.e. nossos valores low e high passam a ser
os dgitos da segunda casa aps a vrgula em diante). Os
3 Exemplo
novos valores para low e high nesse caso sero:
ultimo_digito = 1000 * (high / 1000) high = (high - ul- O quadro abaixo mostra um exemplo de codicao arittimo_digito) * 10 + 9 low = (low - ultimo_digito) * 10
metica da cadeia A_ASA_DA_CASA. O modelo que utiNo caso de high somamos 9 pois o valor original de high lizamos considera a probabilidade de ocorrncia do smrepresentava 0, 999... , uma dzima peridica cujo pr- bolo como o nmero total de ocorrncias do mesmo diviximo dgito que vamos buscar sempre ser 9. em am- dido pelo tamanho da cadeia. Assim temos uma probabos os casos multiplicamos por 10 para poder ganhar bilidade xa durante todo o processo. As probabilidades
dessa cadeia so:
um dgito na nossa preciso.

3
Baseado nesse quadro podemos executar os passos da codicao. O quadro abaixo representa a codicao de
cada letra. Quando algum dgito produzido na sada,
estes dgitos so indicados na ltima coluna.
Temos na sada os dgitos 2493469, que acrescidos dos
dgitos de low (podemos ignorar os zeros no nal) se torna
249346946. Esse nosso cdigo aritmtico para a frase
inicial. Esse nmero pode ser expresso em 28 bits. A
frase inicial tem 13 caracteres, que podem ser expressos
com 3 bits cada, totalizando 39 bits. Com a compresso
aritmtica economizamos 11 bits.
Podemos reduzir ainda mais esse valor se repararmos que
o nmero 5000 ca entre os intervalos de low e high nais, economizando assim mais um dgito na codicao:
249346946. Em binrio temos agora 25 bits. Isso representa um bit a menos que a codicao de Human da
mesma cadeia, mostrando que a codicao aritmtica
a que mais aproxima a entropia da cadeia de entrada.

Notas e Referncias

[1] Para uma prova dessa armativa veja SALOMON, David. Data Compression: The Complete Reference. 2 ed.
Nova Iorque: Springer, 2000. ISBN 0-387-95045-1 ou
qualquer livro de Clculo diferencial.
[2] A probabilidade cumulativa de ocorrncia de um caractere calculada ordenando-se os caracteres e somando a
probabilidade de ocorrncia de cada um dos caracteres
anteriores a ele. O intervalo de cada caractere inicia-se na
soma de todos os anteriores e termina no inicio da probabilidade cumulativa do prximo caractere na ordenao.

Bibliograa
(em ingls) SALOMON, David. Data Compression: The Complete Reference. 2 ed. Nova Iorque:
Springer, 2000. ISBN 0-387-95045-1

Ver tambm
Codicao de Human
Compresso sem perda de dados

Fontes, contribuidores e licenas de texto e imagem

7.1

FONTES, CONTRIBUIDORES E LICENAS DE TEXTO E IMAGEM

Texto

Codicao aritmtica Fonte: http://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_aritm%C3%A9tica?oldid=37359573 Contribuidores: Rnbastos, Ziguratt, Chobot, YurikBot, Salgueiro, He7d3r, Girino, Thijs!bot, Daimore, BotMultichill, Joaosilvakle, D'ohBot,
Ariel C.M.K., Addbot e Annimo: 5

7.2

Imagens

Ficheiro:Nuvola_apps_edu_mathematics-p.svg Fonte:
http://upload.wikimedia.org/wikipedia/commons/c/c2/Nuvola_apps_edu_
mathematics-p.svg Licena: GPL Contribuidores: Derivative of Image:Nuvola apps edu mathematics.png created by self Artista original:
David Vignoni (original icon); Flamurai (SVG convertion)
Ficheiro:Wikitext.svg Fonte: http://upload.wikimedia.org/wikipedia/commons/c/ce/Wikitext.svg Licena: Public domain Contribuidores: Obra do prprio Artista original: Anomie

7.3

Licena

Creative Commons Attribution-Share Alike 3.0

Você também pode gostar