![]()
|
GUIDA AGLI ALGORITMI
|
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Gli algoritmi LZ77 e LZSS La compressione è uno degli argomenti più avanzati nel campo del rom hacking. Io stesso per ora non ne ho mai avuto a che fare, ma mi sono un pò documentato sulla rete. In particolare, ho trovato un paio di documenti abbastanza ben fatti su quelli che sono gli algoritmi più usati al giorno d'oggi. Basti pensare che l'algoritmo LZSS è alla base della compressione ZIP. Questo documento non è quindi frutto di mie scoperte o invenzioni, ma una traduzione. In futuro cercherò di ampliare la guida con alcuni esempi pratici, focalizzando l'attenzione su un gioco psx del quale mi sono recentemente interessato... Termini usati negli algoritmi
1.1 LZ77: Il principio di codifica L'algoritmo cerca nella finestra il match più lungo con l'inizio del lookahead buffer e ritorna un puntatore a quel match. Poichè è possibile che neanche un match di un carattere venga trovato, l'output potrebbe contenere soltanto puntatori. LZ77 risolve il problema in questo modo: dopo ogni puntatore ritornato, ritorna anche il primo carattere nel lookahead buffer dopo il match. Se non ci sono match, ritorna un puntatore nullo e il carattere alla posizione di codifica. 1.2 LZ77: L'algoritmo di codifica
1.3 LZ77: Un esempio Il processo di codifica è presentato nella Tabella 1.
1.4 LZ77: Decodifica La finestra è mantenuta allo stesso modo della codifica. In ogni passo l'algoritmo legge una coppia (P,C) dall'input. In output ritorna la sequenza della finestra specificata da P e il carattere C. 1.5 LZ77: Caratteristiche pratiche Il rapporto di compressione ottenuto con questo metodo è molto buono per molti tipi di dati, ma il processo di codifica può essere abbastanza dispendioso per quanto riguarda il tempo, poichè sono molti i confronti tra il lookahead buffer e la finestra. D'altro canto, la decodifica è molto semplice e veloce. Le richieste di memoria sono basse sia per la codifica che per la decodifica. L'unica struttura dati tenuta in memoria è la finestra, che in genere ha dimensioni tra 4 e 64 kilobytes. 2.1 LZSS: Differenze con LZ77 L'algoritmo LZ77 risolve il caso di non-match nella finestra ritornando un carattere esplicito dopo ogni puntatore. Questa soluzione contiene ridondanze: è ridondante il puntatore nullo, o il carattere extra che potrebbe essere incluso nel prossimo match. L'algoritmo LZSS risolve il problema in maniera più efficiente: il puntatore è ritornato soltanto se punta ad un match più lungo del puntatore stesso; altrimenti, vengono ritornati caratteri espliciti. Dato che ora l'output contiene un miscuglio di puntatori e caratteri, ognuno di essi deve avere un bit identificatore in più che permette di distinguerli. 2.2 LZSS: L'algoritmo di codifica
2.3 LZSS: Un esempio Il processo di codifica è presentato nella Tabella 2.
2.4 LZSS: Decodifica La finestra scorre sullo stream di output allo stesso modo in cui scorre sullo stream di input. I caratteri espliciti sono ritornati direttamente, e, quando viene incontrato un puntatore, viene ritornata la stringa della finestra che esso punta. 2.5 LZSS: Confronto di prestazioni con LZ77 Con questo algoritmo generalmente si ottiene un maggior rapporto di compressione di quanto si ottenga con LZ77, avendo praticamente gli stessi requisiti di processore e memoria. La decodifica è ancora estremamente semplice e veloce. Questo è il motivo per cui LZSS è diventato la base di quasi tutti gli algoritmi di questo tipo più recenti. 2.6 LZSS: Implementazioni Praticamente è implementato in quasi tutti gli archiviatori più popolari: PKZip, ARJ, LHArc, ZOO, ecc. (al tempo in cui è stato scritto questo documento, questi erano i compressori più popolari...). Naturalmente ciascun archiviatore implementa l'algoritmo con alcune differenze, che vanno dalla lunghezza del puntatore, alle dimensioni della finestra, e così via. Bene, questo conclude la guida. Spero di modificarne il titolo chiamandola "Gli algoritmi LZ77 e LZSS applicati al romhacking" in futuro... Dark Schneider 2003
|