Ćwiczenie 4 Kompresja Huffmana

Transkrypt

Ćwiczenie 4 Kompresja Huffmana
Systemy teleinformatyczne
Kompresja Huffmana
Ćwiczenie 4
Kompresja Huffmana (bezstratna) polega na zastąpieniu występujących najczęściej ciągów - krótszymi, a
występujących rzadziej - dłuższymi. W ten sposób przy nierównomiernej częstości można uzyskać efekt
kompresji.
W metodzie budowana jest struktura drzewa binarnego, którego wierzchołki zawierają po jednym bicie kodu,
a wierzchołki końcowe (terminalne) kodowany element. Pełny kod dla danego elementu jest ciągiem bitów z
wierzchołków pojawiających się na drodze od korzenia (wyłącznie, bo ten nie zawiera informacji o bicie) do
węzła terminalnego przyporządkowanemu temu elementowi (włącznie).
Algorytm:
1. Utworzyć wierzchołki terminalne według prawdopodobieństwa, przyporządkować je bajtom
(znakom) informacji i zapisać w nich wagę - częstość występowania tych bajtów.
2. Wziąć 2 wierzchołki, które jeszcze nie mają rodzica, o najmniejszych wartościach częstości i utworzyć
dla nich wspólnego rodzica, którego wartość częstości będzie równa sumie wartości częstości jego
potomków.
3. Jeżeli został jeden węzeł bez rodzica (korzeń) to zakończyć drzewo, w przeciwnym razie przejść do
punktu 2.
Można algorytm zapisać też tak:
1. Utwórz listę drzew binarnych, które w węzłach przechowują pary: symbol, prawdopodobieństwo. Na
początku drzewa składają się wyłącznie z niezależnych korzeni.
2. Dopóki na liście jest więcej niż jedno drzewo powtarzaj:
• Usuń z listy dwa drzewa o najmniejszym prawdopodobieństwie zapisanym w korzeniu.
• Wstaw nowe drzewo, w którego korzeniu jest suma prawdopodobieństw usuniętych drzew,
natomiast one same stają się jego lewym i prawym poddrzewem. Korzeń drzewa nie przechowuje
symbolu.
Algorytm nie określa w jakiej kolejności wybierać drzewa z listy, jeśli mają takie samo prawdopodobieństwo
(niedeterministyczny).
Załóżmy że mamy następujący tekst: ABCDEABBAACECADBCABBAEDAD
Określamy częstotliwość wystąpień znaków:
A
B
C
D
E
8
6
Etapy budowania drzewa:
4
4
3
suma
25
Budujemy zatem drzewo binarne posortowane wg wystąpień – z wagami. Łączymy węzły sąsiadujące o
najmniejszych prawdopodobieństwach wystąpień parami, sumując prawdopodobieństwa - aż uzyskamy
korzeń. Przydzielamy bity 0 i 1 poszczególnym gałęziom.
Reprezentacja znaków sekwencjami kodowymi (binarnymi) – zaczynamy od korzenia, poruszając się po
drzewie aż do symbolu:
A
10
B
00
C
01
D
111
E
110
ABCDEABB... = > 100001111110100000 itd..
Dekodowanie w metodzie Huffmana odbywa się w następujący sposób:
1. Bity czytane są od lewej do prawej, aż do momentu wykrycia kodu pojedynczego symbolu określonego
przez drzewo kodowe.
2. Bity te zostają usunięte z ciągu bitów, a zdekodowany symbol zapamiętany. Następuje ponowne
wykonanie punktu 1.
3. Punkty 1. i 2. są wykonywane aż do momentu odczytania całego ciągu bitów.
Zauważmy ważną cechę metody - odczytanie tekstu nie sprawi problemów, mimo braku separatorów
międzyznakowych.
Zalety kompresji Huffmana:
• Niewielka długość kodu – z powodu wystąpienia krótkich symboli dla najczęściej występujących
znaków.
• Brak konieczności stosowania separatorów dla symboli kodowych !
Zadania
1. Wykorzystując częstotliwości znaków:
a
j
s
0.088 b
0.032 k
0.044 t
0.016 c
0.030 l
0.035 u
0.030 d
0.025 m
0.039 v
0.034 e
0.047 n
0.002 w
0.089 f
0.058 o
0.044 x
0.004 g
0.093 p
0.000 y
0.011 h
0.040 q
0.037 z
0.023
0.000
0.046
i
r
0.071
0.062
zbudować drzewo kodowe dla wszystkich 24 liter alfabetu.
Po utworzeniu drzewa zakodować słowo „teleinformatyka” i zilustrować jego dekodowanie.
2. Mamy obraz bitowy zdefiniowany następująco:
Skompresować obrazek metodą Huffmana.

Podobne dokumenty