3.2 KiB
3.2 KiB
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