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;