Temat: Algorytm kompresji plików metodą Huffmana

Podobne dokumenty
0-0000, , , itd

Niech x 1,..., x n będzie ciągiem zdarzeń. ---

Kodowanie Huffmana. Platforma programistyczna.net; materiały do laboratorium 2014/15 Marcin Wilczewski

Def. Kod jednoznacznie definiowalny Def. Kod przedrostkowy Def. Kod optymalny. Przykłady kodów. Kody optymalne

Kompresja bezstratna. Entropia. Kod Huffmana

Kompresja danych kodowanie Huffmana. Dariusz Sobczuk

Kodowanie i kompresja Streszczenie Studia dzienne Wykład 9,

Wygra Polska czy Brazylia, czyli o tym jak zwięźle zapisywać informacje

Nierówność Krafta-McMillana, Kodowanie Huffmana

Algorytmy zachłanne. dr inż. Urszula Gałązka

Kody Tunstalla. Kodowanie arytmetyczne

Wstęp Statyczne kody Huffmana Dynamiczne kody Huffmana Praktyka. Kodowanie Huffmana. Dawid Duda. 4 marca 2004

Kody Huffmana. Konrad Wypyski. 11 lutego 2006 roku

Podstawowe pojęcia. Teoria informacji

Kompresja Kodowanie arytmetyczne. Dariusz Sobczuk

KODY SYMBOLI. Kod Shannona-Fano. Algorytm S-F. Przykład S-F

Definicja. Jeśli. wtedy

Teoria Informacji - wykład. Kodowanie wiadomości

Granica kompresji Kodowanie Shannona Kodowanie Huffmana Kodowanie ciągów Kodowanie arytmetyczne. Kody. Marek Śmieja. Teoria informacji 1 / 35

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 11,

Entropia Kodowanie. Podstawy kompresji. Algorytmy kompresji danych. Sebastian Deorowicz

Teoria informacji i kodowania Ćwiczenia

Kodowanie i entropia

Teoria Informacji i Metody Kompresji Danych

Kodowanie informacji

Algorytmy i struktury danych

0 + 0 = 0, = 1, = 1, = 0.

KODY SYMBOLI. Materiały KODA, A.Przelaskowski. Koncepcja przedziałów nieskończonego alfabetu

teoria informacji Entropia, informacja, kodowanie Mariusz Różycki 24 sierpnia 2015

ZADANIE 1. Rozwiązanie:

Założenia i obszar zastosowań. JPEG - algorytm kodowania obrazu. Geneza algorytmu KOMPRESJA OBRAZÓW STATYCZNYCH - ALGORYTM JPEG

12. Wprowadzenie Sygnały techniki cyfrowej Systemy liczbowe. Matematyka: Elektronika:

Kodowanie Shannona-Fano

Elementy teorii informacji i kodowania

Wprowadzenie do informatyki i użytkowania komputerów. Kodowanie informacji System komputerowy

teoria informacji Kanały komunikacyjne, kody korygujące Mariusz Różycki 25 sierpnia 2015

Techniki multimedialne

1.1. Pozycyjne systemy liczbowe

Algorytmy i struktury danych. wykład 8

Algorytmy i. Wykład 5: Drzewa. Dr inż. Paweł Kasprowski

mgr inż. Grzegorz Kraszewski SYSTEMY MULTIMEDIALNE wykład 4, strona 1. GOLOMBA I RICE'A

Algorytmy kodowania entropijnego

Maszyna Turinga języki

Kodowanie informacji. Przygotował: Ryszard Kijanka

Według raportu ISO z 1988 roku algorytm JPEG składa się z następujących kroków: 0.5, = V i, j. /Q i, j

Krzysztof Leszczyński Adam Sosnowski Michał Winiarski. Projekt UCYF

ARYTMETYKA BINARNA. Dziesiątkowy system pozycyjny nie jest jedynym sposobem kodowania liczb z jakim mamy na co dzień do czynienia.

