Note di rilascio Huffy, versione 1.0 Architettura del software Huffy implementa l'algoritmo di compressione e decompressione di Huffman. Ideato dall'omonimo informatico, l'algoritmo di Huffman è un algoritmo di compressione dati lossless a lunghezza variabile. Ciò vuol dire che durante la codifica dei dati, a dati più frequenti viene assegnato un codice più breve, mentre ai dati meno frequenti si assegna un codice più esteso. Tale approccio mira ad approssimare il limite ottimale teorizzato dal Teorema di Shannon che definisce il numero di bit necessari per codificare una certa quantità di dati. L'implementazione fa uso di 3 strutture dati principali: una struttura Array per contenere i caratteri con le rispettive frequenze, una coda di priorità (nello specifico MinHeap) e un Huffman_Tree (un albero binario di ricerca) per costruire le codifiche. (Per la struttura esatta del codice vedere la documentazione NaturalDocs) L'algoritmo opera nel seguente modo: 1) Viene analizzato il file da comprimere e si costruisce un Array contenente i caratteri e il numero di volte che compaiono nel file; 2) Si inizializza la coda di priorità con tutte le coppie "carattere-frequenza" appena trovate (essendo una coda di priorità minima, verra estratto per primo il carattere con frequenza minima); 3) Si inizia a costruire un albero binario nel seguente modo: si estraggono due caratteri dal MinHeap (abbiamo la garanzia che saranno i due caratteri con frequenza più bassa), e si associa a ciascun carattere un Nodo dell'albero. Infine si costruisce un terzo nodo "padre" dei due precedenti, che contiene la somma delle frequenze dei caratteri dei figli. Il nuovo Nodo viene re-immesso nella coda di priorità. Si ripete tale procedura di estrazione e re-immissione dalla Coda fino a quando quest'ultima non sarà vuota. 4) Alla fine della costruzione dell'albero avremo un BST che, partendo dalle foglie e salendo fino alla radice, avrà un numero crescente di frequenza nel nodo. 5) A questo punto costruiamo le codifiche assegnando ai rami sinistri il codice binario '0' e ai rami destri il codice '1'. Partendo dalla radice esploriamo tutti i caratteri contenuti nell'albero e in base al percorso di rami scelto, si costruisce il codice associato al carattere concatenando '0' e '1' in base ai rami selezionati. 6) Infine non rimane che costruire la codifica finale del file sostituendo ad ogni carattere il corrispondente codice di Huffman. 7) Nel file compresso a questo punto ci basta indicare il dizionario di "Caratteri"-"Frequenze" e la codifica binaria del testo. Noti questi due elementi è possibile decodificare il file compresso. Tecniche di programmazione Huffy è interamente pensato e sviluppato secondo il paradigma OOP (Object Oriented Programming). Collaudi Huffy è stato testato sia su piattaforma Windows che Linux. Sono stati testati file di diverse dimensioni e si è visto che fino alla dimensione di 330-350KB il programma non ha alcun problema, superata questa soglia i tempi di attesa aumentano. (si prega di segnalare eventuali problemi e bug). Inoltre si fa notare che l'effettiva compressione dei dati funziona per input che hanno una certa dimensione minima, in quanto nel file compresso la struttura dei dati è: alfabeto caratteri-frequenze e codifica binaria del testo originali. Detto ciò ponendo il caso di un file di input formato da una singola lettera (1 byte), nel file compresso avremmo la lettera, il numero di volte che compare (1) e la codifica della lettera stessa (0 o 1) con un totale di 3 byte, cioè una dimensione maggiore dell'input. Su alcuni test effettuati si registra un rapporto di compressione che oscilla tra 1.35 e 1.55, con un campione minimo di 1.30 e uno massimo di 1.6. In riferimento al limite della dimensione del file , si mostrano di seguito alcuni dati raccolti durante alcuni test effettuati su macchina con Java 8 e processore i5: - per file fino ai 330-350 KB si rilevano tempi di compressione tra i 27 e i 35 sec.; - dai 360 KB in poi si ottiene un aumento esponenziale dei tempi di compressione anche fino a diversi minuti; Per quanto riguarda la decompressione invece si rilevano tempi molto rapidi in entrambi i casi (relativamente alla dimensione dell'input). Idee per ulteriori sviluppi Nella versione attuale di Huffy, il software genera solamente il file compresso e consente di decomprimerlo. Eventuali sviluppi potrebbere aggiungere: - Un'interfaccia grafica per la gestione dei file (file explorer, barra di progresso ecc..); - Una indicazione sul rapporto di compressione del file; - Provare ad utilizzare diverse strutture dati e strategie di programmazione per risolvere il problema del limite di dimensione del file. - Estendere l'implementazione dell'algoritmo di Huffman anche ad altri tipi di dato (es: immagini).