Ć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.