• Nie Znaleziono Wyników

Grzegorz Ulacha, METODY TWORZENIA EFEKTYWNYCH ROZSZERZONYCH KODÓW HUFFMANA O MAŁYCH WYMAGANIACH PAMIĘCIOWYCHPolitechnika Szczecińska, Wydział Informatyki

N/A
N/A
Protected

Academic year: 2021

Share "Grzegorz Ulacha, METODY TWORZENIA EFEKTYWNYCH ROZSZERZONYCH KODÓW HUFFMANA O MAŁYCH WYMAGANIACH PAMIĘCIOWYCHPolitechnika Szczecińska, Wydział Informatyki"

Copied!
6
0
0

Pełen tekst

(1)

2003

Poznañskie Warsztaty Telekomunikacyjne

Poznañ 11-12 grudnia 2003 Grzegorz Ulacha Politechnika SzczeciĔska Wydziaá Informatyki ul. ĩoánierska 49 71-210 Szczecin gulacha@wi.ps.pl

METODY TWORZENIA EFEKTYWNYCH ROZSZERZONYCH KODÓW

HUFFMANA O MA

àYCH WYMAGANIACH PAMIĉCIOWYCH

Streszczenie: W artykule przedstawiono propozycjĊ zwiĊk-szenia efektywnoĞci podstawowego binarnego kodu Huffmana. DziĊki wprowadzeniu wielu buforów Bi i uĪyciu

czĊĞciowo rozszerzonego kodu Huffmana, moĪemy uzyskaü wysoką efektywnoĞü kompresji przy zachowaniu przez koder i dekoder maáych wymagaĔ pamiĊciowych. Dla kaĪ-dego z buforów Bi traktowanych jako ciąg bitów dobierane są optymalne parametry i typ kompresji. W kolejnych punktach przeprowadzona zostaáa analiza trzech typów kompresji strumieni binarnych (rozszerzony kod Huffma-na, kod Tunstala-HuffmaHuffma-na, kod Golomba).

1. WSTĉP

W tej pracy zostanie zaproponowane nowe podej-Ğcie do zwiĊkszenia efektywnoĞci binarnego kodu Huffmana [1, 5, 7]. MoĪemy przyjąü, Īe dla bezpamiĊ-ciowego Ĩródáa záoĪonego z niezaleĪnych symboli ze zbioru S (np. zbioru bajtów), kod Huffmana jest opty-malny w klasie kodów jednoznacznie dekodowalnych [6]. JednoczeĞnie zachodzi dla tego kodu nastĊpująca zaleĪnoĞü miĊdzy entropią H(S), a Ğrednią dáugoĞcią sáowa kodowego L, którą przedstawiá Gallager w [12]:

H(S)d L < H(S) + pmax + V (1) GdzieV = 1  log2e + log2(log2e) = 0.08607 dla symbolu o najwiĊkszym prawdopodobieĔstwie pmax < 0.5 oraz V = 0 w przeciwnym przypadku. Dla binarnego kodu Huffmana pojawia siĊ problem maáej efektywnoĞci E, gdy symbol Ĩródáa o najwiĊkszym prawdopodobieĔstwie

p1 jest wiĊkszy od 0.5. Przy czym procentową efektyw-noĞü kodu Huffmana moĪemy zdefiniowaü jako zaleĪ-noĞü entropii i Ğredniej dáugoĞci sáowa kodowego [7, 8]:

