Sei sulla pagina 1di 30

La codifica aritmetica

Come possiamo far meglio di Huffman? - I


Come abbiamo visto, il principale svantaggio della codifica di Huffman sono i suoi problemi quando c' un simbolo che ha probabilit molto alta Ricordare il limite sulla ridondanza della codifica di Huffman statica
ridondanza p10.086
dove p1 la probabilit del simbolo pi probabile

Come possiamo far meglio di Huffman? - II


L'unico modo per superare questa limitazione quella di utilizzare, come simboli, gruppi di caratteri. In questo modo l'inefficienza per-simbolo spalmata sull'intero gruppo Comunque, l'uso dei gruppi difficile da implementare dato che ci deve essere un gruppo per ogni possibile combinazione di caratteri e quindi il numero dei gruppi cresce esponenzialmente con la lunghezza dei gruppi

Come possiamo far meglio di Huffman? - III


Il codice di Huffman ottimo nelle sue condizioni
modello statico un simbolo, una parola
Huffman adattivo gruppi codifica aritmetica

L'idea fondamentale
La codifica aritmetica supera completamente l'idea di sostituire un simbolo in ingresso con una parola di codice. Al contrario, trasforma un flusso di simboli in ingresso in un singolo numero in virgola mobile in [0,1) Pi lungo e complesso il messaggio e pi bit sono necessari per rappresentare il numero in uscita

L'idea fondamentale - II
L'uscita dell'algoritmo di codifica aritmetica , come al solito, un flusso di bit Tuttavia si pu pensare come se ci fosse uno 0 iniziale, e il flusso rappresenti un numero frazionale in binario, compreso fra 0 e 1
01101010 0.01101010
Per spiegare l'algoritmo, i numeri che mostrer saranno in base 10, ma ovviamente in realt sono sempre in base 2

Un esempio - I
Stringa bccb dall'alfabeto sorgente {a,b,c}
Problema della frequenza 0 risolto inizializzando a 1 tutti i contatori dei caratteri Quando inizio a codificare il primo b tutti i simboli hanno il 33% di probabilit (perch?) ) La codifica aritmetica mantiene due numeri, low e high, che rappresentano un sottointervallo [low,high) sottoinsieme di [0,1) Inizialmente low=0 e high=1

Un esempio - II
L'intervallo tra low e high viene diviso tra i simboli dell'alfabeto, proporzionalmente alle loro probabilit
high 1
(P[ c ]=1/3)

c
0.6667

(P[ b ]=1/3)

b
0.3333

(P[ a ]=1/3)

a low
0

Un esempio - III
b

high 1 c
0.6667

high = 0.6667

b
0.3333

a low 0

low = 0.3333 P[a]=1/4 P[b]=2/4 P[c]=1/4

new probabilities

Un esempio - IV
c

high
(P[ c ]=1/4)

0.6667 0.5834

high = 0.6667 new probabilities P[a]=1/5 P[b]=2/5 P[c]=2/5

(P[ b ]=2/4)

b
0.4167

(P[ a ]=1/4)

low

0.3333

a
low = 0.5834

Un esempio - V
c

high
(P[ c ]=2/5)

0.6667

high = 0.6667 new probabilities P[a]=1/6 P[b]=2/6 P[c]=3/6

c
0.6334

(P[ b ]=2/5) (P[ a ]=1/5)

b
0.6001 0.5834

low

a
low = 0.6334

Un esempio - VI
b

high
(P[ c ]=3/6)

0.6667

high = 0.6501

c
0.6501

(P[ b ]=2/6) (P[ a ]=1/6)

b
0.6390 0.6334

Final interval [0.6390,0.6501) we can send 0.6400


low = 0.6390

low

Un esempio - riassunto
Partendo dall'intervallo tra 0 e 1 ci restringiamo ogni volta al sottointervallo che codifica il simbolo dato Alla fine l'intera sequenza pu essere codificata da un numero qualunque nell'intervallo finale (ricordando le parentesi...)

Un esempio - riassunto
1
1/3

0.6667
1/4

0.6667

0.6667

0.6667
1/3

0.5834
2/4

2/5

3/6 2/6

c b a

0.6334

0.6501 0.6390 0.6334

2/5

b a

0.3333
1/3

0.4167
1/4

1/5

0.6001

1/6

0.5834

0.3333

a
0

[0.6390, 0.6501)

0.6400

Un altro esempio - I
Consideriamo la codifica del nome BILL GATES Abbiamo bisogno delle frequenze delle varie lettere nel testo.
carattere space A B E G I L S T frequenza 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.1 0.1

Un altro esempio - II
carattere space A B E G I L S T probabilit 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.1 0.1 intervallo [0.00, 0.10) [0.10, 0.20) [0.20, 0.30) [0.30, 0.40) [0.40, 0.50) [0.50, 0.60) [0.60, 0.80) [0.80, 0.90) [0.90, 1.00)

Un altro esempio - III


