Zadanie Naprogramuj nástroj na kompresiu a dekompresiu. Na kompresiu použite aspoň dva kompresné algoritmy, napr. : Huffmanovo kódovanie, LZ77, LZ78, Run Length kódovanie alebo iný. Môžete vymyslieť aj vlastný algoritmus. Maximálne hodnotenie za riešenie obsahujúce iba algoritmus RLE je 30 percent. Kompresor a dekompresor by mal byť schopný pracovať s ľubovoľným binárnym súborom do 10 MB. Súbor by mal byť po skomprimovaní menší minimálne o 10 percent a po dekomprimovaní by mal byť zhodný s pôvodným súborom. Pri práci s binárnymi súbormi môžete využiť funkcie fopen(), fread() a fwrite(). Na otestovanie kompresora a dekompresora použite súbory z Canterbury corpus. Riešenie nesmie využívať inú ako štandardnú knižnicu. Riešenie sa môže inšpirovať voľne dostupným cudzím riešením za predpokladu, že uvediete zdroj, ste podrobne oboznámený so zdrojovým kódom a viete odpovedať na otázky týkajúce sa kódu. Vaše riešenie nemôže kopírovať cudzie riešenie. V prípade, že použijete generatívny model, napíšte ktorý a napíšte aj prompt ktorý ste použili. Program by mal mať takéto rozhranie pri spustení z príkazového riadka: # skomprimuje infile do súboru outfile ./compressor -c infile outfile # dekomprimuje súbor compressed a zapíše do súboru uncompressed. ./compressor -d compressed uncompressed # vypíše pomoc ./compressor -h Opis funkčnosti Program vykonáva kompresiu a dekompresiu súborov pomocou dvoch algoritmov: Huffmanovo kódovanie (implementované v compress_1 a decompress_1). LZ77 (implementované v compress_2 a decompress_2). Pri kompresii sa vstupný súbor analyzuje a prevádza do skomprimovaného formátu, ktorý zaberá menej miesta. Pri dekompresii sa súbor obnovuje do pôvodnej podoby. Program podporuje prácu s ľubovoľnými binárnymi súbormi do veľkosti 10 MB. Opis riešenia Huffmanovo kódovanie: Vstupný súbor sa analyzuje a vytvorí sa frekvenčná tabuľka znakov. Na základe tejto tabuľky sa zostaví Huffmanov strom. Každému znaku sa priradí binárny kód, ktorý je následne použitý na zápis skomprimovaných dát. LZ77: Algoritmus používa sliding window techniku na hľadanie opakujúcich sa reťazcov v dátach. Zápis pozostáva z trojíc (offset, length, next_symbol), ktoré umožňujú rekonštrukciu pôvodného súboru. Spracovanie binárnych súborov: Na čítanie a zápis sa používajú funkcie fopen(), fread(), fwrite(). Dáta sa spracovávajú v pamäťových bufferoch. Podmienky spustenia : Súbor musí byť menší ako 10 MB. Program pracuje iba s binárnymi a textovými súbormi. Súbor musí byť dostupný a čitateľný (program kontroluje chyby pri otváraní súborov). Zoznam použitých zdrojov Canterbury corpus - Súbory použité na testovanie: https://corpus.canterbury.ac.nz/ Dokumentácia k Huffmanovmu kódovaniu: https://en.wikipedia.org/wiki/Huffman_coding Dokumentácia k LZ77: https://en.wikipedia.org/wiki/LZ77_and_LZ78