Algorytmy Kompresji Bezstratnej

Metody zachowuj膮ce wszystkie oryginalne dane: kodowanie Huffmana, metody s艂ownikowe (LZW), RLE.

Filozofia Kompresji Bezstratnej

Podstawow膮 obietnic膮 jest idealna wierno艣膰. Kiedy kompresujesz plik, a nast臋pnie go dekompresujesz, wynik jest bit po bicie, matematycznie identycznym klonem orygina艂u. 呕adne dane nie s膮 tracone, zmieniane ani nawet nieznacznie przearan偶owane. Ta gwarancja jest nienegocjowalna dla szerokiej gamy typ贸w danych, w tym dokument贸w tekstowych, program贸w komputerowych, zapis贸w finansowych i danych naukowych, gdzie nawet jeden b艂臋dny bit m贸g艂by mie膰 katastrofalne konsekwencje.

Ale skoro 偶adna informacja nie jest odrzucana, to jak mo偶liwa jest kompresja? Odpowied藕 le偶y w koncepcji nadmiarowo艣ci (redundancji). Rzeczywiste dane rzadko s膮 losowe; s膮 pe艂ne wzorc贸w, powt贸rze艅 i przewidywalnych struktur. Algorytmy bezstratne to w istocie zaawansowane narz臋dzia do identyfikowania tej nadmiarowo艣ci i tworzenia nowej, bardziej wydajnej reprezentacji danych, kt贸ra eliminuje to marnotrawstwo. Dzia艂aj膮 one nie przez usuwanie informacji, ale przez jej sprytniejsze ponowne zakodowanie. W tej sekcji zag艂臋bimy si臋 w wewn臋trzne dzia艂anie najwa偶niejszych i fundamentalnych algorytm贸w bezstratnych, kt贸re stanowi膮 trzon nowoczesnego przechowywania i przesy艂ania danych. Zbadamy g艂贸wne rodziny tych technik: metody statystyczne, takie jak kodowanie Huffmana, metody s艂ownikowe, jak LZW, oraz proste schematy oparte na powt贸rzeniach, jak kodowanie d艂ugo艣ci serii.

Kompresja Statystyczna: Kodowanie w Oparciu o Prawdopodobie艅stwo

Jedn膮 z najpot臋偶niejszych form redundancji jest redundancja statystyczna. W ka偶dej wystarczaj膮co du偶ej pr贸bce danych pewne symbole lub warto艣ci pojawiaj膮 si臋 znacznie cz臋艣ciej ni偶 inne. Na przyk艂ad w j臋zyku polskim samog艂oski 'a' i 'i' oraz sp贸艂g艂oska 'z' s膮 niezwykle powszechne, podczas gdy '藕' czy '艅' s膮 rzadkie. Standardowy schemat kodowania, taki jak ASCII, u偶ywa sta艂ej liczby bit贸w (zazwyczaj 8) dla ka偶dego znaku, niezale偶nie od tego, jak cz臋sto jest on u偶ywany. Jest to nieefektywne. Metody kompresji statystycznej wykorzystuj膮 te r贸偶nice w cz臋stotliwo艣ciach do tworzenia bardziej zwartych kod贸w.

Naczelna zasada jest prosta: przypisz bardzo kr贸tkie kody binarne do najcz臋stszych symboli, a progressively d艂u偶sze kody binarne do najrzadszych symboli. Daje to w efekcie wiadomo艣膰 o kr贸tszej 艣redniej liczbie bit贸w na symbol, co prowadzi do kompresji.

Kodowanie Huffmana: Klasyczna Implementacja

Opracowane przez Davida A. Huffmana w 1952 roku, jest archetypicznym algorytmem kompresji statystycznej. Zapewnia on optymaln膮 metod臋 przypisywania tych kod贸w o zmiennej d艂ugo艣ci do zbioru symboli, bior膮c pod uwag臋 ich cz臋stotliwo艣ci. Proces mo偶na podzieli膰 na kilka kluczowych krok贸w.

Krok 1: Analiza Cz臋stotliwo艣ci

