72 lines
3.2 KiB
Markdown
72 lines
3.2 KiB
Markdown
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 |