2004
Poznańskie Warsztaty Telekomunikacyjne Poznań 9 - 10 grudnia 2004 Grzegorz Ulacha
Politechnika Szczecińska Wydział Informatyki ul. Żołnierska 49 71-210 Szczecin gulacha@wi.ps.pl
OPTYMALNE I SUBOPTYMALNE MIESZANE KODY HUFFMANA O KRÓTKIM CZASIE KONSTRUKCJI DRZEWA KODOWEGO
Streszczenie: W referacie zaprezentowano kilka propozycji zmniejszania czasu niezbędnego do konstrukcji drzewa zarówno optymalnego jak i suboptymalnego mieszanego kodu Huffmana. Porównano cechy kodów mieszanego i binarno-ternarnego. Przeprowadzono analizę także pod kątem opóźnień wprowadzanych przez kod mieszany.
1. WSTĘP
Do najefektywniejszych algorytmów entropijnych należą kodowanie arytmetyczne i kodowanie Huffmana [1, 2]. Ten drugi typ jest prosty do implementacji, a podstawowa wersja binarnego kodu Huffmana może być poddawana modyfikacji w celu zwiększenia efek- tywności kompresji. Dotychczasowe podejście np. po- przez tworzenie rozszerzonego kodu Huffmana, wiązało się z bardzo dużym wzrostem zapotrzebowania na pa- mięć niezbędną do prawidłowego działania kodera i dekodera. Przedstawiona w pracach [3-6] propozycja wykorzystania mieszanych kodów Huffmana pozwala na wyeliminowanie tej wady. Dla źródła S o n symbolach optymalnym mieszanym kodem Huffmana jest kod o najkrótszej średniej długości słowa kodowego Lmix, dla którego każdy z węzłów drzewa kodowego nie będący liściem może łą zyć dowolną liczbę 2 c ≤ ri ≤ n potom- ków. Dla uproszczenia kodu jako r przyjmuje się wy- łącznie liczby pierwsze. Do prawidłowego zapisu sym- boli kodowych wymagane jest używanie cyfr r-narnych (r wartościowych), które dla zachowania wysokiej efek- tywności ich zapisu łączy się w bloki po q cyfr i zamie- nia na binarną liczbę B:
∑
−=
⋅
= 1
0 q i
i ri
a
B (1)
którą można zapisać przy użyciu b(rq) bitów, gdzie:
1 log ) (
log2rq ≤b rq < 2rq + (2) Średnia liczba bitów niezbędna do zapisu jednej cyfry r-narnej wynosi wówczas:
q r r b
bq( )= ( q) (3)
Np. przy q = 5 potrzeba średnio 1.6 bita do zapisu jednej cyfry ternarnej (r = 3). Zdefiniujmy funkcję g(r) jako sumę prawdopodobieństw pwi wszystkich nr węzłów ri-narnych w mieszanym drzewie kodowym:
∑
== r
i
n i
pw
r g
1
)
( (4)
Wtedy średnia długość słowa kodu mieszanego wynosi:
∑
−(
=
⋅
= 1
0
) ( ) (
m i
i q i
mix g r b r
L
)
(5) Gdzie m jest liczbą wszystkich różnych elementów ri-narnych występujących w danym kodzie mieszanym.Dokładniejsze informacje dotyczące konstrukcji, efek- tywności i doboru parametrów q można znaleźć w pracy [6].
2. BINARNO-TERNARNY KOD HUFFMANA W pracy [4] został przedstawiony sposób obliczania liczby iteracji potrzebnych do wyznaczenia drzewa optymalnego mieszanego kodu Huffmana metodą po- równań. Jest to metoda o wykładniczej złożoności zależ- nej od liczby n symboli źródła, która wymaga porówna- nia średniej długości słowa kodowego Lmix wszystkich drzew mieszanych możliwych do utworzenia z n elementów. Liczbę porównań D można oszacować przy pomocy przybliżonego wzoru:
D≈33⋅(1.794)n−8 (6) Praktyczna realizacja algorytmu poszukiwania optymal- nego mieszanego kodu Huffmana nie wymaga tworzenia od początku każdego drzewa, tak aby wyliczyć średnią długość słowa kodowego. Jest to autorska propozycja tzw. szybkiej rekurencji z parametrami globalnymi, www.pwt.et.put.poznan.pl
PWT 2004, Poznań 9 - 10 grudnia 2004
1
dzięki czemu nie trzeba przekazywać parametrów do wywoływanej rekurencyjnie funkcji. W ten sposób aktu- alnie wyznaczany wynik Lmix częściowo zależy od po- przednio wyliczonych wartości składowych. Program napisany w języku C testowany na komputerze klasy Pentium III 500 MHz wykonywał 406222 porównania na sekundę (pomiar wykonany dla n = 20). Co oznacza, że na podstawie zależności (6) już dla n = 38 symboli potrzebowalibyśmy około godziny, aby znaleźć opty- malne drzewo kodowe. Jest to główna wada tej propozy- cji poszukiwania optymalnych mieszanych kodów Huffmana (w odniesieniu do wydajności obecnie stoso- wanych procesorów przy n ≤ 256). Zmniejszenie liczby porównań jest możliwe dzięki ograniczeniu zbioru war- tości r do dwóch elementów r = {2, 3}. Kod mieszany staje się kodem binarno-ternarnym, co wiąże się z moż- liwością uzyskania nieznacznie mniejszej efektywności, natomiast liczba porównań D zmniejsza się do [7]:
618 1
. 5 1
2 5 1 2
5 1
≈ −
− −
+
= n
n n
D (7)
Wartość D dla źródła o n symbolach jest w tym przy- padku n-tym wyrazem ciągu Fibbonaciego. Omawiany powyżej program potrzebował około godziny (na kom- puterze klasy Pentium III 500 MHz), aby wyznaczyć optymalny kod mieszany dla źródła o n = 38 symbolach.
W przypadku kodu binarno-ternarnego jest to niecałe 97 sekund. Ale już dla n = 44 symboli czas zwiększa się do prawie 30 minut. Zatem dla źródeł o dużej liczbie sym- boli nawet algorytm poszukiwania optymalnego kodu binarno-ternarnego okazuje się mało praktyczny. Istnieje jednak wiele zastosowań, w których stosuje się prefik- sowe kody Huffmana o małej liczbie symboli [8]. Jed- nym z przykładów może być kodowanie elementów DC w algorytmie JPEG. W pracy [5] zastosowano kod bi- narno-ternarny uzyskując średni wzrost efektywności kompresji o ponad 1% (względem binarnego kodu Huffmana) dla 12 obrazów testowych. Skrócenie czasu konstrukcji drzewa jest możliwe także dzięki użyciu kodów suboptymalnych.
Przykład 1
Dane jest źródło S składające się z n = 20 symboli o rozkładzie przedstawionym w tabeli 1, w której znaj- dują się także zestawy słów binarnego, binarno- ternarnego i mieszanego kodu Huffmana. Rysunek 1 przedstawia kształt drzewa dla mieszanego kodu Huffmana. Średnia długość słowa kodu binarnego wyno- si L2 = 3.762 co przy entropii tego źródła równej H(S) = 3.72255 bita na symbol daje procentową efek- tywność na poziomie E2 = 98.95126%. Jeżeli użyjemy kodu mieszanego z daną klasą (zestawem parametrów o danych ograniczeniach): r0 = 2, r1 = 3, r2 = 5, r3 = 7, q1 = 41, q2 = 31, q3 = 16, to otrzymamy średnią długość kodu mieszanego równą:
+ + ⋅
+ + +
⋅
= (3)
1000
111 335 332 1 1000
1000 333
q
mix b
L
=
⋅ +
⋅
+ (7)
1000 ) 111 5 1000 (
112
q
q b
b
) 7 ( 111 . 0 ) 5 ( 112 . 0 ) 3 ( 778 . 1 333 .
0 q q q
mix b b b
L = + ⋅ + ⋅ + ⋅
Dla klasy zdefiniowanej w przykładzie daje to średnią Lmix = L2,3,5,7 = 3.72410, co odpowiada efektywności Emix = 99.95836%. Ograniczenie kodu mieszanego do binarno-ternarnego kodu Huffmana z daną klasą: r0 = 2, r1 = 3, q1 = 41 spowoduje tylko nieznaczny wzrost śred- niej długości kodu mieszanego równej:
) 3 ( 427 . 1 464 .
3 1
,
2 bq
L = + ⋅
Dla zdefiniowanej wyżej klasy daje to średnią L2,3 = 3.72632 co odpowiada efektywności E2,3 = 99.89881%.
3. SUBOPTYMALNY KOD MIESZANY ZE STAŁYM OPÓŹNIENIEM
Zapis słów kodowych możliwy jest na dwa sposoby.
Pierwszym z nich jest kod, w którym najpierw podda- wany jest kompresji cały ciąg danych, a następnie w pliku wynikowym po nagłówku umieszcza się kolejne zakodowane bufory r-narne (ciągi liczb B). Drugi sposób polega na przeplataniu danych binarnych i r-narnych w strumieniu wynikowym, co może być przydatne w przypadku transmisji danych czasu rzeczywistego.
Użycie liczb B wprowadza opóźnienie transmisji, gdyż dekoder już w momencie pojawienia się pierwszego słowa kodu zawierającego choć jedną cyfrę ri-narną (w ogólności f cyfr ri-narnych), powinien mieć dostęp do pierwszej liczby Bi (czyli także do przyszłych q – f cyfr ri-narnych), tak aby móc odczytać (po zdekodowaniu liczby Bi) niezbędnych f cyfr ri-narnych. Ponieważ wraz z każdym słowem kodowym pojawia się średnio g(r) cyfr r-narnych, to w sytuacji gdy q > g(r) koder wpro- wadza opóźnienie, gdyż musi zapisać q cyframi najwol- niej zapełniający się bufor r-narny i dopiero po zakodo- waniu tych cyfr w liczbę B, wysyła ją do odbiorcy (po- dobnie dzieje się z innymi wcześniej zakodowanymi liczbami Bi o większej częstości występowania cyfr ri- narnych). Opóźnienie wyrażone jako stosunek (q – g(r)) cyfr r-narnych do średniej liczby g(r) cyfr r-narnych pojawiających się w każdym kolejnym słowie kodu jest zdefiniowane jako średnia liczba symboli wejściowych, które należy wczytać, aby zapełnić ri-narny bufor liczby Bi:
) 1 ) (
( = −
r g r q
T (8)
Aby uprościć zasadę opisanej powyżej transmisji i zmniejszyć wprowadzane średnie opóźnienie można utworzyć suboptymalny kod dwubuforowy, gdzie oprócz strumienia binarnego będzie tylko jeden dodatkowy bufor r-narny. Przykładem takiego kodu jest optymalny kod binarno-ternarny opisywany w punkcie 2. Jeśli jed- nak cyfry r-narne pojawiają się dość rzadko, czyli gdy wartość g(r) jest bardzo mała, to i tak opóźnienie śred- nie, które jest odwrotnie proporcjonalne do g(r), może być zbyt duże. Aby temu zapobiec, można przedstawić zasadę dla kodu suboptymalnego zgodnie z definicją:
www.pwt.et.put.poznan.pl
PWT 2004, Poznań 9 - 10 grudnia 2004
2
Tab. 1 Zestaw tabel kodowych dla źródła z przykładu 1
pi Kod mieszany Kod
binarno-ternarny Kod binarny p1 = 0.015 03 23 07 23 12 02 03 02 001100 p2 = 0.015 03 23 17 23 12 02 03 12 001101 p3 = 0.016 03 23 27 23 12 02 13 02 001110 p4 = 0.016 03 23 37 23 12 02 13 12 001111 p5 = 0.016 03 23 47 23 12 02 23 02 101000 p6 = 0.016 03 23 57 23 12 02 33 12 101001 p7 = 0.017 03 23 67 03 02 12 12 02 00000 p8 = 0.022 23 23 05 03 02 12 12 12 00001 p9 = 0.022 23 23 15 23 12 12 02 02 00010 p10 = 0.022 23 23 25 23 12 12 02 12 00011 p11 = 0.023 23 23 35 23 12 12 12 02 00100 p12 = 0.023 23 23 45 23 12 12 12 12 00101 p13 = 0.037 23 03 03 03 02 02 02 10101 p14 = 0.037 23 03 13 03 02 02 12 10110 p15 = 0.037 23 03 23 03 02 12 02 10111
p16 = 0.110 03 03 13 03 010
p17 = 0.111 03 13 13 13 011
p18 = 0.112 23 13 13 23 100
p19 = 0.166 13 02 03 12 110
p20 = 0.167 13 12 23 02 111
p
16p
17p
1p
2p
3p
4p
5p
6p
7p
19p
20p
13p
14p
15p
18p
8p
9p
10p
11p
12Rys. 1 Drzewo mieszanego kodu Huffmana dla źródła z przykładu 1 www.pwt.et.put.poznan.pl
PWT 2004, Poznań 9 - 10 grudnia 2004
3
Definicja 1. Kod mieszany pierwszego rzędu to taki kod, w którym korzeń drzewa kodowego łączy ze sobą r > 2 potomków (korzeń niebinarny), natomiast pozostałe węzły drzewa kodowego posiadają wyłącznie dwóch potomków. Wówczas g(r) = 1.
Kod mieszany pierwszego rzędu charakteryzuje stałe opóźnienie wynoszące q − 1 symboli wejściowych. Wy- nika to z faktu, iż każde słowo kodowe zawiera na po- czątku cyfrę r-narną, a do wysłania liczby B potrzeba właśnie q cyfr r-narnych.
4. KOD MIESZANY O MAŁYM OPÓŹNIENIU Tworząc subobtymalny kod mieszany pierwszego rzędu o r potomkach w korzeniu można także sprawdzić, czy użycie elementu r-narnego dla pozostałych węzłów pozwoli na dalsze skrócenie średniej długości słowa kodowego. Można w tym celu skorzystać z uproszczenia metody kolejnych uściśleń ograniczając test do dwóch możliwości: węzeł binarny lub r-narny (gdzie r zostało wcześniej ustalone dla korzenia). Metoda ta polega na budowie drzewa binarnego kodu Huffmana do momentu, aż pozostanie r elementów (symboli pierwotnego źródła lub węzłów będących korzeniami poddrzew binarnych).
Pozostałe r elementów łączymy węzłem r-narnym (który staje się korzeniem drzewa głównego) i wyznaczamy średnią Lmix takiego drzewa kodowego. Wybieramy tę wartość r, dla której uzyskamy najkrótszą średnią Lmix. W ten sposób uzyskujemy kod mieszany pierwszego rzędu. Następnie wykonujemy rekurencyjnie podobną operację dla każdego z poddrzew, ale mając już tylko dwie możliwości: korzeń poddrzewa binarny lub r-narny, itd. Dla kodów optymalnych (w danej klasie kodów dwubuforowych) procentowy udział niebinarne- go korzenia jest mniejszy niż dla kodów mieszanych pierwszego rzędu, gdyż suma opłacalności (suma zy- sków między zastosowaniem węzłów r-narnych zamiast binarnych) użycia wielu węzłów r-narnych w różnych częściach drzewa kodu mieszanego może sprawiać, że w korzeniu n e tak często będzie występowało więcej niż dwóch potomków. i
Taki dwubuforowy kod o małym opóźnieniu może być stosowany w transmisji danych czasu rzeczywistego, gdzie dane pojawiają się na wejściu kodera na bieżąco.
Jeśli szukamy kompromisu między złożonością kodera, średnim opóźnieniem oraz efektywnością kodu, to po- winniśmy wybrać jeden spośród tych kodów dwubufo- rowych o r-narnym korzeniu, których efektywność jest wyższa od efektywności binarnego kodu Huffmana.
Poszukiwanie optymalnego kodu dwubuforowego wy- maga wyznaczenia średniej długości słowa kodowego dla D(r) kodów mieszanych z korzeniem r-narnym, których liczbę można obliczyć ze wzoru:
∑
=
− − ⋅ −
= h
j j
r j r r n
D
0
) 2 ) (
( (9)
gdzie h wynosi:
−
= − 1 r
r
h n (10)
Dodatkowe węzły r-narne nie tylko zwiększają efektyw- ność kompresji, ale zmniejszają także średnie opóźnienie kodera, które jest nie większe niż q − 1 symboli wej- ściowych. Kod mieszany pierwszego rzędu, posiadają- cy potomne węzły r-narne (o dowolnym r), charaktery- zuje się zmiennym średnim opóźnieniem kodera Tśr = max {T(r1), T(r2),..., T(rk)}. Dla źródła z przykładu 1 otrzymano kod binarno-ternarny, dla którego g(3) = 1.427, czyli Tśr = T(3) = 27.73, oraz kod miesza- ny, dla którego g(3) = 1.778, g(5) = 0.112, g(7) = 0.111, wówczas Tśr = T(7) = 98.10.
5. WNIOSKI
W referacie zaprezentowano własności mieszanego kodu Huffmana, który pozwala dla zdecydowanej więk- szości źródeł uzyskać efektywność wyższą od binarnego kodu Huffmana. Poprawa efektywności nie wiąże się dla kodera i dekodera z dużym wzrostem wymagań pamię- ciowych, co ma miejsce np. dla rozszerzonych kodów Huffmana. Główną wadą propozycji jest wykładnicza zależność czasu potrzebnego do wyznaczenia optymal- nego kodu mieszanego od liczby symboli źródła. W referacie przedstawiono kilka propozycji zmniejszania czasu niezbędnego do budowy drzewa zarówno opty- malnego jak i suboptymalnego mieszanego kodu Huffmana. Jedną z propozycji jest kod binarno-ternarny, którego cechy porównano na przykładzie z optymalnym mieszanym kodem Huffmana. Przeprowadzono analizę także pod kątem opóźnień wprowadzanych przez kod mieszany, pozostawiając użytkownikowi ostateczny dobór metody kodowania, zależny od wymagań systemu, w którym będzie ona wykorzystywana.
SPIS LITERATURY
. K. Sayood Kompresja danych – wprowadzenie,
2. resji danych,
3. siński, G. Ulacha „Huffman codes revis-
4. ko-
5. ości kompresji JPEG
6. ieszanych kodów
7. ang „Almost asymptotically optimal flag
8. itor) Lossless Compression Hand- 1
Wydawnictwo RM, Warszawa 2002 A. Drozdek Wprowadzenie do komp
Wydawnictwa Naukowo-Techniczne, Warszawa 1999
R. Sta
ited”, Proceedings of 24th Symposium of Informa- tion Theory in The Benelux, Veldhoven 2003 G. Ulacha „Analiza konstrukcji optymalnych dów mieszanych”, Materiały VIII Sesji Naukowej Informatyki Wydziału Informatyki Politechniki Szczecińskiej, Szczecin 2003
G. Ulacha „Wzrost efektywn
– algorytm szybkiego dekodera liczb ternarnych”, Materiały VI konferencji Reprogramowalne Ukła- dy Cyfrowe, Szczecin 2003
G. Ulacha „Efektywność m
Huffmana”, Materiały konferencyjne VIII Poznań- skich Warsztatów Telekomunikacyjnych, Poznań 2003
M. W
encoding of the integers”, IEEE Transactions on Information Theory, vol. 34, no. 2, s. 324-326, marzec 1988
K. Sayood (ed
book, Academic Press USA, 2003 www.pwt.et.put.poznan.pl
PWT 2004, Poznań 9 - 10 grudnia 2004