Wstęp do programowania. Reprezentacje liczb. Liczby naturalne, całkowite i rzeczywiste w układzie binarnym

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Kodowanie i kompresja Tomasz Jurdziński Studia Wieczorowe Wykład Kody liniowe - kodowanie w oparciu o macierz parzystości

Sortowanie. Bartman Jacek Algorytmy i struktury

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Przetwarzanie i transmisja danych multimedialnych. Wykład 3 Kodowanie Shannona Fano i Huffmana. Przemysław Sękalski.

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

Kwantyzacja wektorowa. Kodowanie różnicowe.

Python: JPEG. Zadanie. 1. Wczytanie obrazka

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

Wstęp do Informatyki

Systemy liczenia. 333= 3*100+3*10+3*1

Przetwarzanie i transmisja danych multimedialnych. Wykład 5 Kodowanie słownikowe. Przemysław Sękalski.

Konkursy w województwie podkarpackim w roku szkolnym 2016/2017

Komunikacja człowiek-komputer

Arytmetyka komputera

Luty 2001 Algorytmy (7) 2000/2001

Dane, informacja, programy. Kodowanie danych, kompresja stratna i bezstratna

Podstawy kompresji danych

Modulacja i kodowanie. Labolatorium. Kodowanie źródłowe Kod Huffman a

Kodowanie transformacyjne. Plan 1. Zasada 2. Rodzaje transformacji 3. Standard JPEG

Formaty obrazów rastrowych biblioteki PBM

Architektura systemów komputerowych Laboratorium 5 Kodowanie liczb i tekstów

pobieramy pierwszą literę komunikatu i wypełniamy nią (wszystkie pozycje tą samą literą) bufor słownikowy.

Hierarchia Chomsky ego Maszyna Turinga

Temat 7. Dekodery, enkodery

Pracownia Komputerowa wyk ad VII

Pracownia Komputerowa wykład IV

Zestaw 3. - Zapis liczb binarnych ze znakiem 1

EGZAMIN MATURALNY Z INFORMATYKI

KOMPRESJA OBRAZÓW STATYCZNYCH - ALGORYTM JPEG

3. Opracować program kodowania/dekodowania pliku tekstowego. Algorytm kodowania:

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Podstawą w systemie dwójkowym jest liczba 2 a w systemie dziesiętnym liczba 10.

Tablice z haszowaniem

Wstęp do Programowania potok funkcyjny

EGZAMIN MATURALNY Z INFORMATYKI

Teoria informacji i kodowania Ćwiczenia Sem. zimowy 2016/2017

Podstawowe operacje arytmetyczne i logiczne dla liczb binarnych

DZIESIĘTNY SYSTEM LICZBOWY

Tranzystor JFET i MOSFET zas. działania

Temat pytań Teoria informacji

Pracownia Komputerowa wyk ad IV

Kodowanie i kompresja Streszczenie Studia dzienne Wykład 12,

AKD Metody słownikowe

Algorytmy i złożoności Wykład 5. Haszowanie (hashowanie, mieszanie)

Ćwiczenie nr 4: Kodowanie arytmetyczne, range coder

Stan wysoki (H) i stan niski (L)

Kompresja obrazów w statycznych - algorytm JPEG

Wykład 5. Kompresja danych

Kody splotowe. Zastosowanie

Języki i metodyka programowania. Reprezentacja danych w systemach komputerowych

Algorytmy kompresji. Kodowanie Huffmana, kodowanie arytmetyczne

Transkrypt:

Temat: Algorytm kompresji plików metodą Huffmana. Wymagania dotyczące kompresji danych Przez M oznaczmy zbiór wszystkich możliwych symboli występujących w pliku (alfabet pliku). Przykład M = 2, gdy plik tekstowy zawiera znaki alfabetu Morse'a: kropka i kreska M = 5, gdy plik tekstowy ma następującą zawartość: abaacdaae M = {a, b, c, d, e} M = 256 dla dowolnego pliku, jeżeli każdemu bajtowi pliku zinterpretowanemu jako znak (typ char) przyporządkujmy jego kod ASCII. Załóżmy, że znane jest prawdopodobieństwo wystąpienia dowolnego znaku m i (i=, 2,..., n; gdzie n = M ) w alfabecie M. Ustalamy również, że wszystkie znaki alfabetu chcemy zakodować w postaci ciągów zerojedynkowych. Oznaczmy to prawdopodobieństwo przez P(m i ). Wówczas: P m... + P m ( ) ( ) + n =

