Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Michelangelo Diligenti Dipartimento di Ingegneria dellInformazione Universit di Siena Email: diligmic@dii.unisi.it http://www.dii.unisi.it/~diligmic/BDM2011
M. Diligenti
Huffman Coding
Costruisce un albero con i simboli sulle foglie La navigazione dell'albero permette l'assegnazione dei codici
Ci dice come scegliere i codici istantanei tale che la codifica dei simboli sia vicino all'ottimo
M. Diligenti
Huffman Coding
Algoritmo T->{(s1,p1), ..., (sn,pn)}
Huffman Coding
Il codice di un nodo pari alla sequenza binaria che si attraversa per andare dalla radice alla foglia corrispondente al nodo
M. Diligenti 4
Huffman Coding
Esempio
Simbolo a b c d e f 0.05 0.05 0.1 0.2 0.3 0.3 Prob log 1/p 4.32 4.32 3.32 2.32 1.72 1.72
M. Diligenti
Huffman Coding
Esempio
0 0 0 0.1 0 a 0.05 M. Diligenti 1 1 b 0.05 c 0.1 c 0.2 1 0 c 0.3 0.2 1 0.6 1 c 0.3 6 0.4 1 1.0
Huffman Coding
Abbiamo compresso bene?
I(S)=0.05*4.32+0.05*4.32+0.1* 3.32+0.2*2.32+0.3*1.72+0.3*1. 72=2.26 L=0.05*4+0.05*4+0.1*3+0.2*2 +0.3*2+0.3*2=2.3 L-I(S)=0.04 bits sopra l'ottimo
s a b c d e f P(s) -log p 0.05 4.32 0.05 4.32 0.1 0.2 0.3 0.3 3.32 2.32 1.72 1.72
l(s)
M. Diligenti
Quanto Huffman vicino al limite dato da I(S)? Vorremmo che l(s) = log(1/p(s)) Huffman produce codici interi, numero di bit per simbolo un valore intero Se p(s)=1/7, l(s)=2.81 ma Huffman gli assegna 3 bit
M. Diligenti
migliore se tutti i simboli hanno p(s)=2-m l(s)=m Huffman l'ottimo, non si pu far meglio Vedremo come superare il limiti di Huffman
9
l(s) 4 4 3 2 2 2
Verifica le l(s)
M. Diligenti
10
Complessit algoritmo per la costruzione dell'albero alta Per ogni simbolo (m volte) calcola pi + pj per ogni coppia di simboli (m2 operazioni) Complessit risulta O(m3)
M. Diligenti
11
M. Diligenti
12
Heap un albero binario che ha le seguenti propriet (heap property) La radice memorizza il valore minimo tra tutti i nodi dell'albero Il valore memorizzato in un nodo superiore al valore memorizzato nel padre
M. Diligenti
13
Esempio albero dove la heap property verificata Potrei anche usarlo con ordinamento crescente
M. Diligenti
14
Inserimento elemento Aggiunta in prima posizione libera Riaggiorno l'albero, scambiando i nodi finch propriet heap non verificata O(log n)
M. Diligenti 15
2 1 1 1
3 3 3 3
M. Diligenti
16
Rimozione elemento Muovo ultimo elemento alla radice Scambio gli elementi finch heap non verificata O(log n)
Passo 1
M. Diligenti
17
3 1 1 1
M. Diligenti
Heap permette di Trovare i due prossimi elementi i,j con minima pi e pj con complessit log(m)
Costruzione di albero Huffman ripete passo di cancellazione ed inserimento m volte (uno per simbolo) O(m log(m))
19
M. Diligenti
Per ora abbiamo usato Huffman statico Si assume che le probabilit siano conosciute a priori PROBLEMA: le probabilit buone per tutte le stagioni possono non essere troppo accurate per i dati da comprimere
M. Diligenti
20
Soluzione: costruire la tabella delle p(s) a partire dai dati da comprimere Si stimano le probabilit con una scansione dei dati Miglior modello, la tabella accurata per i dati da comprimere Risultato: una migliore compressione
M. Diligenti
21
Soluzione: costruire la tabella delle p(s) sui dati da comprimere La tabella non sempre la stessa, va passata al decodificatore. Dati da memorizzare in pi Lentezza: si scandisce i dati due volte
M. Diligenti
22
Soluzione: costruire la tabella delle p(s) sui dati da comprimere Il documento pu essere composto di sottoparti eterogenee, una tabella unica non ottima per l'intero documento Esempio pagina Web
M. Diligenti
Inizio documento dati di formattazione tanti tag HTML. Alte le p(<), p(>) Corpo documento poca formattazione basse le p(<), p(>) 23
Il decodificatore si adatta anch'esso sulla base dei simboli gi decompressi, non serve inviare tabella separata Sfruttamento del principio di localit spaziale dei dati: parti di testo contigue hanno distribuzioni di simboli simili
M. Diligenti
24
Creo albero di Huffman sulla base del testo gi processato Continuo a processare il testo adattando le p(s) e quindi l'albero di Huffman
DOMANDA: se Huffman statico gi ottimo (almeno limitandoci ai codici interi), come possibile che ci sia un miglioramento?
M. Diligenti
25
Se mi cambiano le p(s), l'albero cambia e non detto sia ottimale ma come lo aggiorno in modo efficiente?
Algoritmo FGK si basa sul fatto che i nodi in un albero di Huffman valido sono ordinati I nodi fratelli hanno ordine andando da sinistra verso destra Detta simbling property (propriet dei fratelli)
M. Diligenti 26
Algoritmo FGK Nei nodi memorizzate non le probabilit ma le occorrenze dei simboli. Tanto occorrenza e probabilit sono proporzionali Ogni simbolo che entra aggiungo 1 al conteggio dele occorrenze del nodo Ma cambiando i valori, i nodi perdono l'ordine (simbling property)
M. Diligenti
27
Algoritmo FGK FGK scambia i nodi in modo da mantenere l'arbero ordinato I nodi interessati sono scambiati e l'operazione viene ripetuta ricorsivamente fino alla radice
M. Diligenti
28
Entra b
Perso ordine
M. Diligenti
29
Prob
0.5
0.3
0.1
0.05
0.02
0.02
0.01
30