ompressione di testo Marco Gori, Università di Siena 1 Compressione dell Informazione (Parte II) Arithmetic Coding e Codifica di Testo Marco Gori marco@dii.unisi.it
log 1 p ompressione di testo Marco Gori, Università di Siena 2 Codifica di Huffman: Il Campione in Esilio! Secondo il lower bound dell entropia il numero minimo di simboli a carattere ffl (presente con probabilità p) è Ma, la codifica di Huffman conduce a codici interi! p = 1=7 Se 2:81::: servono bit. Con Huffman devo usare o 2 o 3 bit e questo porta ad uno spreco. ffl Caso limite di spreco: caratteri ad alta (bassa) probabilità. Se p = 0:9 servono 0:15::: bit... e quindi con Hufman si spreca molto. ffl Caso in cui Huffman è realmente ottimo : p = 2 m Da oltre un decennio la codifica c è una valida alternativa
ompressione di testo Marco Gori, Università di Siena 3 Arithmetic Coding Esempio: Voglio codificare BILL GATES. Le probabilità dei simboli sono Simbolo Probabilità spazio 0.1 A 0.1 B 0.1 E 0.1 G 0.1 I 0.1 L 0.2 S 0.1 T 0.1
ompressione di testo Marco Gori, Università di Siena 4 Allocazione del Range Simbolo Probabilità Range spazio 0.1 0.00-0.10 A 0.1 0.10-0.20 B 0.1 0.20-0.30 E 0.1 0.30-0.40 G 0.1 0.40-0.50 I 0.1 0.50-0.60 L 0.2 0.60-0.80 S 0.1 0.80-0.90 T 0.1 0.90-1.00
ompressione di testo Marco Gori, Università di Siena 5 Costruzione Intervalli di Codifica Carattere Estremo Inferiore Estremo Superiore B 0.2 0.3 I 0.25 0.26 L 0.256 0.258 L 0.2572 0.2576 spazio 0.25720 0.25724 G 0.257216 0.257220 A 0.2572164 0.2572168 T 0.25721676 0.2572168 E 0.257216772 0.257216776 S 0.2572167752 0.2572167756
ompressione di testo Marco Gori, Università di Siena 6 Algoritmo di Codifica low:=0 high:=0 While there are still input symbols do get an input symbol range:=high - low high:= low + range*high_range(symbol) low:= low + range*low_range(symbol) End of While Output low
ompressione di testo Marco Gori, Università di Siena 7 Algoritmo di Decodifica get encoded number Do find symbol whose range straddles to the encoded numb output the symbol range:=symbol high value - symbol low value encoded_number:= encoded number - low_value_code encoded_number:= encoded_number/range Until no more symbols
0:256 = 0:0100000110::: 0:258 = 0:010000100001::: ompressione di testo Marco Gori, Università di Siena 8 E necessaria rappresentazione dei numeri reali? Ovviamente no! RAPPRESENTAZIONE DELL INTERVALLO DI CODIFICA ffl Considera [0:256; l intervallo 0:258). Nota 8x 2 [0:256; 0:258) che soddisfa. Prendiamo allora il PIÙ PICCOLO NUMERO IN CODIFICA BINARIA DELL INTERVALLO. Si ha: Dunque 0:010000 = 0:0100001 soddisfa! Bastano 7 bit. Codifica e decodifica si possono eseguire per approssimazione con le operazioni ffl su interi... il tutto grazie al fatto che mi basta un intervallo!
ompressione di testo Marco Gori, Università di Siena 9 Riflessioni sulla Codifica Aritmetica Cosa succede n con simboli equiprobabili? La codifica aritmetica si riduce alla FORMA POLINOMIA. Sviluppare per esercizio: Nota che il range assume una forma di potenza... Si tocca il limite dell entropia (massima)
ompressione di testo Marco Gori, Università di Siena 10 Riflessioni sulla Codifica Aritmetica Perchè comprime? Considera il seguente caso limite: Un messaggio è composto da un s simbolo ad alta p probabilità e da simboli rimanenti con q = 1 probabilità p. Che codifica ha il messaggio s:::s ripetuto n volte? Qual è l effetto della probabilità p sulla lunghezza del codice? La codifica aritmetica A(s)è
A(s) = p + p (1 p) + p (1 p) 2 + ::: = p nx k=1 q k 1 q n+1 1 q = 1 q n+1 ompressione di testo Marco Gori, Università di Siena 11 = p
A(s) = 1 q n+1 ompressione di testo Marco Gori, Università di Siena 12 Riflessioni sulla Codifica Aritmetica (con t) Sono più piccoli quando cresce p... Considera ad esempio p = 1 2 e p = 1 4 Per p = 1=2 il messaggio si codifica con n + 1 bit, per p = 1=4 ne servono il doppio. Due interessanti problemi: 1. PARADOSSO DEL SIMBOLO TERMINALE:Che succede se il messaggio ha lungh. infinita? Si ha A(s)! 0. La codifica ha lunghezza nulla!? 2. Che codifica avrebbe avuto il messaggio sss... se avessi deciso di piazzare il simbolo s nell intervallo [0; p)? In particolare che codifica per ss e sss?