Salta al contenuto
Note per Studenti Esercizio - Entropia, codici di Huffman e Exp-Golomb (domande ed esercizi del corso)

Esercizio - Entropia, codici di Huffman e Exp-Golomb (domande ed esercizi del corso)

In questa pagina 4

Teoria: Codifica lossless - entropia, Huffman e codifiche a dizionarioLa codifica lossless rappresenta i simboli di una sorgente con parole di codice a lunghezza variabile in modo invertibile; si usano codici a prefisso (istantanei). L'entropia $H(X)=\sum p_i\log_2\frac1{p_i}$ è il limite: $H(X)\le\mathcal L^*<H(X)+1$ (Shannon), con uguaglianza se le probabilità sono potenze di 1/2. Il codice di Huffman è ottimo ma lascia fino a 1 bit di overhead per simbolo; raggruppando $K$ simboli (codifica a blocchi) si tende al tasso entropico $\mathcal H(X)\le H(X)$, ma la complessità cresce come $M^K$; la codifica aritmetica ($\mathcal L<H+2$ per messaggio) ha complessità lineare. Altre tecniche: dizionario (LZ, DEFLATE di ZIP e PNG, ANS in Zstandard), Exp-Golomb e categoria/ampiezza (usati in JPEG e nei codec video) per interi con probabilità decrescente col modulo, codifica predittiva (si codifica l'errore di predizione, che ha entropia molto più bassa).Codifica lossless - entropia, Huffman e codifiche a dizionario → (entropia, teorema di Shannon, algoritmo di Huffman, codifica a blocchi, Exp-Golomb). Fonte: domande a risposta multipla ed esempi di preparazione del corso di Reti di Calcolatori, Ing. Informatica UniPD 2025-26, e slide del corso. Tutti i conti sono verificati in Python.

Formule di riferimento: H(X)=∑pilog⁡21piH(X)=\sum p_i\log_2\frac1{p_i}; lunghezza media L=∑piℓi\mathcal L=\sum p_i\ell_i; teorema di Shannon H≤L∗<H+1H\le\mathcal L^*<H+1 (uguaglianza solo per probabilità potenze di 12\frac12).

1. Entropia

Domanda 1. Una sorgente emette AA con probabilità 0,50{,}5 e BB con probabilità 0,50{,}5. Entropia? (a) 1 bit, (b) 0,5 bit, (c) 2 bit, (d) 0 bit.

H=0,5log⁡22+0,5log⁡22=0,5⋅1+0,5⋅1=1H=0{,}5\log_22+0{,}5\log_22=0{,}5\cdot1+0{,}5\cdot1=1 bit: (a). (b) è la probabilità, non l'entropia; (c) sarebbe l'entropia di 4 simboli equiprobabili (log⁡24\log_24); (d) è l'entropia di una sorgente deterministica (un simbolo con probabilità 1). Per due simboli equiprobabili si ha il massimo possibile, log⁡2M=1\log_2M=1.

Domanda 2. Quale affermazione è vera? (a) la lunghezza media del codice è sempre ≥\ge all'entropia, (b) sempre ≤\le, (c) sempre uguale, (d) sempre intera.

(a): per il teorema di Shannon L≥H\mathcal L\ge H. (b) è falsa (si violerebbe il teorema: nessun codice decodificabile può scendere sotto l'entropia); (c) vale solo per probabilità diadiche; (d) falsa: L\mathcal L è una media pesata di interi e in generale non è intera (1,75 nell'esempio 12,14,18,18\frac12,\frac14,\frac18,\frac18).

Domanda 3 (teorica). Il minimo tasso di codifica senza perdite per un codice a prefisso (a) è maggiore o uguale all'entropia della sorgente, (b) minore o uguale, (c) è sempre un numero intero di bit. (a): è l'enunciato del teorema di Shannon sulla codifica di sorgente (per il codice ottimo, inoltre L∗<H+1\mathcal L^*<H+1).

2. Codici di Huffman

