36 lines
3.5 KiB
Markdown
36 lines
3.5 KiB
Markdown
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.
|
|
|