Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
new probabilities
Un esempio - IV
c
high
(P[ c ]=1/4)
0.6667 0.5834
(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
c
0.6334
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
b
0.6390 0.6334
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
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)
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 =
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