Pierwszym krokiem jest odczytanie danych 藕r贸d艂owych i zliczenie liczby wyst膮pie艅 ka偶dego unikalnego symbolu. Pozwala to okre艣li膰 prawdopodobie艅stwo lub cz臋stotliwo艣膰 ka偶dego symbolu. U偶yjmy prostego przyk艂adowego ci膮gu: "ala ma kota".

Analizujemy ci膮g i zliczamy znaki (w艂膮czaj膮c spacj臋):

ZnakCz臋stotliwo艣膰
'a'4
' ' (spacja)2
'l'1
'm'1
'k'1
'o'1
't'1
Krok 2: Budowanie Drzewa Huffmana

Nast臋pnie, na podstawie tych cz臋stotliwo艣ci, konstruujemy specjalne drzewo binarne. Proces jest iteracyjny:

  • Utw贸rz w臋ze艂 li艣ciasty dla ka偶dego unikalnego symbolu, oznaczaj膮c go symbolem i jego cz臋stotliwo艣ci膮.
  • Wielokrotnie znajd藕 dwa w臋z艂y w kolekcji o najni偶szych cz臋stotliwo艣ciach.
  • Po艂膮cz te dwa w臋z艂y w nowy wewn臋trzny w臋ze艂 nadrz臋dny. Cz臋stotliwo艣膰 tego nowego w臋z艂a nadrz臋dnego jest sum膮 cz臋stotliwo艣ci jego dw贸ch potomk贸w.
  • Kontynuuj ten proces, a偶 wszystkie w臋z艂y zostan膮 po艂膮czone w jeden korze艅.

Ta struktura drzewa w naturalny spos贸b umieszcza najrzadsze symbole g艂臋biej w drzewie, a najcz臋stsze bli偶ej korzenia.

Krok 3: Przypisywanie Kod贸w Binarnych

Gdy drzewo jest ju偶 zbudowane, przypisujemy kody binarne, przechodz膮c przez nie. Powszechn膮 konwencj膮 jest oznaczanie ka偶dej lewej ga艂臋zi jako '0', a ka偶dej prawej jako '1'. Kod binarny dla dowolnego symbolu to sekwencja zer i jedynek napotkana na 艣cie偶ce od korzenia drzewa do li艣cia tego symbolu.

ZnakCz臋stotliwo艣膰Kod Huffmana
'a'40
' '210
'l'1110
'm'11110
'k'111110
'o'1111110
't'1111111
Krok 4: Kodowanie, W艂a艣ciwo艣膰 Prefiksowa i Dekodowanie

Oryginalny ci膮g "ala ma kota" jest teraz kodowany poprzez zast膮pienie ka偶dego znaku jego nowym kodem binarnym. Najwa偶niejsz膮 cech膮 kod贸w Huffmana jest w艂a艣ciwo艣膰 prefiksowa. Oznacza to, 偶e 偶aden kod nie jest pocz膮tkiem (prefiksem) 偶adnego innego kodu. Na przyk艂ad '0' jest kodem dla 'a', i 偶aden inny kod nie zaczyna si臋 od '0'. Ta w艂a艣ciwo艣膰 jest kluczowa, poniewa偶 pozwala dekoderowi na jednoznaczne parsowanie skompresowanego strumienia bit贸w bez potrzeby stosowania specjalnych separator贸w mi臋dzy kodami.

Dekoder po prostu czyta strumie艅 bit贸w bit po bicie, przechodz膮c przez drzewo Huffmana (kt贸re musi by膰 wys艂ane wraz z danymi lub by膰 predefiniowane), a偶 dotrze do w臋z艂a li艣ciastego. Gdy li艣膰 zostanie osi膮gni臋ty, symbol jest wypisywany, a proces powtarza si臋 od korzenia drzewa.

Kompresja S艂ownikowa: Znajdowanie Powtarzaj膮cych Si臋 Fraz

Cho膰 metody statystyczne s膮 pot臋偶ne, skupiaj膮 si臋 na cz臋stotliwo艣ci pojedynczych symboli. A co z redundancj膮 na wi臋ksz膮 skal臋, jak ca艂e s艂owa czy frazy, kt贸re si臋 powtarzaj膮? Tutaj z pomoc膮 przychodz膮 metody kompresji s艂ownikowej. Zamiast liczy膰 symbole, znajduj膮 one powtarzaj膮ce si臋 sekwencje i zast臋puj膮 je kr贸tkimi odwo艂aniami.