Domanda 4 (sorgente a 4 simboli). A:0,4, B:0,3, C:0,2, D:0,1A:0{,}4,\ B:0{,}3,\ C:0{,}2,\ D:0{,}1. Quale affermazione è corretta? (a) H≈1,85H\approx1{,}85 bit e L≈2\mathcal L\approx2 (Huffman), (b) H≈1,85H\approx1{,}85 bit e L≈1,5\mathcal L\approx1{,}5 (Huffman), (c) H≈2,5H\approx2{,}5 bit, (d) il codice ottimo non esiste.

  • Entropia: 0,4log⁡210,4+0,3log⁡210,3+0,2log⁡210,2+0,1log⁡210,1=0,4⋅1,322+0,3⋅1,737+0,2⋅2,322+0,1⋅3,322=1,8460{,}4\log_2\frac1{0{,}4}+0{,}3\log_2\frac1{0{,}3}+0{,}2\log_2\frac1{0{,}2}+0{,}1\log_2\frac1{0{,}1}=0{,}4\cdot1{,}322+0{,}3\cdot1{,}737+0{,}2\cdot2{,}322+0{,}1\cdot3{,}322=1{,}846 bit.
  • Huffman: si fondono i due meno probabili, D+C=0,3D+C=0{,}3; ora i nodi sono A:0,4A:0{,}4, B:0,3B:0{,}3, (CD):0,3(CD):0{,}3; si fondono BB e (CD)(CD): 0,60{,}6; infine A+0,6=1A+0{,}6=1. Lunghezze: A:1A:1, B:2B:2, C:3C:3, D:3D:3; L=0,4⋅1+0,3⋅2+0,2⋅3+0,1⋅3=1,9\mathcal L=0{,}4\cdot1+0{,}3\cdot2+0{,}2\cdot3+0{,}1\cdot3=1{,}9 bit, cioè ≈2\approx2.
  • (a) è giusta. (b) è impossibile: L=1,5<H=1,85\mathcal L=1{,}5<H=1{,}85 violerebbe Shannon (la risposta si può scartare senza fare conti). (c) l'entropia di 4 simboli non può superare log⁡24=2\log_24=2. (d) il codice ottimo esiste sempre ed è dato dall'algoritmo di Huffman.

Domanda 5 (sorgente a 6 simboli: limite inferiore). Probabilità A:0,5, B:0,15, C:0,10, D:0,20, E:0,04, F:0,01A:0{,}5,\ B:0{,}15,\ C:0{,}10,\ D:0{,}20,\ E:0{,}04,\ F:0{,}01. Quale affermazione è esatta? (a) la lunghezza media di un codice senza perdite non può essere inferiore a 1,959 bit, (b) il codice ottimo per questa distribuzione non può essere determinato, (c) il codice ottimo ammette due codeword di lunghezza un bit.

Entropia: 0,5⋅1+0,15⋅2,737+0,10⋅3,322+0,20⋅2,322+0,04⋅4,644+0,01⋅6,644≈1,95930{,}5\cdot1+0{,}15\cdot2{,}737+0{,}10\cdot3{,}322+0{,}20\cdot2{,}322+0{,}04\cdot4{,}644+0{,}01\cdot6{,}644\approx1{,}9593 bit. (a) vera: nessun codice istantaneo può scendere sotto HH. (b) falsa: il codice ottimo si determina con Huffman. (c) falsa: due codeword da 1 bit (00 e 11) esauriscono tutto lo spazio dei prefissi, e con più di due simboli non resterebbe nessuna parola disponibile per gli altri.

Domanda 6 (stessa sorgente: lunghezza media di Huffman). (a) 2 bit/simbolo, (b) 1,959 bit/simbolo, (c) non determinabile, (d) 3 bit/simbolo.

Costruzione: i due meno probabili sono F:0,01F:0{,}01 ed E:0,04E:0{,}04, →0,05\to0{,}05. Poi i due meno probabili sono 0,050{,}05 e C:0,10C:0{,}10, →0,15\to0{,}15. Poi B:0,15B:0{,}15 e il nodo 0,150{,}15, →0,30\to0{,}30 (a pari probabilità se ne sceglie uno qualunque: la lunghezza media non cambia). Poi D:0,20D:0{,}20 e 0,300{,}30, →0,50\to0{,}50. Infine A:0,5A:0{,}5 e 0,50→10{,}50\to1.

