Algorytmy kompresji

26
Kinga Dudzic Agata Wajda Agnieszka Gurgul

Transcript of Algorytmy kompresji

Page 1: Algorytmy kompresji

Kinga DudzicAgata Wajda

Agnieszka Gurgul

Page 2: Algorytmy kompresji

GŁÓWNE ALGORYTMY GŁÓWNE ALGORYTMY KOMPRESJIKOMPRESJI

HOFFMANAHOFFMANA ZIV’AZIV’A - LEMPLALEMPLA

Page 3: Algorytmy kompresji

Jest jedną z najprostszych i łatwych w Jest jedną z najprostszych i łatwych w implementacji metod kompresji implementacji metod kompresji

bezstratnej. Została opracowana w bezstratnej. Została opracowana w 1952 roku przez Amerykanina Davida 1952 roku przez Amerykanina Davida

Huffmana i od jego nazwiska Huffmana i od jego nazwiska pochodzi oryginalna nazwa pochodzi oryginalna nazwa

„„Huffman coding”Huffman coding”

Page 4: Algorytmy kompresji
Page 5: Algorytmy kompresji
Page 6: Algorytmy kompresji

Algorytm Huffmana jest jakby odwróceniem algorytmu Shannon-Fano, łączącym elementy.

Kroki kompresji algorytmu:Utwórz jednoelementowy zbiór z każdego

symbolu o wadze równej częstotliwości znaku.

Połącz dwa najlżejsze zbiory. Do każdego kodu bitowego ze znaków z

jednego zbioru dołączamy jedynkę, a drugiego - zero.

Powtarzaj drugi krok, aż powstanie zbiór zawierający wszystkie znaki.

Page 7: Algorytmy kompresji
Page 8: Algorytmy kompresji

Oto algorytm Huffmana prezentowany w Oto algorytm Huffmana prezentowany w postaci drzewa binarnego, gdyż jest to metoda postaci drzewa binarnego, gdyż jest to metoda o wiele bardziej wygodna i czytelna. o wiele bardziej wygodna i czytelna.

Page 9: Algorytmy kompresji

Kody odczytujemy idąc od korzenia drzewa i dołączając do kodu zero, gdy idziemy w lewo lub jedynkę, gdy idziemy w prawo. Wobec tego wyglądają one tak:

Page 10: Algorytmy kompresji

Tak wygląda zakodowany strumień bitów: Tak wygląda zakodowany strumień bitów:

A tak obliczona długość strumienia bitów: 2 * 4 + 5 * 2 + 2 * 4 + 1 * 5 + 1 * 5 + 1 * 5 + 1 * 5 + 4

* 2 + 1 * 5 + 1 * 5 + 2 * 4 + 2 * 4 + 2 * 3 = 8 + 10 + 8 + 5 + 5 + 5 + 5 + 8 + 5 + 5 + 8 + 8 + 8 = 88 bitów.

Jeżeli porówna się do postaci oryginalnej, gdzie założono że każdy symbol kodowany jest ośmioma bitami, a rozmiar danych nieskompresowanych wynosi:

25 znaków * 8 bitów = 200 bitówmożna łatwo zauważyć, że jest to ponad połowa mniej.

Page 11: Algorytmy kompresji

Jest to metoda Jest to metoda strumieniowej bezstratnej strumieniowej bezstratnej

kompresji słownikowej. kompresji słownikowej. Została opracowana przez Została opracowana przez

Abrahama Lempel’a i Abrahama Lempel’a i Jacoba Ziv’a.Jacoba Ziv’a.

Page 12: Algorytmy kompresji
Page 13: Algorytmy kompresji

Ta metoda korzysta z Ta metoda korzysta z bufora, który logicznie , który logicznie podzielony jest na dwie części:podzielony jest na dwie części:

BUFOR BUFOR SŁOWNIKOWYSŁOWNIKOWY ((słowniksłownik), ), przechowujący przechowujący kk ostatnio ostatnio przetwarzanych przetwarzanych symboli i obejmuje symboli i obejmuje indeksy indeksy 0… k - 10… k - 1

BUFOR BUFOR WEJŚCIOWYWEJŚCIOWY, , przechowujący przechowujący

nn symboli do symboli do zakodowania i zakodowania i obejmuje obejmuje

indeksyindeksy k … k +k … k + n - 1n - 1

Page 14: Algorytmy kompresji

Podczas kodowania mogą zajść dwie sytuacje miedzy buforem a Podczas kodowania mogą zajść dwie sytuacje miedzy buforem a oknem:oknem: mogą istnieć pasujące do siebie zdania (zdanie – ciąg symboli

występujących jeden po drugim np. abc, mamy zatem trzy symbole

a, b, oraz c. Ciąg takich symboli będziemy nazywali zdaniem) o jakiejś długości

lub zdania mogą do siebie nie pasować.

Jeśli istnieje przynajmniej jedno dopasowanie, kodujemy najdłuższe z nich jako

HASŁO ZDANIA. Hasła zawierają trzy informacje:

odstęp od brzegu okna przesuwnego, przy którym zaczyna się dopasowanie,

liczbę pasujących symboli oraz pierwszy symbol z bufora zza dopasowania.

Page 15: Algorytmy kompresji
Page 16: Algorytmy kompresji

Przykład kodowania dla ciągu ABABCBABABCAD

Page 17: Algorytmy kompresji
Page 18: Algorytmy kompresji

Kodowanie Ziva-Lempla posiada wiele różnych odmian. Do najbardziej znanych należą:

LZ77LZWLZSSLZPG

Page 19: Algorytmy kompresji
Page 20: Algorytmy kompresji
Page 21: Algorytmy kompresji
Page 22: Algorytmy kompresji

Schemat kompresji:Schemat kompresji:Wypełnij słownik alfabetem źródła informacji. Wypełnij słownik alfabetem źródła informacji. Dopóki są dane na wejściu: Dopóki są dane na wejściu:

Wczytaj znak Wczytaj znak Jeżeli wczytany znak w połączeniu z wcześniej Jeżeli wczytany znak w połączeniu z wcześniej

wczytanym ciągiem nie znajduje się w wczytanym ciągiem nie znajduje się w słowniku, wypisz kod poprzedniego ciągu i słowniku, wypisz kod poprzedniego ciągu i wstaw nowy do słownika, w przeciwnym razie wstaw nowy do słownika, w przeciwnym razie dodaj wczytany znak do ciągu. dodaj wczytany znak do ciągu.

Page 23: Algorytmy kompresji

Fragment kodu kompresującego w Fragment kodu kompresującego w C++::

Page 24: Algorytmy kompresji
Page 25: Algorytmy kompresji
Page 26: Algorytmy kompresji

BibliografiaBibliografiahttp://www.issi.pz.zgora.pl/pl/didactic/ao/asd/

lab9.pdfhttp://pl.wikipedia.org/wiki/Kodowanie_Huffm

anahttp://asembler.republika.pl/kompstat.html