Def. Entropią źródła M nazywamy wartość wyrażenia L = P m L m +... + P m L m (*) ave ( ) ( ) ( n ) ( n ) gdzie ( m ) = log ( P( )). L i 2 m i, Wartość L( m i ) ma sens minimalnej długości kodu dla symbolu m i. W roku 948 Claude E. Shannon wykazał, że równanie (*) daje najlepszą możliwą średnią długość kodu, kiedy symbole tworzące kod i częstości ich wystąpienia są znane. Żaden algorytm kompresji danych nie może dawać wyniku lepszego niż L ave, a im bliższy jest tej liczby, tym lepszy (wyższy) jest współczynnik kompresji zdefiniowany następująco: długość ciągu wejściowego - długość ciągu wyjściowego długość ciągu wejściowego Przykład Niech M = 3, a prawdopodobieństwa wystąpienia poszczególnych symboli wynoszą: P ( m ) = 0,25, P( m2 ) = 0,25, P( m3 ) = 0, 5. Wówczas długości minimalne przypisanych kodów będą wynosiły: log ( P( m )) = log2 P( m2 ) = log2 0,25 = log2 = log2 0,25 oraz log2 ( P ( m3 )) = log2( 2) =, a średnia długość kodu będzie wynosiła L ave = P( m ) 2 + P( m2 ) 2 + P( m3 ) =, 5. ( ) ( ) ( 4) 2 2 = 2

W metodach kompresji danych dąży się do zminimalizowania średniej długości kodu, konstruując kod optymalny wg zasady: Im mniejsze prawdopodobieństwo wystąpienia znaku tym dłuższy jest jego kod kompresji. Aby kompresja była poprawna muszą być spełnione następujące warunki: ) Każdy kod odpowiada dokładnie jednemu symbolowi. 2) Dekodowanie nie powinno wymagać podglądania większego fragmentu zakodowanego tekstu. Po wczytaniu z pliku pojedynczego symbolu powinniśmy umieć stwierdzić, czy osiągnięty został koniec napisu kodującego symbo pierwotnej wiadomości. Nie są więc potrzebne żadne specjalne znaki oddzielające dwa kody w sąsiedniej wiadomości. 3

Przykład Trzy różne sposoby zakodowania trzech symboli: Symbol Kod Kod 2 Kod 3 A B 0 00 0 C 0 0 0 - Pierwszy kod nie rozróżnia ciągu znaków AB od C. AB: 0 C : 0 - Drugi kod wymaga podglądania następnych znaków. W ciągu: 000 pierwszy znak można zakodować jako A. - Wtedy następne dwa zera sugerują, że po A występuje B. Z tym jednak, że ostatnie zero nie koduje żadnego symbolu alfabetu. Zatem początek kodu musi "dawać" C, a pozostałe dwa zera dają B. Stąd poprawnie odkodowany ciąg to CB. Możemy to ustalić dopiero po odczytaniu całego ciągu 000. - Jedynie Kod 3 spełnia warunki ) i 2). 3) Długość kodu danego symbolu nie powinna przekraczać długości kodu symbolu mniej prawdopodobnego. Czy jeśli P m P m, to L m L m dla i, j n. ( ) ( ) ( ) ( ) i j 4) W optymalnym systemie kodowania nie powinny się być wykorzystane kody o długości k zanim nie zostaną wykorzystane optymalne kody o długościach mniejszych od k. Gdyby ten warunek nie był spełniony, to oznaczałoby to niepotrzebne wydłużanie kodów. i j 4