Carattere B I L L Space G A T E S low 0.0 0.2 0.25 0.256 0.2572 0.25720 0.257216 0.2572164 0.25721676 0.257216772 0.2572167752 high 1.0 0.3 0.26 0.258 0.2576 0.25724 0.257220 0.2572168 0.2572168 0.257216776 0.2572167756

Il valore finale di low, 0.2572167752 codifica univocamente il nome BILL GATES

Decodifica - I
Supponiamo di dover decodificare 0.64 nel primo esempio Il decodificatore ha bisogno delle probabilit dei simboli, dal momento che deve ripetere quanto fatto dal codificatore Si comincia con low=0 e high=1 e si divide l'intervallo esattamente come ha fatto il codificatore (a in [0, 1/3), b in [1/3, 2/3), c in [2/3, 1)

Decodifica - II
Il numero ricevuto cade nell'intervallo corrispondente a b, perci b deve essere stato il primo simbolo codificato Quindi il decodificatore calcola i nuovi valori per low (0.3333) per high (0.6667), aggiorna le probabilit dei simboli e divide l'insieme da low a high in accordo con le nuove probabilit La decodifica procede finch l'intera stringa non stata ricostruita

Decodifica - III
0.64 in [0.3333, 0.6667) 0.64 in [0.5834, 0.6667)
e cos via...

b c...

Perch funziona?
Un numero in un intervallo pi piccolo ha bisogno di pi bit per essere codificato Eventi ad alta probabilit non diminuiscono di molto l'estensione dell'intervallo, mentre eventi a bassa probabilit conducono ad intervalli molto pi ridotti Il numero di bit richiesti per la codifica proporzionale a meno il logaritmo della dimensione dell'intervallo

Perch funziona?
La dimensione dell'intervallo finale il prodotto delle probabilit dei simboli codificati, perci il logaritmo di questo prodotto la somma dei logaritmi di ciascun termine Perci un simbolo s con probabilit ps genera
log p s bit in uscita, che uguale al contenuto informativo del simbolo (incertezza) !!

Perch funziona?
Per questo motivo, la codifica aritmetica quasi ottima come numero di bit in uscita, ed capace di codificare eventi molto probabili in appena una frazione di bit! In pratica, l'algoritmo non esattamente ottimo per via dell'uso di aritmetica a precisione limitata, e perch la codifica finale deve comunque essere fatta da un numero intero di bit

Un trucco - I
Per come abbiamo descritto l'algoritmo, l'intero output disponibile soltanto quanto la codifica terminata In pratica possibile emettere dei bit durante la codifica, e questo elimina anche la necessit di avere un'aritmetica di precisione sempre pi elevata durante la fase di codifica Il trucco consiste nell'osservare che quando low e high sono vicini fra loro, possono condividere un prefisso comune

Un trucco - II
Questo prefisso rimarr per sempre nei due valori, perci possiamo emetterlo e rimuoverlo da low e high Per esempio, nella codifica di bccb, succede che dopo la codifica del terzo carattere low=0.6334, high=0.6667 Si pu rimuovere il prefisso comune, emettendo il 6 e trasformando low e high in 0.334 and 0,667

La fase di codifica
Per codificare il simbolo s, se i simboli sono numerati da 1 a n and il simbolo i ha probabilit pi low_bound =

i=1 pi high_bound = s p i=1 i


range = high - low low = low + range * low_bound high = low + range * high_bound

s1

La fase di decodifica
I simboli sono numerati da 1 a n e value il codice aritmetico da decodificare Trovare s tale che

i=1

s1

valuelow pi highlow

pi
i=1

Emettere il simbolo s Restringere l'intervallo esattamente come durante la codifica

Implementare la codifica aritmetica


Come detto prima, la codifica aritmetica utilizza un numero binario frazionario con precisione illimitata Lavorando con precisione finita (es. 16 or 32 bit) rende la compressione un po' peggiore rispetto al limite fissato dall'entropia E' possibile anche costruire codificatori e decodificatori in aritmetica intera, scontando un'altra piccola degradazione della compressione

Codifica aritmetica vs. codifica di Huffman


In un tipico testo in lingua inglese, lo spazio il simbolo pi comune, con una probabilit di circa il 18%, perci il limite superiore della ridondanza di Huffman piuttosto piccolo. Al contrario, in immagini in bianco e nero, la codifica aritmetica molto migliore di quella di Huffman a meno di non usare una tecnica a blocchi (gruppi)
A La codifica aritmetica richiede meno memoria dato che la rappresentazione dei simboli calcolata al volo A La codifica aritmetica pi adatta per modelli ad alte performance, le cui predizioni hanno una probabilit stimata molto alta

Codifica aritmetica vs. codifica di Huffman


H La decodifica di Huffman generalmente pi veloce H Nella codifica aritmetica non facile cominciare a decodificare a met del flusso di bit. Nella codifica di Huffman invece si pu far uso di opportuni punti di ingresso In una collezione di testi ed immagini probabile che Huffman venga usato per i testi e la codifica aritmetica per le immagini

Potrebbero piacerti anche