usaa24/sk1
2025-01-19 21:59:09 +01:00
..
compressor.c skuska 2025-01-19 21:51:45 +01:00
compressor.h skuska 2025-01-19 21:42:31 +01:00
main.c skuska 2025-01-19 19:46:52 +01:00
Makefile skuska 2025-01-19 19:49:04 +01:00
README.md skuska 2025-01-19 21:59:09 +01:00

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