Przykład Ciąg kodów 0, 000, 00, 00, 0 dla pewnego alfabetu nie jest optymalny, ponieważ kod nigdzie nie jest używany. Kodowanie to można przekształcić w optymalny ciąg 0, 0,, 000, 00. Ciąg ten spełnia warunki od ) do 4). 2. Metoda Huffmana Metoda kompresji Huffmana oparta jest na algorytmie tworzenia tzw. drzewa Huffmana. Idea algorytmu tworzenia drzewa Huffmana. Dla każdego symbolu utwórz jednowęzłowe drzewo. 2. Uporządkuj wszystkie drzewa niemalejąco względem prawdopodobieństwa wystąpień symboli. 3. Weź dwa drzewa d i d 2 o najmniejszych prawdopodobieństwach p i p 2 występowania symboli i utwórz drzewo o synach d i d 2 i prawdopodobieństwie w korzeniu równym p + p 2. 4. Krok 3 powtarzaj aż do momentu, gdy zostanie tylko jedno drzewo. 5. Każdą krawędź skierowaną w lewo oznacz zerem, a każdą skierowaną w prawo jedynką; 6. Utwórz kod dla każdego symbolu, przechodząc drzewo od korzenia do liścia odpowiadającego temu symbolowi i łącząc napotykane zera i jedynki. W korzeniu otrzymanego drzewa prawdopodobieństwo wynosi. 5

Przykład Przyjmijmy, że: M = 5, M={A, B, C, D, E}, a prawdopodobieństwa wystąpienia poszczególnych symboli wynoszą: P A = 0,09, P B = 0,2, P C = 0,9, P D = 0,2, P E = ( ) ( ) ( ) ( ) ( ) 0, 39. Drzewa jednowęzłowe 0,09 A 0,2 B 0,9 C 0,2 D 0,39 E 2. Etapy budowania drzewa Huffmana 0,40 0,9 C 0,2 0,2 D 0,39 E 0,09 A 0,2 B 6

,0 0,40 0,60 0,9 C 0,2 0,2 D 0,39 E 0,09 A 0,2 B Dla ustalenia efektywności kompresji metodą Huffmana wykorzystuje się pojęcie ważonej długości ścieżki L huf, definiowanej tak samo jak L ave w równaniu (*), tylko wartości L(m i ) zastępujemy długością kodu dla symbolu m i. Tak więc: L ave = 0,09 3,474 + 0,2 3,059 + 0,9 2,396 + 0,2 2,252 + 0,39,238 = 2,09 L = 0,09 3 + 0,2 3 + 0,9 2 + 0,2 2 + 0,39 2 = 2,2 huf Ważona długość ścieżki różni się nieznacznie, bo tylko o 5% od entropii źródła. 7

Zauważmy, że dla każdego przypadku drzewa Huffmana zbudowanego dla tego samego pliku, otrzymujemy taką samą ważoną długość ścieżki. Prześledzimy teraz na przykładzie pewnego pliku wszystkie kroki algorytmów: kompresji i dekompresji metodą Huffmana. Dla uproszczenia będziemy zakładali, że kompresji poddajemy "krótki" plik tekstowy odczytywany znak po znaku. Plik: ABAACBDABBCEDAE Algorytm kompresji metodą Huffmana. Przeglądamy plik i ustalamy tablicę częstości wystąpienia poszczególnych symboli: A - 5 B - 4 C - 2 D - 2 E - 2 2. Tworzymy listę jednowęzłowych drzew symboli z częstościami uporządkowaną niemalejąco wg częstości Lista: E - 2 C - 2 D - 2 B - 4 A - 5 3. Na podstawie listy tworzymy drzewo Huffmana 6 0 5 0 0 9 D-2 B-4 4 0 E-2 C-2 A-5 8

