Sei sulla pagina 1di 30

Huffman Coding

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)}

Ripeti n-1 volte - Seleziona la coppia di simboli (si,sj) tale che

- Sostituisci (si,pi) e (sj,pj) con ({si,sj}, pi + pj)


M. Diligenti 3

Huffman Coding

L'ordine con cui i simboli sono uniti, costruisce un albero


Modalit bottom-up

Ad ogni arco uscente da un nodo si assegna un valore 0 se il sinistro e 1 se destro

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

Huffman Coding: ottimalit

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

Huffman Coding: ottimalit


Caso peggiore se un simbolo s ha p(s) alta p(s)1 l(s)0 ma Huffman assegna sempre 1 bit Caso
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

Huffman Coding ottima


Esempio
Simbolo a b c d e f 0.25 0.25 0.25 0.125 0.0625 4 3 2 2 2 0.0625 4 Prob log 1/p

l(s) 4 4 3 2 2 2

Verifica le l(s)

M. Diligenti

10

Huffman Coding: complessit

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

Huffman Coding: complessit


Posso far di meglio? Si! Uso un heap per trovare la coppia di nodi a somma minima Costo O(m log(m)) Vediamo adesso come realizzarlo

M. Diligenti

12

Huffman Coding: heap

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

Huffman Coding: heap


2 5 9 6 3

Esempio albero dove la heap property verificata Potrei anche usarlo con ordinamento crescente

M. Diligenti

14

Huffman Coding: heap

Inserimento elemento Aggiunta in prima posizione libera Riaggiorno l'albero, scambiando i nodi finch propriet heap non verificata O(log n)
M. Diligenti 15

Huffman Coding: heap


2 2 2 2 5 5 5 5 9 9 9 9 Passo 1 6 6 6 6 3 3 3 3 1 1 1 1 9 9 9 9 5 5 5 5 6 6 6 6 1 2 2 2

2 1 1 1

3 3 3 3

Passo 2, heap valido

M. Diligenti

16

Huffman Coding: heap

Rimozione elemento Muovo ultimo elemento alla radice Scambio gli elementi finch heap non verificata O(log n)
Passo 1

M. Diligenti

17

Huffman Coding: heap


3 5 5 5 5 9 9 9 9 Passo 1 6 6 6 6 2 1 1 1 5 5 5 5 9 9 9 9 6 6 6 6 2

3 1 1 1

Passo 2, heap valido 18

M. Diligenti

Huffman Coding: heap

Heap permette di Trovare i due prossimi elementi i,j con minima pi e pj con complessit log(m)

Inserire un nuovo elemento con valore pi+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

Static Huffman Coding

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

Static Huffman Coding

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

Static Huffman Coding

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

Static Huffman Coding

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

Adaptive Huffman Coding


Soluzione: adattare la tabella direttamente mentre si codifica

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

Adaptive Huffman Coding

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

Adaptive Huffman: FGK

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

Adaptive Huffman: FGK

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

Adaptive Huffman: FGK

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

Adaptive Huffman: FGK


Algoritmo FGK

Entra b

Perso ordine

M. Diligenti

29

Esercizio su Huffman Coding


Dato la seguente tabella di probabilit Calcolare il fattore di compressione per la stringa aaababecaba Fattore compressione = numero_bit_compressi / numero_bit_iniziali
M. Diligenti
Simbolo a b c d e f g

Prob

0.5

0.3

0.1

0.05

0.02

0.02

0.01

30