Esercizio - sorgente a sette simboli e codici di Shannon, Shannon-Fano e Huffman
Questa pagina non ha ancora la versione ripasso: qui sotto c'è il testo completo.
In questa pagina 5
Testo. Una sorgente senza memoria emette simboli presi da {A,B,C,D,E,F,G}. È noto che, in media, ogni 100 simboli 40 sono A, 16 sono B, 15 sono C, 10 sono D, 8 sono E, 6 sono F e 5 sono G. Si calcoli l'entropia della sorgente. Che cosa dice il teorema di Shannon? Quale lunghezza media si ottiene con la codifica di Shannon? E con Shannon-Fano? E con Huffman? Si può migliorare l'efficienza dell'ultimo risultato?
Le probabilità sono 0,40;0,16;0,15;0,10;0,08;0,06;0,05 (somma 1). L'informazione di ciascun simbolo log2p1 è: 1,322;2,644;2,737;3,322;3,644;4,059;4,322 bit. Quindi
H=0,4⋅1,322+0,16⋅2,644+0,15⋅2,737+0,1⋅3,322+0,08⋅3,644+0,06⋅4,059+0,05⋅4,322=2,4457bit.
Il massimo possibile con M=7 è log27=2,807 bit; la sorgente non è equiprobabile e si può comprimere. Con una codifica a lunghezza fissa servono ⌈log27⌉=3 bit per simbolo (η=32,4457=0,815). Per il teorema di Shannon, per un codice binario (My=2):
2,4457≤L~<3,4457.
Codifica di Shannon
Lunghezze li=⌈log2pi1⌉: A2; B3; C3; D4; E4; F5; G5 (infatti 1,32→2, 2,64→3, 2,74→3, 3,32→4, 3,64→4, 4,06→5, 4,32→5). Kraft: 41+2⋅81+2⋅161+2⋅321=1611=0,6875≤1: un codice a prefisso esiste. Si costruisce scendendo sull'albero un livello alla volta, assegnando a ogni simbolo il primo nodo libero che non sia discendente di una parola già scelta; una possibile scelta è A=00, B=010, C=011, D=1000, E=1001, F=10100, G=10101 (un'altra: A=00, B=100, C=101, D=1100, E=1101, F=11100, G=11101). La lunghezza media non dipende dalla scelta:
L~=0,4⋅2+(0,16+0,15)⋅3+(0,10+0,08)⋅4+(0,06+0,05)⋅5=0,8+0,93+0,72+0,55=3,00bit,η=3,002,4457=0,815.
Rispetta i limiti, ma non migliora la codifica a lunghezza fissa (3 bit): la codifica di Shannon è subottima.
Codifica di Shannon-Fano
Ordine già decrescente. Primo taglio:{A,B} (0,56) contro {C,D,E,F,G} (0,44): differenza 0,12 (l'alternativa {A} contro il resto darebbe 0,40 contro 0,60, differenza 0,20). Secondo:{A},{B}; e {C,D} (0,25) contro {E,F,G} (0,19), differenza 0,06 (meglio di {C} contro il resto: 0,15 e 0,29). Terzo:{C},{D}; {E} (0,08) contro {F,G} (0,11). Quarto:{F},{G}. Con 0 a sinistra e 1 a destra:
A=00,B=01,C=100,D=101,E=110,F=1110,G=1111.L~=0,4⋅2+0,16⋅2+(0,15+0,10+0,08)⋅3+(0,06+0,05)⋅4=0,8+0,32+0,99+0,44=2,55bit,η=2,552,4457=0,959.
Una possibile assegnazione è A=0, B=110, C=100, D=1110, E=1111, F=1010, G=1011 (lunghezze 1,3,3,4,4,4,4). Lunghezza media come somma dei nodi interni: 0,11+0,18+0,26+0,34+0,60+1=2,49 bit; e pesando: 0,4⋅1+(0,16+0,15)⋅3+(0,10+0,08+0,06+0,05)⋅4=0,4+0,93+1,16=2,49 ✓. Efficienza η=2,492,4457=0,982. È il codice ottimo tra quelli con parole di lunghezza intera per singolo simbolo.
codice
L~ (bit)
η
lunghezza fissa
3,00
0,815
Shannon
3,00
0,815
Shannon-Fano
2,55
0,959
Huffman
2,49
0,982
(Nota: il libro di testo a volte chiama "Shannon" quello che è Shannon-Fano, e viceversa: conviene fare riferimento alle procedure.)
Si può migliorare l'efficienza?
Sì, raggruppando i simboli: si applica Huffman a parole di N simboli, di probabilità pipj (sorgente senza memoria). La lunghezza per simbolo NL~ soddisfa H≤NL~<H+N1:
Il prezzo è un dizionario che cresce come 7N e un ritardo di codifica (si aspetta di avere N simboli). In alternativa si può usare la codifica aritmetica, che si avvicina a H senza costruire il dizionario.