4. Ustalamy kody kompresji poszczególnych symboli ma podstawie drzewa Huffmana. A: B: 0 C: 0 D: 00 E: 00 5. Odczytujemy znaki pliku, który jest poddawany kompresji i przypisujemy im odpowiednie kody kompresji. Plik: A B A A C B D A B B C E D A E Kody kompresji:00000000000000 5. Do pliku powstającego po kompresji wstawiamy: - tablicę częstości symboli niezbędną przy dekompresji, - znaki o kodach obliczonych jako liczba dziesiętna powstała po zamianie ośmiobitowych serii kodu kompresji Kody kompresji z podziałem na serie ośmiobitowe: 0 0000 000 0000 00 I bajt II bajt III bajt IV bajt V bajt (niepełny) I bajt: (0) 2 = (223) 0 II bajt: (0000) 2 = (22) 0 III bajt: (000) 2 = (73) 0 IV bajt: (0000) 2 = (35) 0 V bajt uzupełniony: (00 000000) 2 = (0) 0 Plik powstały w wyniku kompresji: 5 4 2 2 2 #223 #22#73#35#0 (#k - operator zwracający znak o kodzie k) 9

Algorytm dekompresji metodą Huffmana Plik powstały w wyniku kompresji: 5 4 2 2 2 #223 #22#73#35#0. Odczytujemy częstości wystąpienia symboli i obliczamy liczbę elementów w pliku, który został skompresowany. Liczba elementów pliku przed kompresją: 5+4+2+2+2=5 2. Na podstawie tablicy częstości budujemy drzewo Huffmana (identycznie jak w algorytmie kompresji) 0 5 6 0 0 9 3. Ustalamy kody kompresji poszczególnych symboli na podstawie drzewa Huffmana (identycznie jak w algorytmie kompresji) A: B: 0 C: 0 D: 00 E: 00 D-2 B-4 0 4 E-2 C-2 A-5 0

4. Odczytujemy znaki pliku, który jest poddawany dekompresji. Każdemu znakowi odczytanemu z pliku przyporządkowujemy ośmiobitową serię zerojedynkową stanowiącą reprezentację dwójkową kodu znaku. I bajt: (223) 0 = (0) 2 II bajt: (22) 0 = (0000) 2 III bajt: (73) 0 = (000) 2 IV bajt: (35) 0 = (0000) 2 V bajt: (0) 0 = (00000000) 2 Plik powstały w wyniku kompresji: 5 4 2 2 2 #223 #22#73#35#0 (#k - operator zwracający znak o kodzie k) 5.Ustalamy symbole po dekompresji na podstawie powstałego ciągu binarnego, kodów kompresji i drzewa Huffmana. Ciąg binarny : 00000000000000 Sym.po dekomp.: A B A A CBDA B B C E D A E 6 "dostawionych" bitów - Ustalenie pojedynczego symbolu po dekompresji zaczyna się zawsze w korzeniu drzewa Huffmana, a kończy po osiągnięciu liścia w tym drzewie. - Dzięki temu, że znamy liczbę elementów pliku, który został poddany kompresji możemy po ustaleniu 5 symboli po dekompresji zakończyć proces dekodowania i tym samym "dostawione" bity zostaną zignorowane.

Koszt czasowy algorytmu kompresji: Rozmiar zadania: n - rozmiar alfabetu m - liczba znaków pliku, który kompresujemy. Tworzenie uporządkowanej listy jednowęzłowych drzew kosztuje optymalnie Θ(nlogn). 2. Jeden krok procesu scalania dwóch węzłów drzewa Huffmana jest realizowany kosztem stałym Θ(). Cały proces tworzenia drzewa Huffmana kosztuje zatem Θ(n 2 ). 3. Proces ustalania wszystkich kodów kompresji kosztuje Θ(n).Można go zrealizować stosując metodę przeglądania drzewa binarnego w porządku inorder (poprzeczny: L K P). 4. Krok algorytmu kompresji, który ustala kody znaków wpisywanych do skompresowanego pliku ma również koszt rzędu Θ(m). Stąd wynika, że koszt algorytmu kompresji metodą Huffmana pliku zawierającego m znaków nad n elementowym alfabetem wynosi Θ(n 2 +m). 2