Decodificatore LZW L`algoritmo di decodifica è semplice e
Transcript
Decodificatore LZW L`algoritmo di decodifica è semplice e
ICT per Sistemi Gestionali Decodificatore LZW L’algoritmo di decodifica è semplice e computazionalmente meno oneroso rispetto a quello di codifica. A differenza di altre tecniche (ad es. Huffman), non è necessario fornire preventivamente al decodificatore nessun dizionario (codebook), in quanto quest’ultimo viene costruito "al volo" via via che giungono le parole di codice, seguendo una procedura uguale a quella del codificatore. Unico vincolo è che codificatore e decodificatore adottino lo stesso dizionario iniziale, in genere costituito dai 256 caratteri del codice ASCII. int LZW_decode() { string entry, preventry; char ch; int prevcode, currcode; ... inizializzo_il_dizionario(); } prevcode = leggo parola di codice; decodifico e stampo prevcode; while (ci sono parole di codice da leggere) { currcode = leggo parola di codice; entry = stringa di simboli associata a currcode nel dizionario; stampo entry; ch = primo carattere di entry; preventry = stringa di simboli associata a prevcode nel dizionario; aggiungo (preventry + ch) al dizionario; prevcode = currcode; } ICT per Sistemi Gestionali Esempio Con riferimento all’esempio precedente, la procedura di decodifica opera come illustrato di seguito. Tabella relativa al codificatore Simboli in ingresso b ba ban bana banan Stringa corrente Già visto prima b ba an na an si no no no si Uscita codificata 1 1,0 1,0,3 Tabella relativa al decodificatore Parole di codice in ingresso 1 1,0 1,0,3 1,0,3,6 1,0,3,6, 0 1,0,3,6, 0, 4 Stringa corrente Stringa prec. b a n an a _ b a n an a Uscita decodificata b ba ban banan banana banana_ Nuova voce nel dizionario / parola di codice relativa ba / 5 an / 6 na / 7 - Nuova voce nel dizionario / parola di codice relativa ba / 5 an / 6 na / 7 ana / 8 a_ / 9 Ovviamente, il dizionario del decodificatore è stato inizializzato come quello del codificatore, usando la prima tabella dell’esempio precedente. ICT per Sistemi Gestionali Sindrome dell’algoritmo LZW Va innanzitutto notato come il decodificatore lavori, relativamente alla costruzione del dizionario, in "ritardo" di un passo rispetto al codificatore. L’algoritmo di decodifica presenta un’unica eccezione in cui la procedura fallisce. Il caso si verifica quando il decodificatore riceve una parola di codice non ancora definita nel dizionario. Più in dettaglio, il problema insorge solo se una stringa inizia e termina con lo stesso carattere, ovvero se assume la forma <carattere><stringa><carattere> Per superare la sindrome, è quindi sufficiente concatenare l’ultima stringa decodificata con il suo primo carattere. Lo pseudo-codice del decodificatore va perciò un po’ modificato, così da poter gestire l’unico caso di sindrome che l’algoritmo presenta. Si può dimostrare che se la sorgente S è stazionaria ed ergodica, all’aumentare della lunghezza n della sequenza, il numero di bit necessari per rappresentare la sequenza compressa tende a n H(S). ICT per Sistemi Gestionali Esempio Facendo riferimento al dizionario degli esempi precedenti, si supponga di voler codificare bananana_...... Tabella relativa al codificatore Simboli in ingresso b ba ban bana banan banana bananan bananana bananana_ Stringa corrente b ba an na an ana an ana ana_ Già visto prima si no no no si no si si no Uscita codificata 1 1,0 1,0,3 1,0,3,6 1,0,3,6,8 Tabella relativa al decodificatore Parole di codice in ingresso 1 1,0 1,0,3 1,0,3,6 1,0,3,6, 8 Stringa corrente Stringa prec. b a n an ??? b a n an Uscita decodificata b ba ban banan banan??? Voce diz. / parola di codice relativa ba / 5 an / 6 na / 7 ana / 8 ana_ Nuova voce nel dizionario / parola di codice relativa ba / 5 an / 6 na / 7 Si verifica la sindrome quando si è chiamati a decodificare la parola di codice 8, che non è ancora stata definita nel dizionario. Si noti come la parola da inserire sia la stringa associata alla parola di codice 7 concatenata con il primo carattere di tale stringa, cioè an + a. ICT per Sistemi Gestionali Decodificatore LZW modificato in grado di gestire la sindrome int LZW_decode() { string entry, preventry; char ch; int prevcode, currcode; ... inizializzo_il_dizionario(); prevcode = leggo parola di codice; decodifico e stampo prevcode; while (ci sono parole di codice da leggere) { currcode = leggo parola di codice; /* Qui la porzione di codice per gestire la sindrome */ if(currcode è definito) entry = stringa di simboli associata a currcode nel dizionario; else entry = preventry + ch; /* Fine della porzione di codice per gestire la sindrome */ } } stampo entry; ch = primo carattere di entry; preventry = stringa di simboli associata a prevcode nel dizionario; aggiungo (preventry + ch) al dizionario; prevcode = currcode;