Salta al contenuto
Note per Studenti Codici di Shannon-Fano e di Huffman

Codici di Shannon-Fano e di Huffman

In questa pagina 6

Il teorema di Shannon (Codifica di sorgente - codici a prefisso e teorema di ShannonLa codifica di sorgente riduce il numero di bit mappando le parole della sorgente in parole di lunghezza variabile (più corte per le più probabili), senza perdere informazione. Il codice deve essere decodificabile; i codici a prefisso (nessuna parola è prefisso di un'altra) lo sono. Kraft-McMillan: se il codice è decodificabile $\sum M_y^{-L(b)}\le1$. Teorema di Shannon: $L_y\ge\frac{H(x)}{\log_2M_y}$ e esiste un codice a prefisso con $L_y\le\frac{H(x)}{\log_2M_y}+1$; l'efficienza è $\eta=\frac{H(x)}{L_y\log_2M_y}$.Codifica di sorgente - codici a prefisso e teorema di Shannon →) dà solo i limiti Hlog⁡2My≤Ly≤Hlog⁡2My+1\frac{H}{\log_2M_y}\le L_y\le\frac{H}{\log_2M_y}+1. Questi due algoritmi costruiscono codici a prefisso concreti.

Come deve essere un codice ottimo

Un codice è ottimo se ha la minima lunghezza media LyL_y tra i codici decodificabili per la stessa sorgente. Due proprietà (codici binari):

  • Proposizione 1. Se C\mathcal C è ottimo e P(b1)≤P(b2)P(b_1)\le P(b_2), allora L(b1)≥L(b2)L(b_1)\ge L(b_2). Dimostrazione per assurdo: se fosse P(b1)≤P(b2)P(b_1)\le P(b_2) con L(b1)<L(b2)L(b_1)<L(b_2), scambiando le due parole la nuova lunghezza media è Ly′=Ly−(P(b1)−P(b2))(L(b1)−L(b2))L_y'=L_y-\left(P(b_1)-P(b_2)\right)\left(L(b_1)-L(b_2)\right), e il prodotto dei due fattori (entrambi ≤0\le0) è ≥0\ge0, quindi Ly′≤LyL_y'\le L_y: il codice non era ottimo se vale la disuguaglianza stretta.
  • Proposizione 2. In un codice ottimo esistono due parole di lunghezza massima identiche tranne l'ultimo simbolo (se non fosse così, si potrebbe accorciare l'ultima parola togliendole l'ultimo bit).

Codifica di Shannon-Fano

Procedura top-downdall'alto verso il basso: si parte dalla radice dell'albero (dall'alto):

  1. si ordinano i simboli aia_i per probabilità P(ai)P(a_i) decrescente;
  2. si dividono in due sottoinsiemi (primi kk e restanti) con probabilità totali le più vicine possibile;
  3. si ripete la divisione in ciascun sottoinsieme, fino ad avere un solo simbolo per gruppo;
  4. a ogni ramo si associa 0 (gruppo di sinistra) o 1 (di destra); la parola di un simbolo è la sequenza di etichette dalla radice.

Esempio. A=0,35, B=0,22, C=0,20, D=0,13, E=0,10A=0{,}35,\ B=0{,}22,\ C=0{,}20,\ D=0{,}13,\ E=0{,}10.

Passo Gruppi
1 {A,B}\{A,B\} (0,57) e {C,D,E}\{C,D,E\} (0,43): differenza minima (0,14)
2 {A},{B}\{A\},\{B\} ; {C}\{C\} (0,20) e {D,E}\{D,E\} (0,23)
3 {D},{E}\{D\},\{E\}

Parole: A=00, B=01, C=10, D=110, E=111A=00,\ B=01,\ C=10,\ D=110,\ E=111. Lunghezza media Ly=2(0,35+0,22+0,20)+3(0,13+0,10)=1,54+0,69=2,23L_y=2(0{,}35+0{,}22+0{,}20)+3(0{,}13+0{,}10)=1{,}54+0{,}69=2{,}23 bit.

La divisione "quasi uguale" non sempre è unica e l'algoritmo non garantisce l'ottimo (lo fa se le probabilità sono potenze di 12\frac12).

Codifica di Huffman

Procedura bottom-updal basso verso l'alto: si parte dalle foglie (dal basso):

  1. si ordinano i simboli per probabilità decrescente;
  2. si raggruppano i due simboli con probabilità minima in un nuovo nodo, con probabilità la somma;
  3. si ripete (i nodi nuovi partecipano come simboli) finché resta un solo nodo (la radice);
  4. si etichettano i due rami uscenti da ogni nodo con 00 e 11 e si leggono le parole dalla radice alle foglie.

È ottimo: ha la minima LyL_y tra tutti i codici a prefisso e, per il teorema di Kraft-McMillan (ogni codice decodificabile ha lunghezze che ammettono anche un codice a prefisso), tra tutti i codici decodificabili.

Esempio (lo stesso di prima). Si uniscono D+ED+E (0,13+0,10=0,230{,}13+0{,}10=0{,}23), poi B+CB+C (0,22+0,20=0,420{,}22+0{,}20=0{,}42), poi A+(DE)A+(DE) (0,35+0,23=0,580{,}35+0{,}23=0{,}58), infine (BC)+(A DE)(BC)+(A\,DE) (11):

A 0,35 ─────────────────┐
D 0,13 ─┐               ├ 0,58 ─┐
E 0,10 ─┴ 0,23 ─────────┘       │
B 0,22 ─┐                       ├ 1
C 0,20 ─┴ 0,42 ─────────────────┘

Con 00 al ramo di sopra e 11 a quello di sotto in ogni unione una possibile scelta è A=10, B=00, C=01, D=110, E=111A=10,\ B=00,\ C=01,\ D=110,\ E=111 (lo scambio degli 0/1 dà un altro codice equivalente).

Lunghezza media. Due modi equivalenti:

  • Ly=∑P(b)L(b)=2(0,35+0,22+0,20)+3(0,13+0,10)=2,23L_y=\sum P(b)L(b)=2(0{,}35+0{,}22+0{,}20)+3(0{,}13+0{,}10)=2{,}23 bit;
  • scorciatoia: LyL_y è la somma delle probabilità dei nodi interni (le unioni): 0,23+0,42+0,58+1=2,230{,}23+0{,}42+0{,}58+1=2{,}23 (ogni foglia contribuisce con la sua probabilità tante volte quanti sono i nodi che attraversa verso la radice, cioè la sua lunghezza).

Efficienza e rate. H=2,19H=2{,}19 bit, quindi η=2,192,23=0,98\eta=\frac{2{,}19}{2{,}23}=0{,}98. Senza codifica servono ⌈log⁡25⌉=3\lceil\log_25\rceil=3 bit per simbolo (Lx=3L_x=3, η=0,73\eta=0{,}73): con Fs=100F_s=100 simboli/s il rate nominale scende da 300300 a 223223 bit/s, vicino al rate di informazione FsH=219F_sH=219 bit/s.

Il codice di Huffman non è unico (le scelte a parità di probabilità danno alberi diversi e le etichette 0/1 si possono scambiare), ma LyL_y è unica.

Esempio completo con otto simboli

Probabilità 0,25, 0,25, 0,25, 0,10, 0,05, 0,05, 0,04, 0,010{,}25,\ 0{,}25,\ 0{,}25,\ 0{,}10,\ 0{,}05,\ 0{,}05,\ 0{,}04,\ 0{,}01 (somma 1; l'ultima si ricava da 1−0,991-0{,}99), tema d'esame gennaio 2025 (Esercizio 2 · codice di Huffman a 8 livelli e verifica di Kraft-McMillan (tema d'esame gennaio 2025)). Unioni successive:

  1. 0,04+0,01=0,050{,}04+0{,}01=0{,}05 (nodo XX);
  2. una coppia tra i tre da 0,050{,}05 (per esempio 0,05+0,05=0,100{,}05+0{,}05=0{,}10, nodo YY);
  3. X (0,05)+0,10 (simbolo)=0,15X\,(0{,}05)+0{,}10\ (\text{simbolo})=0{,}15 (nodo ZZ);
  4. Y (0,10)+Z (0,15)=0,25Y\,(0{,}10)+Z\,(0{,}15)=0{,}25 (nodo WW);
  5. i quattro nodi/simboli da 0,250{,}25: due coppie (0,500{,}50 e 0,500{,}50), poi la radice.

Lunghezze: tre simboli da 0,250{,}25 a 22 bit; quelli da 0,100{,}10 e 0,05 (×2)0{,}05\,(\times2) a 44 bit; quelli da 0,040{,}04 e 0,010{,}01 a 55 bit. Somma dei nodi internii nodi ottenuti dalle fusioni, esclusi i simboli di partenza: 0,05+0,10+0,15+0,25+0,50+0,50+1=2,550{,}05+0{,}10+0{,}15+0{,}25+0{,}50+0{,}50+1=2{,}55 bit. Con H=2,517H=2{,}517 bit, η=0,987\eta=0{,}987 (a lunghezza fissa 3 bit: 0,840{,}84).

Codifica a lunghezza variabile e rate

Se FsF_s è la frequenza dei simboli del quantizzatore, con Huffman si ha rate nominale FsLyF_sL_y (bit/s) rispetto a Fslog⁡2LF_s\log_2L senza codifica. Un caso reale (quantizzatore a 8 livelli, probabilità 0,5,0,15,0,10,0,08,0,07,0,05,0,03,0,020{,}5,0{,}15,0{,}10,0{,}08,0{,}07,0{,}05,0{,}03,0{,}02, tema d'esame febbraio 2026): H=2,284H=2{,}284 bit, Huffman con lunghezze 1,3,3,4,4,4,5,51,3,3,4,4,4,5,5 ha Ly=2,30L_y=2{,}30 bit (η=0,993\eta=0{,}993); a Fs=8F_s=8 kHz il rate scende da 2424 a 18,418{,}4 kbit/s, quasi il rate di informazione 18,2718{,}27 kbit/s.

Errori comuni

  • Unire i due simboli più probabili invece dei due meno probabili.
  • Dimenticare di rimettere in ordine i nodi nuovi con quelli rimasti prima di scegliere i due minimi.
  • Calcolare LyL_y senza pesare con le probabilità, o con la lunghezza di una singola parola.
  • Pensare che il codice di Huffman sia unico, o che l'efficienzarapporto tra entropia e lunghezza media del codice possa superare 1.
  • Confondere la lunghezza media (per parola) con il rate (per secondo): servono FsF_s e il bit-rate.

Versione ripasso

Esercizi su questo argomento

Teoria collegata