Algorytmy kompresji

Post on 24-May-2015

3.546 views 3 download

Transcript of Algorytmy kompresji

Kinga DudzicAgata Wajda

Agnieszka Gurgul

GŁÓWNE ALGORYTMY GŁÓWNE ALGORYTMY KOMPRESJIKOMPRESJI

HOFFMANAHOFFMANA ZIV’AZIV’A - LEMPLALEMPLA

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”

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.

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.

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:

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.

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.

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

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.

Przykład kodowania dla ciągu ABABCBABABCAD

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

LZ77LZWLZSSLZPG

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.

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

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

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

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