Simbolo AA DD BB CC EE FF
Codice 0 10 110 1110 11110 11111
Lunghezza 1 2 3 4 5 5

L=1⋅0,5+2⋅0,20+3⋅0,15+4⋅0,10+5⋅(0,04+0,01)=0,5+0,4+0,45+0,4+0,25=2,0\mathcal L=1\cdot0{,}5+2\cdot0{,}20+3\cdot0{,}15+4\cdot0{,}10+5\cdot(0{,}04+0{,}01)=0{,}5+0{,}4+0{,}45+0{,}4+0{,}25=2{,}0 bit: (a). (b) 1,959 è l'entropia: L=H\mathcal L=H solo per probabilità diadiche, qui non lo sono, quindi L>H\mathcal L>H. (c) falsa. (d) 3 bit è la lunghezza del codice a lunghezza fissa per 6 simboli (⌈log⁡26⌉\lceil\log_26\rceil): Huffman fa meglio (2,0).

Domanda 7 (altra sorgente a 6 simboli). A:0,07, B:0,25, C:0,11, D:0,12, E:0,31, F:0,14A:0{,}07,\ B:0{,}25,\ C:0{,}11,\ D:0{,}12,\ E:0{,}31,\ F:0{,}14. (a) un codice ottimo ha lunghezza media 2,44 bit, (b) 2,61 bit, (c) la lunghezza media di un codice a prefisso può essere inferiore a 2,40 bit, (d) il codice ottimo non può essere determinato.

Entropia: H=2,4068H=2{,}4068 bit. Huffman: A+C=0,18A+C=0{,}18; D+F=0,26D+F=0{,}26; B+0,18=0,43B+0{,}18=0{,}43; E+0,26=0,57E+0{,}26=0{,}57; 0,43+0,57=10{,}43+0{,}57=1. Lunghezze: E,BE,B a 2 bit; A,C,D,FA,C,D,F a 3 bit. Un codice possibile: A=111, B=10, C=110, D=011, E=00, F=010A=111,\ B=10,\ C=110,\ D=011,\ E=00,\ F=010. L=2(0,31+0,25)+3(0,07+0,11+0,12+0,14)=1,12+1,32=2,44\mathcal L=2(0{,}31+0{,}25)+3(0{,}07+0{,}11+0{,}12+0{,}14)=1{,}12+1{,}32=2{,}44 bit: (a). (c) falsa perché L≥H=2,4068>2,40\mathcal L\ge H=2{,}4068>2{,}40. (b) è troppo alta per un codice ottimo (sarebbe oltre il minimo); (d) falsa.

3. Decodifica, blocchi ed Exp-Golomb

Decodifica di Huffman (slide). Con il codice A=0A=0, B=10B=10, C=110C=110, D=111D=111 (probabilità 12,14,18,18\frac12,\frac14,\frac18,\frac18, L=1,75=H\mathcal L=1{,}75=H) decodificare 0010110111101000101101111010. Si legge un bit alla volta: 0→A0\to A; 0→A0\to A; 1,0→B1,0\to B; 1,1,0→C1,1,0\to C; 1,1,1→D1,1,1\to D; 1,0→B1,0\to B; 1,0→B1,0\to B. Risultato: AABCDBBAABCDBB.

Codifica a blocchi (slide). Sorgente a1:0,8a_1:0{,}8, a2:0,02a_2:0{,}02, a3:0,18a_3:0{,}18. H=0,8157H=0{,}8157. Huffman sui singoli simboli: a1=0a_1=0, a3=10a_3=10, a2=11a_2=11; L=0,8+2⋅0,18+2⋅0,02=1,2\mathcal L=0{,}8+2\cdot0{,}18+2\cdot0{,}02=1{,}2 bit/simbolo, 0,3840{,}384 sopra l'entropia. Sulle 9 coppie: L=1,723\mathcal L=1{,}723 bit per coppia =0,8614=0{,}8614 bit/simbolo, solo 0,0460{,}046 sopra l'entropia. Il codice a blocchi (grande alfabeto: 32=93^2=9 simboli) ha quasi eliminato l'overhead di un bit per simbolo.

