usaa25/sk1
2026-02-07 02:10:39 +01:00
..
:wq fin huf 2026-02-07 02:10:39 +01:00
compressor fin huf 2026-02-07 02:10:39 +01:00
compressor.c fin huf 2026-02-07 02:10:39 +01:00
compressor.h huff 2026-02-07 01:44:33 +01:00
compressor.o fin huf 2026-02-07 02:10:39 +01:00
main.c huff 2026-02-07 01:44:33 +01:00
main.o fin huf 2026-02-07 02:10:39 +01:00
Makefile fin huf 2026-02-07 02:10:39 +01:00
README.md huff 2026-02-07 01:44:33 +01:00
test_out.txt fin huf 2026-02-07 02:10:39 +01:00
test.huff fin huf 2026-02-07 02:10:39 +01:00
test.txt fin huf 2026-02-07 02:10:39 +01:00

Zadanie

Cieľom domácej úlohy je navrhnúť a implementovať program v jazyku C, ktorý umožňuje kompresiu a dekompresiu ľubovoľných binárnych súborov s maximálnou veľkosťou 10 MB. Na kompresiu je potrebné použiť niektorý z bežných kompresných algoritmov, napríklad Huffmanovo kódovanie, LZ77 alebo LZ78, prípadne vlastný algoritmus. Použitie algoritmu RLE nie je povolené. Po dekompresii musí byť výsledný súbor bitovo zhodný s pôvodným vstupným súborom. Program musí používať výhradne štandardnú knižnicu jazyka C a musí byť spustiteľný z príkazového riadka. Rozhranie programu má podporovať prepínače na kompresiu, dekompresiu a zobrazenie nápovedy.

Stručný opis funkčnosti

Program umožňuje skomprimovať zadaný vstupný súbor do výstupného súboru pomocou prepínača -c a dekomprimovať už skomprimovaný súbor späť do pôvodnej podoby pomocou prepínača -d. Vstupný a výstupný súbor sa zadávajú ako argumenty príkazového riadka. Program pracuje priamo s binárnymi dátami a nepredpokladá žiadny konkrétny formát vstupného súboru. Súčasťou programu je aj nápoveda, ktorá sa zobrazí pri nesprávnom použití alebo pri spustení s neplatnými argumentmi.

Stručný opis riešenia

Riešenie je založené na Huffmanovom kódovaní, ktoré patrí medzi bezstratové kompresné algoritmy. Pri kompresii program najskôr prečíta celý vstupný súbor a spočíta frekvenciu výskytu každého z 256 možných bajtových symbolov. Tieto frekvencie sa uložia do hlavičky výstupného súboru, aby bolo možné pri dekompresii znovu zostaviť identický Huffmanov strom.

Na základe vypočítaných frekvencií sa zostaví Huffmanov strom, v ktorom majú menej časté symboly dlhšie binárne kódy a častejšie symboly kratšie kódy. Z tohto stromu sa následne rekurzívne vygenerujú binárne kódy pre jednotlivé symboly. Po vytvorení kódov sa vstupný súbor znovu prečíta a jeho obsah sa zapíše do výstupného súboru v zakódovanej bitovej podobe. Bity sú postupne zoskupované do bajtov a zapisované do súboru.

Pri dekompresii program najskôr načíta hlavičku súboru obsahujúcu frekvencie symbolov. Z týchto frekvencií sa opätovne zostaví Huffmanov strom rovnakým spôsobom ako pri kompresii. Program následne číta zakódované bajty zo súboru, postupne ich rozkladá na jednotlivé bity a podľa nich prechádza Huffmanov strom. Po dosiahnutí listového uzla sa zapíše príslušný symbol do výstupného súboru. Tento proces pokračuje až do spracovania celého vstupného súboru.

Podmienky správnej funkčnosti

Program je určený na spúšťanie v prostredí s podporou štandardu jazyka C11. Používa výhradne štandardnú knižnicu jazyka C a nevyužíva žiadne externé knižnice. Program predpokladá korektný vstup vo forme existujúceho súboru a dostatočné oprávnenia na čítanie a zápis súborov. Maximálna veľkosť vstupného súboru je 10 MB. Správna funkčnosť programu bola overená testovaním na binárnych súboroch z Canterbury corpus. Po dekompresii musí byť výsledný súbor bitovo zhodný s pôvodným súborom.

Zoznam použitých zdrojov

Prednášky a cvičenia k predmetu zameranému na dátové štruktúry a algoritmy. Online vzdelávacie materiály GeeksForGeeks k téme Huffmanovo kódovanie. Generatívny jazykový model ChatGPT bol použitý ako pomocný nástroj na konzultáciu návrhu riešenia a štruktúry programu. Použitý prompt bol: Implement Huffman compressor in C.