Kody i szyfry
6. Kompresja informacji
6.2. Kod Huffmana
Kod Huffmana to kod ale jednocześnie najbardziej znana, powszechnie stosowana, efektywna metoda kompresji danych. W zależności od typu kompresowanego pliku, osiąga się oszczędności w objętości danych od 20% do nawet 90%. Kod Huffmana to kod prefiksowy spełniający następujące warunki:
- obiektom kodowanym występującym częściej (mającym większe prawdopodobieństwo wystąpienia) odpowiadają krótsze słowa niż obiektom występującym rzadziej (mającym mniejsze prawdopodobieństwo wystąpienia);
- dwa najrzadziej występujące (najmniej prawdopodobne) mają słowa tej samej długości.
Będziemy dalej zakładać, że obiektami kodowanymi są litery (symbole) z pewnego alfabetu V1 {a1 , a2 ,..., an } i znamy prawdopodobieństwo pojawienia się każdej litery tzn. podane są prawdopodobieństwa binarnego {0,1}. P(ai ) pi dla i 1, 2,..., n . Ponadto używamy jako alfabetu V2 zbioru
Algorytm kodowania Huffmana czyli algorytm Huffmana jest następujący:
- dla każdej litery tworzymy drzewo złożone tylko z korzenia i ustawiamy te drzewa w malejącym porządku prawdopodobieństwa użycia danej litery
- while (istnieją przynajmniej 2 drzewa)
Z drzew t1 i t2 o najmniejszych prawdopodobieństwach p1 i p2 tworzymy nowe drzewo zawierające w korzeniu prawdopodobieństwo p1 p2 i mające t1 i t2 jako lewe i prawe poddrzewo. Przypisujemy 0 każdej lewej krawędzi i 1 każdej prawej krawędzi; - Tworzymy słowo kodowe dla każdej litery przechodząc drzewo od korzenia do liścia zawierającego prawdopodobieństwo stowarzyszone z tą literą i łącząc napotkane 0 i 1;
Przykład: Załóżmy, że chcemy zbudować kod Huffmana dla 4 literowego alfabetu V1 {a1 , a2 , a3 , a4 } przy czym P(a1 ) 0,1 , P(a2 ) 0, 2 , P(a3 ) 0, 3 , P(a4 ) 0, 4 .
Postępując zgodnie z podanym algorytmem Huffmana tworzymy drzewo pokazane na Rys. 1. Odczytany z tego drzewa kod Huffmana jest następujący:
a1 000 , a2 001
a3 01, a4 1.
Rys. 1. Tworzenie kodu Huffmana.
Metoda kompresji plików tekstowych oparta na wykorzystaniu kodu Huffmana jest bardzo prosta. Kodujemy kolejne litery wchodzące w skład tekstu za pomocą kodu Huffmana i tak uzyskane ciągi konkatenujemy. Warto przy tym przypomnieć, że kod Huffmana jest kodem prefiksowym, a więc jednoznacznie dekodowalnym.