Algorytmy: Algorytmy kompresji
Kompresja to zmniejszenie rozmiaru pliku za pomocą odpowiedniego algorytmu kompresującego. Kompresja danych przeprowadzana jest poprzez ich zagęszczenie dzięki procesowi ponownego matematycznego kodowania ich struktury. Aby kompresja miała sens zagęszczanie danych powinno być w pełni odwracalne. Kompresja bezstratna (zwana też ilościową) - rodzaj kompresji danych, w której po rozkompresowaniu danego zbioru jest on identyczny z jego wcześniejszą wersją (przed spakowaniem) czyli nie wystąpiła utrata jakichkolwiek informacji. Metody kompresji bezstratnej dzieli się na probalistyczne i słownikowe. Kompresja stratna (zwana też jakościową) - rodzaj kompresji danych, w której po rozpakowaniu danego zbioru nastąpiła utrata części informacji. Dekompresja to proces przywracający skompresowane pliki danych do ich pierwotnej postaci w jakiej zostały utworzone. Kompresja danych metodą Huffmana
Kodowanie Huffmana należy do najprostszych algorytmów kompresji danych.
Mamy zbiór n symboli, z którego każdy występuje określoną ilość razy w kodowanym ciągu (zbiorze). Pierwszym krokiem jest określenie częstości wystąpienia każdego symbolu w kodowanym ciągu (zbiorze). Kolejnym krokiem jest wybranie z tej listy dwóch symboli o najmniejszych wagach i zastąpienie ich
symbolem, dla którego stają się one odpowiednio lewą i prawą gałęzią drzewa. Nowy (połączony) symbol
przyjmuje częstotliwość (wagę) równą sumie częstotliwości (wag) symboli, z których został utworzony.
Otrzymujemy więc zbiór symboli o liczebności o 1 mniejszej od zbioru wyjściowego.
Następnym krokiem jest znalezienie kodów dla każdego symbolu występującego w ciągu. Robimy to w
następujący sposób: podczas przechodzenia drzewa od góry do dołu przy każdym skręcie w lewo do kodu
dołączamy 0, a przy skręcie w prawo - 1.
Ostatnim krokiem jest kompresja polegająca na zastąpieniu każdego symbolu ciągu jego kodem zapisanym w postaci zer i jedynek na kolejnych bitach. Dekompresja wymaga posiadania drzewa kodów, a odtworzenie danych polega na czytaniu kolejnych bitów ze strumienia danych i jednoczesnym przechodzeniu drzewa zgodnie z przejętą konwencją (lewo/prawo). Po dojściu do pojedynczego symbolu zapisujemy go do ciągu wynikowego i powracamy do korzenia drzewa. W opisie algorytmu celowo użyte jest słowo symbol. Nie musi to być bowiem znak (bajt). Symbolem może być dowolny podciąg, słowo, struktura - słowem coś, co dla kompresowanych danych jest charakterystyczne. Przykład:
Poniższy rysunek przedstawia schemat kodowania ciągu, w którym występują symbole:
A - 1 raz,
B - 2 razy,
C - 3 razy,
D - 4 razy.
Kodowanie RLE (ang. Run Length Encoding)
Kodowanie RLE jest stosowane do kompresji danych, w których kolejno występuje wiele identycznych znaków.
Opis algorytmu kodowania:
Opis algorytmu dekodowania:
Przykład: Kodowany łańcuch znaków: aaabaaa#bbbxxzbtttttwwwwwssssss#####bbbbbaaaaababatttttyaaaaaq## Ustalony znacznik: # Zakodowany łańcuch: #3ab#3a#1##3bxxzb#5t#5w#6s#5##5b#5ababa#5ty#5aq#2#
|