Exp-Golomb (slide): codificare 8.

  • uEG: n+1=9=10012n+1=9=1001_2 (4 bit), quindi 33 zeri iniziali: cU(8)=0001001c_U(8)=0001001.
  • sEG: m(8)=2⋅8−1=15m(8)=2\cdot8-1=15; 15+1=16=10000215+1=16=10000_2 (5 bit), 4 zeri: cS(8)=000010000c_S(8)=000010000.
  • Categoria/ampiezza: categoria k=⌈log⁡29⌉=4k=\lceil\log_29\rceil=4, codice della categoria 4: 101101; ampiezza: 8=100028=1000_2 su 4 bit; cCA(8)=1011000c_{CA}(8)=1011000. Lunghezze: 7, 9, 7 bit. Per un numero grande come 8 la codifica per categoria e ampiezza è la più corta.

Decodifica di Exp-Golomb (costruito). Decodificare il flusso unsigned 0001001 1 001100001001\ 1\ 00110. Si contano gli zeri iniziali, zz, poi si leggono z+1z+1 bit che rappresentano n+1n+1: 000 ∣ 1001000\,|\,1001: z=3z=3, 10012=91001_2=9, n=8n=8. Poi 11: nessuno zero, n+1=1n+1=1, n=0n=0. Poi 00 ∣ 11000\,|\,110: z=2z=2, 1102=6110_2=6, n=5n=5. Risultato: 8, 0, 58,\,0,\,5 (verificato: cU(5)=00110c_U(5)=00110).

Distribuzione diadica (costruito). A:12, B:14, C:18, D:116, E:116A:\frac12,\ B:\frac14,\ C:\frac18,\ D:\frac1{16},\ E:\frac1{16}. H=12⋅1+14⋅2+18⋅3+116⋅4⋅2=1,875H=\frac12\cdot1+\frac14\cdot2+\frac18\cdot3+\frac1{16}\cdot4\cdot2=1{,}875 bit. Huffman: lunghezze 1,2,3,4,41,2,3,4,4, L=0,5+0,5+0,375+0,5=1,875\mathcal L=0{,}5+0{,}5+0{,}375+0{,}5=1{,}875: L=H\mathcal L=H perché tutte le probabilità sono potenze di 12\frac12, e il codice assegna a ogni simbolo ℓi=log⁡21pi\ell_i=\log_2\frac1{p_i}.

Errori tipici

  • Dimenticare di sommare tutte le codeword nella lunghezza media (e di pesarle con le probabilità, non con 1).
  • Credere che L<H\mathcal L<H sia possibile: è la prima opzione da scartare nelle domande.
  • Fondere a ogni passo i nodi sbagliati: si fondono sempre i due con probabilità minima (inclusi i nodi già fusi).
  • Prendere come lunghezza del codice a lunghezza fissa log⁡2M\log_2M senza arrotondare (6 simboli: 3 bit, non 2,58).
  • Scrivere nn invece di n+1n+1 nella scrittura binaria di uEG (si conta n+1n+1).

Versione ripasso

Formule. H=∑pilog⁡21piH=\sum p_i\log_2\frac1{p_i}, L=∑piℓi\mathcal L=\sum p_i\ell_i, H≤L∗<H+1H\le\mathcal L^*<H+1 (uguaglianza solo per probabilità potenze di 12\frac12). Huffman: fondere i due nodi a probabilità minima finché ne resta uno; il codice è a prefisso e ottimo; lunghezze indipendenti dalle scelte a parità.

