Gianluca Costante & Alessio Scannapieco LZSS + SHANNON FANO Gianluca Costante & Alessio Scannapieco
Introduzione Analisi iniziale Comprensione algoritmi Implementazione Suddivisione compiti Comprensione algoritmi Implementazione LZSS Shannon Fano Analisi finale Esecuzione test Ottimizzazione
Analisi Iniziale Suddivisione dei compiti LZSS: Gianluca Costante Shannon Fano: Alessio Scannapieco L’ouput di LZSS sarà utilizzato da Shannon Fano come input, in modo da sfruttare la ripetizione delle terne
LZSS – Intro Lempel-Ziv-Storer-Szymanski PCZip, ARJ, LHArc, ZOO Miglioramento LZ77 no-match: 0 CHAR match: 1 (length, offset)
LZSS –Codifica Imposta la posizione di codifica all’inizio dello stream di input Leggi una quantità MAX_MATCH di caratteri Trova il match più lungo nella finestra con il lookahead buffer: P := puntatore al match L := lunghezza del match È L >= LUNGHEZZA_MINIMA SI: ritorna P e muovi la posizione di codifica L caratteri avanti NO: ritorna il primo carattere del lookahead buffer e muovi la posizione di codifica di un carattere avanti Se ci sono ancora caratteri nello stream di input, torna al passo 2
LZSS - Esempio POS 1 2 3 4 5 6 7 8 9 10 11 CAR A B C PASSO POS MATCH OUTPUT 1 - - A 2 3 B 4 5 C 6 B B (3. 2) 7 8 A A B (7, 3) 11 LUNGHEZZA_MINIMA = 2
Implementazione - LZSS Scelte compiute Lettura a byte Match massimo: 15 (4 bit => length) Sliding-window: 4096 simboli (12 bit => offset)
Implementazione - LZSS Problemi riscontrati Compressione Ricerca del match massimo nella sliding-window Scrittura bits Posizione flags Decompressione Lettura bits Bits spuri alla fine del file compresso
Implementazione - LZSS Problemi risolti Compressione Ricerca del match massimo => Bruteforce Scrittura bits => Maschere Decompressione Lettura bits => Maschere
Implementazione - LZSS Problemi aperti Compressione Posizione flags => (8 flags e 8 terne/caratteri) Decompressione Bits spuri alla fine del file compresso => (Sequenza finale)
Implementazione - LZSS Strutture dati Scelte: Buffer di caratteri per la lettura di file Struct per gestione terne Array per sliding-window e lookahead buffer
Implementazione - LZSS Sviluppi futuri Compressione Ricerca del match massimo => Liste? Hash? Scrittura bits => Libreria bitfile Decompressione Lettura bits => Libreria bitfile
Implementazione – Shannon Fano Problemi riscontrati Compressione Generazione albero ricorrenze Bits spuri a fine file
Implementazione – Shannon Fano Problemi risolti Compressione Generazione albero ricorrenze => Liste Bits spuri a fine file => Informazioni nell’header
Implementazione – Shannon Fano Strutture dati Scelte: Puntatori per Alberi e Liste Array per conteggio simboli Array per ordinamento in base alla frequenza Array algoritmo generazione Albero
Implementazione – Shannon Fano Sviluppi futuri Decompressione
Gianluca Costante & Alessio Scannapieco LZSS + SHANNON FANO Gianluca Costante & Alessio Scannapieco
Beta - LZSS Scelte finali Sliding-window => variabile Match massimo => variabile Compressione Ricerca match => bruteforce Scrittura bits => Libreria bitfile Posizione flags => pacchetto da 1 byte Decompressione Lettura bits => Libreria bitfile Bits spuri => Sequenza finale
Analisi finale - LZSS OFFSET_BITS = 8 LENGTH_BITS = 4 File Dim. Tempo % Compressione JPG 129 KB 0.163 s -11.987 % TEXT 3.7 MB 0.480 s 32.347 % BMP 778 KB 0.241 s 35.265 % EXCEL 50 KB 0.297 s 5.409 % PDF 5.4 MB 6.592 s -6.784 % MEMORIA = 28 + 24 = 272 bytes
Analisi finale - LZSS OFFSET_BITS = 8 LENGTH_BITS = 8 File Dim. Tempo % Compressione JPG 129 KB 0.182 s -12.340 % TEXT 3.7 MB 0.550 s 16.950 % BMP 778 KB 0.524 s 32.359 % EXCEL 50 KB 0.352 s 6.017 % PDF 5.4 MB 6.549 s -7.225 % MEMORIA = 28 + 28 = 512 bytes
Analisi finale - LZSS OFFSET_BITS = 12 LENGTH_BITS = 4 File Dim. Tempo % Compressione JPG 129 KB 2.376 s -11.406 % TEXT 3.7 MB 1.254 s 65.660 % BMP 778 KB 3.471 s 54.839 % EXCEL 50 KB 1.742 s 5.571 % PDF 5.4 MB 91.124 s -3.510 % MEMORIA = 212 + 24 = 4112 bytes
Analisi finale - LZSS OFFSET_BITS = 12 LENGTH_BITS = 8 File Dim. Tempo % Compressione JPG 129 KB 2.323 s -15.169 % TEXT 3.7 MB 1.249 s 57.954 % BMP 778 KB 3.192 s 55.943 % EXCEL 50 KB 1.508 s 7.612 % PDF 5.4 MB 90.276 s -6.904 % MEMORIA = 212 + 28 = 4352 bytes
Analisi finale - LZSS OFFSET_BITS = 12 LENGTH_BITS = 12 File Dim. Tempo % Compressione JPG 129 KB 2.552 s -18.936 % TEXT 3.7 MB 1.169 s 50.040 % BMP 778 KB 3.564 s 49.634 % EXCEL 50 KB 2.497 s 3.012 % PDF 5.4 MB 99.218 s -10.218 % MEMORIA = 212 + 212 = 8192 bytes
Analisi finale - LZSS Fattori importanti Scelta della dimensione di offset e length Dipende molto dalla tipologia di file Algoritmo di ricerca in finestra Bruteforce non efficiente, caso peggiore: 2bit_offset
Ottimizzazione - LZSS Utilizzo dell’algoritmo Knuth-Morris-Pratt OFFSET_BITS = 12 LENGTH_BITS = 4 File Dim. Tempo % Compressione JPG 129 KB 1.708 s -11.406 % TEXT 3.7 MB 0.873 s 65.660 % BMP 778 KB 2.547 s 54.839 % EXCEL 50 KB 0.438 s 5.116 % PDF 5.4 MB 66.938 s -3.510 % MEMORIA = 212 + 24 = 4112 bytes
Closed Beta - ShannonFanoC Shannon Fano Canonico Facilita la decodifica Informazioni dell’header Lunghezza codici (0 a 255) Bit da leggere dall’ultimo byte (256esimo)
Closed Beta – ShannonFanoC Header di esempio
Closed Beta - ShannonFanoC Problematiche newline Differenze sostanziali in quantità di peso per certi tipi di file .bmp, certi si, certi no Altri tipi di file
Closed Beta - ShannonFanoC Problematiche newline File .txt Differenze sostanziali in quantità di peso per certi tipi di file Fase di debug .bmp, certi si, certi no Dovuto ad un errore di codifica o decodifica Altri tipi di file Analizzare l’output
Closed Beta – ShannonFanoC DEMO File di testo (text11.txt) BMP funzionante (ImmagineTest.bmp)
Closed Beta – ShannonFanoC Prossima fase Risolvere le problematiche Ottimizzare il programma Documentare il codice
Grazie per l’attenzione