Algorytm LZW (Lempel-Ziv-Welch)

Algorytm LZW jest klasyczn膮 i szeroko stosowan膮 technik膮 s艂ownikow膮, znan膮 z wykorzystania w formacie obraz贸w GIF. Dzia艂a on, buduj膮c s艂ownik ci膮g贸w znak贸w "w locie" podczas kompresji.

Przyk艂ad LZW Krok po Kroku

Skompresujmy ci膮g "TATATAKNIETAK".

  1. Inicjalizacja: S艂ownik zaczyna od wszystkich pojedynczych znak贸w. Powiedzmy: T=1, A=2, K=3, N=4, I=5, E=6.
  2. Krok 1:
    • Kompresor czyta 'T'. Jest w s艂owniku.
    • Czyta nast臋pny znak 'A'. Ci膮g "TA" NIE jest w s艂owniku.
    • Wypisuje kod dla 'T' (czyli 1).
    • Dodaje "TA" do s艂ownika z nowym kodem (np. 7).
    • Bie偶膮cym ci膮giem staje si臋 'A'.
  3. Krok 2:
    • Bie偶膮cy ci膮g to 'A'. Nast臋pny znak to 'T'. "AT" NIE jest w s艂owniku.
    • Wypisuje kod dla 'A' (czyli 2).
    • Dodaje "AT" do s艂ownika (kod 8).
    • Bie偶膮cym ci膮giem staje si臋 'T'.
  4. Krok 3:
    • Bie偶膮cy ci膮g to 'T'. Nast臋pny to 'A'. "TA" JEST w s艂owniku (w艂a艣nie go dodali艣my, kod 7).
    • Kontynuuje. Bie偶膮cy ci膮g to "TA". Nast臋pny znak to 'T'. "TAT" NIE jest w s艂owniku.
    • Wypisuje kod dla "TA" (czyli 7).
    • Dodaje "TAT" do s艂ownika (kod 9).
    • Bie偶膮cym ci膮giem staje si臋 'T'.
  5. Kontynuacja... Proces jest kontynuowany a偶 do ko艅ca ci膮gu. Algorytm znajdzie r贸wnie偶 powtarzaj膮ce si臋 sekwencje "AK" i "TAK".
  6. Wynik: Oryginalny, d艂u偶szy ci膮g znak贸w jest kodowany jako sekwencja kr贸tszych kod贸w numerycznych. Ta sekwencja liczb mo偶e by膰 zapisana przy u偶yciu mniejszej liczby bit贸w ni偶 oryginalne znaki. Dekompresor jest w stanie odtworzy膰 dok艂adnie ten sam s艂ownik w miar臋 odczytywania kod贸w, dzi臋ki czemu proces jest idealnie odwracalny bez potrzeby przesy艂ania samego s艂ownika.

Ta technika jest bardzo skuteczna dla danych z wieloma powtarzaj膮cymi si臋 sekwencjami, takich jak tekst, kod komputerowy i pewne typy obraz贸w, jak wida膰 w formacie GIF, gdzie skutecznie kompresuje poziome wzory.

Kodowanie D艂ugo艣ci Serii (RLE): Kompresja Prostoty

Kodowanie D艂ugo艣ci Serii (Run-Length Encoding) jest prawdopodobnie najbardziej intuicyjnym ze wszystkich algorytm贸w kompresji. Jest przeznaczone do jednego specyficznego typu redundancji: d艂ugich, ci膮g艂ych serii tej samej warto艣ci danych.

Zasada RLE

Zamiast przechowywa膰 ka偶dy symbol w powtarzalnej sekwencji, RLE przechowuje tylko dwie informacje: sam symbol i liczb臋 jego powt贸rze艅.

Eksplorator RLE

Zmieniaj przyk艂ady, aby zobaczy膰 jak d艂ugie serie symboli zamieniaj膮 si臋 w pary licznik/warto艣膰.