Domande.

  • A,BA,B equiprobabili: H=1H=1 bit. L≥H\mathcal L\ge H sempre (non ≤\le, non sempre uguale, non intera).
  • 0,4;0,3;0,2;0,10{,}4;0{,}3;0{,}2;0{,}1: H=1,846H=1{,}846; Huffman D+C=0,3D+C=0{,}3, B+0,3=0,6B+0{,}3=0{,}6, A+0,6A+0{,}6; lunghezze 1,2,3,31,2,3,3, L=1,9≈2\mathcal L=1{,}9\approx2 (L = 1,5 impossibile perché minore di HH).
  • 0,5;0,15;0,10;0,20;0,04;0,010{,}5;0{,}15;0{,}10;0{,}20;0{,}04;0{,}01: H=1,9593H=1{,}9593 (limite inferiore); Huffman F+E=0,05F+E=0{,}05, +C=0,15+C=0{,}15, +B=0,30+B=0{,}30, +D=0,50+D=0{,}50, +A+A; codice A=0,D=10,B=110,C=1110,E=11110,F=11111A=0,D=10,B=110,C=1110,E=11110,F=11111, L=2,0>H\mathcal L=2{,}0>H (non diadica). Due codeword da 1 bit sono impossibili con più di due simboli. Codice a lunghezza fissa: 3 bit.
  • 0,07;0,25;0,11;0,12;0,31;0,140{,}07;0{,}25;0{,}11;0{,}12;0{,}31;0{,}14: H=2,4068H=2{,}4068, A+C=0,18A+C=0{,}18, D+F=0,26D+F=0{,}26, B+0,18=0,43B+0{,}18=0{,}43, E+0,26=0,57E+0{,}26=0{,}57; lunghezze E,BE,B: 2; A,C,D,FA,C,D,F: 3; L=2,44\mathcal L=2{,}44; non si può scendere sotto 2,402{,}40.

Decodifica. A=0,B=10,C=110,D=111A=0,B=10,C=110,D=111: 00101101111010→AABCDBB00101101111010\to AABCDBB (buffer di bit finché è una codeword).

Blocchi. 0,8;0,02;0,180{,}8;0{,}02;0{,}18: H=0,8157H=0{,}8157, singoli L=1,2\mathcal L=1{,}2 (+0,384+0{,}384), coppie 1,7231{,}723 bit/coppia =0,8614=0{,}8614 bit/simbolo (+0,046+0{,}046).

Exp-Golomb di 8. uEG: n+1=10012n+1=1001_2, 3 zeri: 00010010001001. sEG: m=15m=15, 15+1=10000215+1=10000_2: 000010000000010000. Categoria/ampiezza: k=4k=4 (codice 101101), 10001000: 10110001011000. Decodifica 0001001 1 001100001001\,1\,00110: z=3→n=8z=3\to n=8; 1→01\to0; z=2z=2, 1102=6→5110_2=6\to5.

Diadica. 12,14,18,116,116\frac12,\frac14,\frac18,\frac1{16},\frac1{16}: H=L=1,875H=\mathcal L=1{,}875 (lunghezze 1,2,3,4,4=log⁡21pi1,2,3,4,4=\log_2\frac1{p_i}).

Errori tipici: L<H\mathcal L<H; fondere i nodi sbagliati; non pesare le lunghezze con le probabilità; log⁡2M\log_2M non arrotondato per il codice a lunghezza fissa; nn invece di n+1n+1 in uEG.

Teoria: Codifica lossless - entropia, Huffman e codifiche a dizionarioLa codifica lossless rappresenta i simboli di una sorgente con parole di codice a lunghezza variabile in modo invertibile; si usano codici a prefisso (istantanei). L'entropia $H(X)=\sum p_i\log_2\frac1{p_i}$ è il limite: $H(X)\le\mathcal L^*<H(X)+1$ (Shannon), con uguaglianza se le probabilità sono potenze di 1/2. Il codice di Huffman è ottimo ma lascia fino a 1 bit di overhead per simbolo; raggruppando $K$ simboli (codifica a blocchi) si tende al tasso entropico $\mathcal H(X)\le H(X)$, ma la complessità cresce come $M^K$; la codifica aritmetica ($\mathcal L<H+2$ per messaggio) ha complessità lineare. Altre tecniche: dizionario (LZ, DEFLATE di ZIP e PNG, ANS in Zstandard), Exp-Golomb e categoria/ampiezza (usati in JPEG e nei codec video) per interi con probabilità decrescente col modulo, codifica predittiva (si codifica l'errore di predizione, che ha entropia molto più bassa).Codifica lossless - entropia, Huffman e codifiche a dizionario →.

Teoria collegata