1 Introduzione

LZ78 costituisce la tecnica fondamentale che sta alla base di un insieme di algoritmi di compressione di Lempel e Ziv. In LZ77 il dizionario è definito da una finestra di testo di dimensione pressata. Durante la codifica, la finestra scorre sul testo da comprimere. Quindi, la possibilità di trovare un match nel dizionario per la stringa corrente è legata ai dati contenuti nella window in quel momento. Infatti, se la stringa da codificare era già stata incontrata molto tempo prima, il codificatore non ha alcuna memoria di questo fatto in quanto la stringa in questione non è più nella window, cioè è uscita dal dizionario. In LZ77, inoltre, la lunghezza massima di un match che è possibile determinare è limitata dalla dimensione del buffer look-ahead. Sembrerebbe, allora, naturale risolvere i problemi sopra mensionati accrescendo la taglia e della sliding window e del buffer look-ahead. Tuttavia, questa soluzione non porta necessariamente a dei miglioramenti. Aumentando la dimensione della window, ad esempio, necessitiamo di un numero maggiore di bit per rappresentare un riferimento ad un match nella window. Per match corti, in particolare, potremmo avere una codifica più lunga del match stesso. Ma, il vero svantaggio proviene dall'aumento della taglia del buffer. Poiché le operazioni di confronto di stringhe tra il buffer look-ahead e le stringhe nella window procedono in maniera sequenziale, il run-time cresce in maniera direttamente proporzionale alla lunghezza del buffer.

LZ78 abbandona il concetto di sliding window e usa un differente approccio nel costruire e gestire il dizionario. Costruisce il dizionario inserendo, di volta in volta, stringhe composte da: una sottostringa, che individua un match nel dizionario, seguita da un carattere che rompe il match. In questo modo, non c’è alcuna restrizione su quanto indietro può essere cercato un match ( back-reference ), cioè non c’è un limite prestabilito alla dimensione del dizionario. Ciò incrementa la possibilità di trovare un match. In più il dizionario ha una caratteristica: se una stringa è memorizzata nel dizionario, allora lo è anche un suo prefisso. Usando questo approccio, la lunghezza possibile di un match non è limitata dalla dimensione di un buffer come in LZ77. Inoltre, il codificatore non ha necessità di mandare esplicitamente il dizionario al decodificatore. Quest’ultimo, infatti, è in grado di ricostruirlo automaticamente. Vedremo come.