艢wietne dla sylwetek, kod贸w kreskowych i ikon z du偶ymi p艂askimi obszarami.

D艂ugo艣膰 orygina艂u
20
Liczba serii
4
Pola po kodowaniu
8
Stopie艅 kompresji
2.50x kr贸cej
Dane wej艣ciowe
W
W
W
W
W
W
W
W
B
B
B
B
W
B
B
B
B
B
B
B
Legenda
WPiksel bia艂y
BPiksel czarny
Wyj艣cie RLE4 serie
#licznikwarto艣膰
18W
24B
31W
47B

Ka偶dy wiersz przechowuje d艂ugo艣膰 serii oraz symbol.

Interaktywny schemat pokazuje, jak RLE zamienia powtarzane piksele lub znaki w pary licznik/wartosc i ile bajtow mozna w ten sposob zaoszczedzic.

Przyk艂ad: Prosty Obraz Binarny

Wyobra藕 sobie pojedyncz膮 lini臋 czarno-bia艂ego obrazu reprezentowan膮 przez t臋 sekwencj臋 (B=bia艂y, C=czarny):

BBBBBBBBBBCCCCBCCCCCCC

Surowa reprezentacja wymaga艂aby 22 jednostek danych. U偶ywaj膮c RLE, mo偶emy to zakodowa膰 jako:

(10, B), (4, C), (1, B), (7, C)

Ta reprezentacja, sk艂adaj膮ca si臋 tylko z 8 jednostek danych (4 liczniki i 4 warto艣ci), jest znacznie kr贸tsza.

Kiedy Stosowa膰 RLE

RLE jest niezwykle skuteczne dla danych charakteryzuj膮cych si臋 du偶ymi, jednolitymi obszarami. To czyni je doskona艂ym wyborem dla:

  • Grafik komputerowych, takich jak ikony, logotypy i wykresy.
  • Prostych animacji.
  • Wynik贸w niekt贸rych proces贸w analizy obrazu, gdzie regiony s膮 segmentowane wed艂ug koloru.

Jest ono jednak notorycznie nieskuteczne, a nawet mo偶e przynie艣膰 efekt przeciwny do zamierzonego (zwi臋kszaj膮c rozmiar pliku), na danych z bardzo ma艂膮 liczb膮 serii, takich jak fotografie czy dane zaszumione. RLE jest u偶ywane jako cz臋艣膰 starszych format贸w, takich jak PCX, BMP i TIFF.

Podej艣cia Hybrydowe: To co Najlepsze z Obu 艢wiat贸w

Najpot臋偶niejsze systemy kompresji bezstratnej u偶ywane obecnie cz臋sto nie opieraj膮 si臋 na jednym algorytmie, ale s膮 sprytnymi hybrydami, kt贸re 艂膮cz膮 si艂臋 r贸偶nych technik. Doskona艂ym przyk艂adem jest algorytm Deflate, kt贸ry jest silnikiem wszechobecnych format贸w archiw贸w ZIP i GZIP, a tak偶e formatu obraz贸w PNG. Deflate 艂膮czy algorytm s艂ownikowy LZ77 z kodowaniem Huffmana. Najpierw u偶ywa LZ77 do znajdowania i zast臋powania powtarzaj膮cych si臋 ci膮g贸w wska藕nikami. Wynikiem tego etapu jest mieszanka litera艂贸w (znak贸w, kt贸re nie by艂y cz臋艣ci膮 powtarzaj膮cej si臋 sekwencji) i wska藕nik贸w. Ten mieszany strumie艅 jest nast臋pnie dalej kompresowany za pomoc膮 kodowania Huffmana, kt贸re przypisuje kr贸tkie kody do najcz臋stszych litera艂贸w i wska藕nik贸w. Ten dwuetapowy proces pozwala Deflate na wydajne przechwytywanie zar贸wno powt贸rze艅 na du偶膮 skal臋, jak i wzorc贸w statystycznych na ma艂膮 skal臋, co skutkuje doskona艂膮, uniwersaln膮 wydajno艣ci膮 kompresji.

    Algorytmy Kompresji Bezstratnej | Teleinf Edu