% 100 ) ( ˜ L S H E (2) W kolejnych punktach zostaną przedstawione propozy-cje rozwiązania tego problemu.

Przykáad 1

Dane jest Ĩródáo S = {a, b, c}. Tabela 1 przedstawia rozkáad prawdopodobieĔstwa wystĊpowania symboli i odpowiadający im kod Huffmana. Wynika z niej, Īe optymalny kod Huffmana moĪe mieü róĪną postaü (a takĪe róĪne wáasnoĞci, które zostaną opisane w kolej-nych punktach).

Tab. 1 Kod Huffmana dla Ĩródáa z przykáadu 1 Symbole pi Kod Huffmana I Kod Huffmana II

c 0.80 1 1

b 0.16 01 00

a 0.04 00 01

ĝrednia dáugoĞü sáowa kodowego wynosi:

L = 0.8 + 2˜(0.16 + 0.04) = 1.2 Daje to efektywnoĞü zaledwie E = 72.19281%.

2. ROZSZERZONY KOD HUFFMANA ZwiĊkszenie efektywnoĞci jest moĪliwe przez stwo-rzenie rozszerzonego kodu Huffmana. Zakáadamy, iĪ symbole Ĩródáa S stanowią zbiór K zdarzeĔ elementar-nych. Wówczas moĪemy stworzyü np. Ĩródáo S(2) skáada-jące siĊ ze wszystkich moĪliwych par symboli (bloków symboli) przyjmując jednoczeĞnie, Īe dla Ĩródeá bezpa-miĊciowych prawdopodobieĔstwo wystąpienia danej pary jest równe iloczynowi prawdopodobieĔstw symboli tworzących daną parĊ [1, 7]. NastĊpnie dla Ĩródáa S(2) tworzymy kod Huffmana. Tabela 2 zawiera rozszerzony kod Huffmana dla par symboli z przykáadu 1. DziĊki temu uzyskujemy Ğrednią L(2)= 0.9112 bitu na symbol, co daje wzrost efektywnoĞci do E(2) = 95.07394%. Mo-Īemy zwiĊkszyü dáugoĞü bloku do trzech symboli two-rząc Ĩródáo S(3) zawierające wszystkie trójki symboli. Otrzymujemy kod Huffmana zawarty w tabeli 3, który daje Ğrednią dáugoĞü sáowa kodowego L(3) = 0.87554. Dla takiego kodu skáadającego siĊ z 27 elementów

(2)

blo-kowych (symboli rozszerzonego Ĩródáa) efektywnoĞü wzrasta aĪ do E(3) = 98.94607%.

Tab. 2 Kod Huffmana dla Ĩródáa S(2) z przykáadu 1 Kod blokowy pi Kod binarny

cc 0.64 0 cb 0.128 10 bc 0.128 110 ca 0.032 11100 ac 0.032 11101 bb 0.0256 11110 ba 0.0064 111110 ab 0.0064 1111110 aa 0.0016 1111111

Tab. 3 Kod Huffmana dla Ĩródáa S(3) z przykáadu 1 Kod blokowy pi Kod binarny

ccc 0.512 0 bcc 0.1024 100 cbc 0.1024 101 ccb 0.1024 110 cca 0.0256 111100 cac 0.0256 111101 acc 0.0256 111110 cbb 0.02048 111000 bcb 0.02048 111001 bbc 0.02048 111010 bca 0.00512 11101100 bac 0.00512 11101101 abc 0.00512 11101110 cba 0.00512 11111100 cab 0.00512 11111101 acb 0.00512 11111110 bbb 0.004096 111111110 aac 0.00128 1111111110 caa 0.00128 1110111100 aca 0.00128 1110111101 bba 0.001024 1110111110 bab 0.001024 1110111111 abb 0.001024 11111111110 baa 0.000256 1111111111100 aba 0.000256 1111111111101 aab 0.000256 1111111111110 aaa 0.000064 1111111111111 Ogólnie Ğrednia dáugoĞü sáowa kodowego L(n) dla kodu rozszerzonego do bloków skáadających siĊ z n symboli jest ograniczona nastĊpującą zaleĪnoĞcią [1]:

V    dLn H S pn S H( ) ( ) ( ) max (3) GdzieV = 1  log2e + log2(log2e) = 0.08607 dla symbolu o najwiĊkszym prawdopodobieĔstwie pmaxn 0.5 oraz V = 0 w przeciwnym przypadku. W przypadku praktycznej realizacji nagáówek pliku dla kodu rozszerzonego zawie-ra tylko pzawie-rawdopodobieĔstwa (lub licznoĞci) symboli

pierwotnego Ĩródáa S. Jednak koder i dekoder mają znacznie wiĊksze wymagania pamiĊciowe, aby na pod-stawie tych prawdopodobieĔstw stworzyü i przechowy-waü tabelĊ rozszerzonego kodu Huffmana. Dla bloków skáadających siĊ z n elementów potrzeba Kn sáów kodo-wych Ĩródáa S(n). Gdzie K jest liczbą symboli Ĩródáa S. Np. gdy Ĩródáo jest zestawem bajtów, czyli dla K = 256 juĪ przy n = 5 mamy 240 sáów kodowych. Oznacza to maáą praktycznoĞü przedstawionej metody dla duĪych wartoĞci K.

3. PROPOZYCJA CZĉĝCIOWEGO ROZSZERZENIA KODU HUFFMANA Metoda tworzenia czĊĞciowo rozszerzonego Ĩródáa opiera siĊ na podziale pierwotnych sáów kodu Huffmana na wiele buforów. Pierwsza propozycja podziaáu na wiele buforów zostaáa zaproponowana przez autora w pracach [8, 9]. Na początku tworzymy binarny kod Huffmana (nazywany dalej podstawowym kodem Huffmana), który ma K1 wĊzáów. KaĪdemu wĊzáowi moĪe odpowiadaü osobny bufor. Rozpatrzmy kod Huffmana I z przykáadu 1, w którym K = 3, zatem istnie-ją dwa wĊzáy w1 i w2. Wierzchoáek drzewa kodowego w1 ma potomków o prawdopodobieĔstwach p(1) = 0.8 i

p(0) = 0.2. WĊzeá w2 takĪe ma potomków o prawdopo-dobieĔstwach: 8 . 0 ) 1 ( 0.160.160.04 p , p(0) 0.160.040.04 0.2. Jak widaü istnieje moĪliwoĞü dalszej kompresji takich symboli, gdyĪ entropia binarnego ciągu wyraĪona wzorem (4) wynosi: ) 0 ( log ) 0 ( ) 1 ( log ) 1 ( 2 2 01 p p p p H  ˜  ˜ (4)

Czyli w obu wĊzáach mamy H01 = 0.721928, co daje szansĊ na dalszą kompresjĊ. NaleĪy jedynie dobraü od-powiednią efektywną metodĊ kompresji ciągów binar-nych, przy czym w kolejnych punktach zostanie przed-stawionych kilka takich metod. JednoczeĞnie naleĪy zwróciü uwagĊ, iĪ dla danego Ĩródáa nie kaĪdy kod Huffmana daje identyczny rozkáad prawdopodobieĔstw wystĊpowania zer i jedynek w ciągu wynikowym. Dla caáego strumienia wynikowego powstaáego z kodu o K symbolach prawdopodobieĔstwo wystąpienia jedynki w ciągu wynikowym P(1) wyznaczamy ze wzoru (5):

¦

¦

¦

˜  ˜ ˜ K i i i K i i i K i i i f p f p f p P 1 1 1 ) 0 ( ) 1 ( ) 1 ( ) 1 ( (5)

Gdzie fi(1) ( fi(0) ) oznacza liczbĊ jedynek (zer) w sáowie kodowym reprezentującym i-ty symbol. Wówczas P(0) = 1 – P(1). Dla kodu Huffmana I mamy:

8 . 0 ) 1 ( ) 2 04 . 0 16 . 0 ( ) 16 . 0 8 . 0 ( 16 . 0 8 . 0 ˜     P oraz P(0) 10.8 0.2

(3)

Natomiast dla kodu Huffmana II mamy P(1) = 0.7, P(0) = 0.3. Im wiĊksza róĪnica P(1)P(0) , tym mniejsza wartoĞü entropii H01. Zatem tworząc drzewo Huffmana dla Ĩródáa S naleĪy dla kaĪdego wĊzáa stosowaü zasadĊ, Īe przypisujemy „1” bardziej prawdopodobnemu po-tomkowi, czyli p(1)t p(0), wtedy p(1) t 0.5 [4]. DziĊki tej zasadzie otrzymamy optymalne drzewo Huffmana o optymalnych parametrach w kaĪdym wĊĨle, czyli o mak-symalnej wartoĞci P(1).

Na podstawie prawdopodobieĔstw potomków dobieramy odpowiedni kod dla kaĪdego z wĊzáów wi (buforów Bi). Dla przykáadu 1 (zgodnie z tabelą kodową Huffman I) moĪemy stworzyü 2 bufory B1 i B2 (dla wĊzáów w1 i w2). Np. zapisując symbol b któremu odpowiada kod „01” najpierw bit „0” zapisujemy do bufora B1, a nastĊpnie bit „1” do bufora B2. Po zakodowaniu caáego strumienia danych, przystĊpujemy do kodowania strumieni Bi jed-nym z algorytmów entropijnej kompresji ciągów binar-nych. NastĊpnie tworzymy plik skáadający siĊ z K licz-noĞci symboli Ĩródáa S, a po nim umieszczamy kolejno zakodowane bufory Bi.

4. ROZSZERZONY KOD HUFFMANA DLA ħRÓDEà BINARNYCH

Na podstawie propozycji przedstawionych w po-przednim punkcie, moĪemy siĊ skupiü na Ĩródáach bi-narnych S01 (záoĪonych z symboli d = „0” i e = „1”), bo tak naleĪy interpretowaü bufory Bi. RozwaĪmy zatem kod rozszerzony do pary bitów S01(2) = {ee = „11”, ed = „10”, de = „01”, dd = „00”}. W dalszej czĊĞci tej pracy dla Ĩródáa S01wprowadzone zostaną oznaczenia p = p(1) oraz q = 1 – p.ĝrednia dáugoĞü sáowa kodowego L01 (a wáaĞciwie Ğrednia dáugoĞü pojedynczej cyfry binarnej po zakodowaniu) dla Ĩródáa S01(2) wynosi L01 = 1, gdy

618034 . 0 2 1 5 d 

p . W przeciwnym przypadku jest mniejsza i jako funkcja zaleĪna od p wynosi L01 =

2

3pp2 . Wykres zaleĪnoĞci L

01 od p przedstawia prze-rywana linia na rysunku 2. W takim przypadku koder wymaga maksymalnie K’ = (K1)˜22 symboli kodu czĊ-Ğciowo rozszerzonego. JeĞli uĪyjemy tej metody do zakodowania Ĩródáa z przykáadu 1, to wystarczy jedynie 8 symboli. PoniewaĪ jednak rozkáad prawdopodobieĔstw w wĊzáach w1 i w2 jest identyczny, to wystarczy jedna wspólna tabela kodowa (patrz tabela 4). Otrzymamy wówczasĞrednią dáugoĞü sáowa kodu w wĊzáach w1 i w2 równą L01 = 0.78. Wówczas caákowita Ğrednia dáugoĞü sáowa kodowego wynosi:

¦

 ˜ 1 1 01( ) ) ( K i i i L w w p L (6) L = 1˜0.78 + 0.2˜0.78 = 0.936, co daje efektywnoĞü E = 92.25549%. MoĪemy zwiĊkszyü liczbĊ symboli w bloku do trzech (patrz tabela 5). Wówczas dla Ĩródáa S01(3) mamy Ğrednią dáugoĞü sáowa kodowego L = 0.8736, co daje efektywnoĞü E = 99.16595%. Przy uĪyciu jedynie 16 symboli uzyskano efektywnoĞü wyĪszą niĪ przy

za-stosowaniu bloków trzyelementowych dla w peáni roz-szerzonego kodu Huffmana omówionego w punkcie 2 (gdzie kod rozszerzony skáadaá siĊ z 27 symboli).

Tab. 4 Kod Huffmana dla Ĩródáa S01(2) z przykáadu 1 Kod blokowy pi Kod binarny

ee 0.64 0

ed 0.16 10

de 0.16 110

dd 0.04 111

Tab. 5 Kod Huffmana dla Ĩródáa S01(3) z przykáadu 1 Kod blokowy pi Kod binarny

eee 0.512 0 dee 0.128 100 ede 0.128 101 eed 0.128 110 edd 0.032 11100 ded 0.032 11101 dde 0.032 11110 ddd 0.008 11111

Dla bloków skáadających siĊ z n elementów binar-nych potrzeba K’ = (K1)˜2n symboli kodowych Ĩródáa

) (n

S01 . Tworzenie takiego kodu jest proste. Algorytm rozkáadu prawdopodobieĔstw oparty jest na wartoĞciach trójkąta Pascala. PrawdopodobieĔstwa symboli są posor-towane: qnd p1˜qn-1d p2˜qn-2d ... d pn-1˜q1d pn

. A symbo-li o takich prawdopodobieĔstwach jest odpowiednio

¸¸ ¹ · ¨¨ © § ¸¸ ¹ · ¨¨ © §  ¸¸ ¹ · ¨¨ © § ¸¸ ¹ · ¨¨ © § ¸¸ ¹ · ¨¨ © § n n n n n n n , 1 ,..., 2 , 1 ,

0 . Jak wynika z analizy przy-káadu 1, wraz ze wzrostem liczby n elementów w bloku wzrasta teĪ efektywnoĞü kompresji. Nie jest to w peáni sáuszne stwierdzenie, co widaü na podstawie rysunku 1 przedstawiającego zaleĪnoĞü Ğredniej dáugoĞci sáowa kodowego L01 od prawdopodobieĔstwa p, dla bloków trzyelementowych (linia kropkowana) oraz dla bloków czteroelementowych (linia ciągáa). W związku z tym moĪna rozbudowaü koder o znajdowanie minimum Ğred-niej dáugoĞci sáowa kodowego L dla kolejnych wartoĞci

n wprowadzając np. ograniczenie do n d 4 lub n d 8. Takie porównanie zawiera tabela 6. Natomiast rysunek 2 przedstawia wykres entropii (linia kropkowana), mini-malną dáugoĞü L01 przy zaáoĪeniu, Īe n d 8 (linia ciągáa) oraz dáugoĞü L01 dla n = 2 (linia przerywana), w zaleĪno-Ğci od parametru p. Omówioną propozycjĊ moĪemy oznaczyü skrótem „EH” (Extended Huffman). Jak wynika z tabeli 6 dopiero dla p > 0.9 mamy pewnoĞü, wartoĞü L jest najmniejsza przy najwiĊkszym testowanym rozmiarze bloku (n = 8).

Dla ograniczenia n d 8 moĪemy wyznaczyü maksymalną liczbĊ symboli kodowych, gdy np. Ĩródáo jest zestawem bajtów (K = 256), równą zaledwie K’ = 255˜28 = 65280. Jest to wartoĞü mniejsza niĪ w przypad-ku peánego rozszerzonego kodu Huffmana dla par baj-tów.

(4)

Rys. 1 ZaleĪnoĞü Ğredniej dáugoĞci sáowa kodowego L01 od p (n = 3 - linia kropkowana; n = 4 - linia ciągáa)

Rys. 2 ZaleĪnoĞü Ğredniej dáugoĞci sáowa kodowego L01 od p (n = 2 - linia przerywana; min L01 dla n d 8 - linia ciągáa; wartoĞü entropii - linia kropkowana)

Tab. 6 ZaleĪnoĞü Ğredniej dáugoĞci sáowa kodowego od parametrów p oraz n p n (nd4) L (nd4) n (nd8) L (nd8) H01 0.55 4 0.99991 8 0.99654 0.99277 0.60 4 0.98120 8 0.97444 0.97095 0.65 3 0.94929 5 0.93752 0.93407 0.70 4 0.89180 7 0.88447 0.88129 0.75 4 0.81836 8 0.81576 0.81128 0.80 3 0.72800 6 0.72525 0.72193 0.85 4 0.61997 5 0.61439 0.60984 0.90 4 0.49255 6 0.47016 0.46900 0.95 4 0.36719 8 0.29877 0.28640 0.97 4 0.31923 8 0.22655 0.19439 0.98 4 0.29578 8 0.19106 0.14144 0.99 4 0.27270 8 0.15716 0.08079

5. ZASTOSOWANIE KODU TUNSTALA DLA ħRÓDEà BINARNYCH

Konstrukcja zmodyfikowanego kodu Tunstala dla Ĩródáa

S01 = {d, e} umoĪliwia uzyskanie nieco lepszego rezulta-tu, niĪ w przypadku rozszerzonego kodu Huffmana przedstawionego w poprzednim punkcie. Do tej pory zestaw sáów rozszerzonego Ĩródáa binarnego skáadaá siĊ z k = 2n bloków, kaĪdy o staáej dáugoĞci równej n. W przypadku kodu Tunstala w kaĪdej iteracji zastĊpujemy symbol s o najwyĪszym prawdopodobieĔstwie parą symboli „sd” oraz „se”. Po kaĪdej takiej operacji liczba symboli rozszerzonego Ĩródáa wrasta o jeden. NastĊpnie sortujemy symbole wedáug rosnących prawdopodo-bieĔstw i rozpoczynamy kolejną iteracjĊ. Po zastosowa-niu takiego algorytmu moĪemy dla powstaáych symboli stworzyü wtórny kod Huffmana, a nastĊpnie zapisaü bufory Bi do pliku zgodnie z opisem z punktu 3. Rysu-nek 3 przedstawia porównanie kodu czĊĞciowo rozsze-rzonego przy pomocy „blokowego” kodu Huffmana dla

n = 2 (co odpowiada k = 4) z kodem czĊĞciowo rozsze-rzonym przy uĪyciu poáączenia kodu Tunstala i kodu Huffmana dla k = 4. Poáączenie tych metod moĪemy oznaczyü jako „TH”. Pierwsze kroki tworzenia tabeli kodowej dla danych z przykáadu 1 zawiera tabela 7. Do wyznaczenia Ğredniej dáugoĞci sáowa kodowego L01 (Ğredniej liczby bitów potrzebnej do zakodowania jedne-go bitu ze strumienia Bi) naleĪy posáuĪyü siĊ nastĊpują-cym wzorem [3]: ¦ ˜ ¦ ˜ k i i i k i i i n p l p L 1 1 01 (7)

Tab. 7 Kolejne kroki tworzenia kodu Tunstala

k = 3 pi k = 4 pi k = 5 pi ee 0.64 eee 0.512 eeee 0.4096 d 0.20 d 0.200 d 0.2000 ed 0.16 ed 0.160 ed 0.1600 eed 0.128 eed 0.1280 eeed 0.1024 Gdzie li jest liczbą bitów wtórnego kodu Huffmana re-prezentującego i-ty symbol kodu Tunstala, natomiast ni okreĞla liczbĊ symboli Ĩródáa S01 (czyli liczbĊ bitów ze strumienia Bi), z których skáada siĊ i-ty symbol kodu Tunstala. Dla kodu Tunstala z tabeli 7 przy k = 4 otrzy-mujemy wtórny kod Huffmana zgodny z kolumną „kod binarny” tabeli 4. Na podstawie wzoru (7) i danych za-wartych w tabeli 7 otrzymujemy:

72787 . 0 44 . 2 776 . 1 128 . 0 3 16 . 0 2 2 . 0 512 . 0 3 ) 128 . 0 16 . 0 ( 3 2 . 0 2 512 . 0 01 ˜  ˜   ˜  ˜  ˜  L

Co na podstawie wzoru (6) daje w rezultacie L = 0.87344 i E = 99.18382% juĪ przy zaledwie 8 symbolach czĊĞciowo rozszerzonego kodu Huffmana.

(5)

Rys. 3 ZaleĪnoĞü Ğredniej dáugoĞci sáowa kodowego L01 od p dla roszerzonego kodu Huffmana „EH” (n = 2) - linia przerywana, oraz kodu „TH” (k = 4) - linia ciągáa

Rys. 4 ZaleĪnoĞü Ğredniej dáugoĞci sáowa kodowego L01 od p dla roszerzonego kodu Huffmana „EH” (nd 8) - linia przerywana, oraz kodu „TH” (kd 32) - linia ciągáa

Podobnie jak w poprzednim punkcie pojawia siĊ taka wáasnoĞü, Īe czasem zwiĊkszenie liczby k elemen-tów w rozszerzonym kodzie moĪe powodowaü wydáuĪe-nie ĞredwydáuĪe-niej dáugoĞci sáowa kodowego. A zatem podczas kaĪdej iteracji tworzenia kodu „TH” naleĪy sprawdzaü, czy dana iteracja powoduje wzrost efektywnoĞci kom-presji. JuĪ dla k d 32 moĪna uzyskaü Ğrednią dáugoĞü sáowa kodowego na poziomie tej, którą otrzymano dla metody „EH” przy n d 8 (co odpowiada k d 256). A dla

p > 0.9 metoda „TH” daje nawet lepszy rezultat, co

przedstawiono na rysunku 4. Ogólnie dla tej metody potrzeba jedynie

¦

1 1 ' K i i k

K symboli kodu czĊĞciowo rozszerzonego, gdzie ki oznacza liczbĊ symboli kodu Tunstala dla wĊzáa wi podstawowego kodu Huffmana.

Podobna propozycja znajduje siĊ w [3], przy czym kod „TH” jest tylko podzbiorem rodziny (V-V) kodów rozszerzonych (dla Ĩródáa S01) o k symbolach. Fabris stwierdza, iĪ kod „TH” nie zawsze jest kodem optymal-nym dla danego k.

6. ZASTOSOWANIE KODU GOLOMBA DLA ħRÓDEà BINARNYCH

Kolejną propozycją kodowania ciągu bitów, czyli Ĩródáa S01 = {d, e} o prawdopodobieĔstwach odpowied-nio qd p, (gdzie q = 1 – p) jest kod Golomba [2]. Kod ten cechuje prosta zasada jego tworzenia, a takĪe to, iĪ jest kodem bez ograniczenia dáugoĞci. ħródáo binarne jest traktowane jako nieskoĔczony zestaw symboli, któ-rego kolejne elementy powinny reprezentowaü ciąg „d”, „ed”, „eed”,..., (n razy „e”+ „d”), itd. Podstawowym parametrem tego kodu jest tzw. liczba grupowa m równa [10]: » » º « « ª   p p m 2 2 log ) 1 ( log (8)

Dla m = 1 kod Golomba jest kodem unarnym, którego Ğrednia dáugoĞü sáowa kodowego wynosi L01 = 1. Zasto-sowanie kodu unarnego jest efektywne, gdy proporcja (uprzednio posortowanych) prawdopodobieĔstw miĊdzy dwoma kolejnymi symbolami speánia nierównoĞü:

618034 . 0 2 1 5 1 1 d  ˜ ˜   p q p q p p p n n n n

Dopiero dla mt 2 mamy L01 < 1. Wówczas kod Golom-ba skáada siĊ z przedrostka bĊdącego kodem unarnym (reprezentującego numer grupy), oraz z kodu Huffmana (dla m zdarzeĔ równoprawdopodobnych) reprezentują-cego jeden z m elementów w danej grupie. Otrzymanie

L01< 1 bĊdzie moĪliwe dopiero, gdy p > 0.618034. A zatem dopiero powyĪej tej wartoĞci zastosowanie kodu Golomba jest opáacalne. Porównanie Ğrednich dáugoĞci kodu Golomba oraz „TH” (przy k d 32) dla p < 0.7 przedstawia rysunek 5. Wynika z niego, iĪ w tym dziale kod Tunstala daje lepszą efektywnoĞü. W prze-dziale 0.7 < p < 0.98 kody te mają bardzo podobną efek-tywnoĞü niewiele odbiegającą od wartoĞci entropii H01. Jednak dla p > 0.98 moĪna juĪ zauwaĪyü, Īe kod Go-lomba ma krótszą Ğrednią dáugoĞü sáowa kodowego L01, niĪ w przypadku kodu „TH” (patrz rysunek 6).

Rys. 5 ZaleĪnoĞü Ğredniej dáugoĞci sáowa kodowego L01 od p dla kodu „TH” (kd 32) - linia przerywana, oraz dla kodu Golomba - linia ciągáa

(6)

Rys. 6 ZaleĪnoĞü Ğredniej dáugoĞci sáowa kodowego L01 od p dla kodu „TH” (kd 32) - linia przerywana, oraz dla kodu Golomba - linia ciągáa

7. PROPOZYCJE PRAKTYCZNYCH REALIZACJI CZĉĝCIOWO ROZSZERZONEGO KODU HUFFMANA W przypadku praktycznej realizacji zwiĊkszania efektywnoĞci kodu Huffmana trzeba braü pod uwagĊ kilka czynników. Na przykáad rozmiar pamiĊci, jaką moĪe dysponowaü koder i dekoder. W przypadku np. realizacji sprzĊtowej, czĊsto jest potrzebny algorytm o maáych wymaganiach pamiĊciowych. MoĪna wówczas ograniczyü siĊ do dwóch buforów: B1, w którym bity zapisywane są bez zmian. Oraz B2, gdzie bity kodowane są zgodnie z tabelą 4 (gdy p > 0.618034).

Dysponując nieco wiĊkszą pamiĊcią moĪemy uĪyü np. 16 buforów i kodu „TH” dla k d 32 (lub kodu Go-lomba, gdy dysponujemy maáą mocą obliczeniową). Bufory dobieramy dla tych wĊzáów, które pozwolą otrzymaü maksymalny zysk. Wybieramy zatem 16 wĊ-záów, dla których wartoĞü zysku zi jest najwiĊksza [11]:

zi = p(wi)˜(1 – L01) (9) Gdzie p(wi) jest prawdopodobieĔstwem wystąpienia wĊzáa wi w drzewie podstawowego kodu Huffmana. Tym wĊzáom przyporządkowane są bufory B1 y B16. Kodowanie bitów związanych z pozostaáymi wĊzáami moĪe byü związane z najlepiej pasującym buforem lub z buforem gáównym B0 (zapis bitu bez dodatkowego ko-dowania).

W przypadku jeszcze wiĊkszych moĪliwoĞci pamiĊ-ciowych, moĪemy wykorzystaü stworzenie buforów dla wszystkich K1 wĊzáów, áącząc metody w zaleĪnoĞci pod wartoĞci p. Algorytm „TH” dla stosujemy dla

p < 0.98 (lub nawet dla p < 0.7), a kod Golomba w

prze-ciwnym wypadku.

8. PODSUMOWANIE

DziĊki wprowadzeniu przez autora wielu buforów Bi moĪliwe jest zwiĊkszenie efektywnoĞci kompresji binar-nego kodu Huffmana, bez znaczbinar-nego wzrostu zapotrze-bowania na pamiĊü. PoniewaĪ bufory Bi traktujemy jako ciąg bitów, moĪemy wykorzystaü wiele efektywnych metod ich kompresji. W tym artykule zaproponowano trzy z nich – rozszerzony kod Huffmana, poáączenie kodu Tunstala-Huffmana oraz kod Golomba. Gáówną zaletą przedstawionej propozycji jest to, Īe mimo wyjąt-kowo maáego zapotrzebowania na pamiĊü potrzebną do przechowywania symboli rozszerzonego Ĩródáa i odpo-wiadających im sáów kodowych, moĪemy w sposób efektywny kompresowaü dane, dla których prawdopodo-bieĔstwo najczĊĞciej wystĊpującego symbolu jest duĪo wyĪsze od 0.5.

SPIS LITERATURY

[1] K. Sayood: „Introduction to Data Compres-sion” 2nd edition, Morgan Kaufmann Publ., 2002 [2] S. W. Golomb: „Run-length encoding”, IEEE Trans. on Information Theory, vol 12, pp. 399-401, July 1966

[3] F. Fabris: „Length –to- Variable-Length source coding: A greedy step-by-step al-gorithm”, IEEE Trans. on Information Theory,

vol 38, pp. 1609-1617, September 1992

[4] B. L. Montgomery, H. Diamond, B. V. K. Vijarya Kumar: „Bit probabilities of optimal binary source codes”, IEEE Trans. on

Informa-tion Theory, vol 36, pp. 1446-1450, November 1990

[5] W. Skarbek i inni: „Multimedia i standardy kompresji danych”, Akademicka Oficyna

Wy-dawnicza PLJ, Warszawa 1998

[6] W. Skarbek: „Metody reprezentacji obrazów cyfrowych”, Akademicka Oficyna Wydawnicza

PLJ, Warszawa 1993

[7] A. Drozdek: „Wprowadzenie do kompresji da-nych”, Wydawnictwa Naukowo-Techniczne,

Warszawa 1999

[8] G. Ulacha, R. StasiĔski: „Source binary coding using non-binary Huffman codes”, Krajowe

Sympozjum Nauk Radiowych URSI, PoznaĔ 2002

[9] G. Ulacha, R. StasiĔski: „Mixed Huffman codes”, Advanced Computer Systems –

MiĊdzyzdroje 2002

[10] V. Bhaskaran, K. Konstantinides „Image and video compression standards – algorithms and architectures” S.Ed., Kluwer Academic

Pub-lishers, 1997

[11] R. W. Yeung „Local redundancy and progres-sive bounds on the redundancy of Huffman code”, IEEE Trans. on Information Theory, vol

37, pp. 687-691, May 1991

[12] R. G. Gallager „Variations on a theme by Huffman”, IEEE Transactions on Information

Theory, vol. 24, no. 6, pp. 668-674, November 1978

Cytaty

Powiązane dokumenty

Oczywiście, jest pewien haczyk: możliwości nawet najmocniejszego Raspberry Pi są daleko poniżej laptopa ze średniej półki, więc zestaw zadań, jakie można wygodnie rozwiązywać

Wybór in Ŝ ynierii odwrotnej – tworzenie diagramów UML na podstawie kodu ź ródłowego programu... Zofia Kruczkiewicz, Podstawy in Ŝ

Do najefektywniejszych algorytmów entropijnych należą kodowanie arytmetyczne i kodowanie Huffmana [1, 2]. Ten drugi typ jest prosty do implementacji, a podstawowa wersja

Kod jest zdegenerowany, co oznacza, że jeden aminokwas może być kodowany przez kilka kodonów.. Zatem jeden aminokwas może być kodowany przez jeden, dwa, trzy, cztery, nawet 6

Cyfrom kodu odpowiada szereg jasnych i ciemnych linii (rys. 1), które mogą być odczytywane przez specjalne urządzenia

Przedsta- wione w poprzednich pracach autorów [3, 4] wyniki badań dotyczyły analizy wpływu stanu magistrali danych, argu- mentu rozkazu, wyniku operacji, adresu rozkazu w pamięci

Z przeprowadzonych testów jakości działania systemu autorskiego wynika, iż tworzenie kodu źródłowego z wykorzystaniem mowy jest możliwe. Należy jednak pamiętać,

[r]