Definicja
Jeśli
wtedy
Cel kompresji: zredukowanie do minimum oczekiwanego (średniego) kosztu
gdzie li jest długością słowa kodu ci kodującego symbol ai Definicja Efektywność kodowania określamy jako
śr
%
L
H 100
Definicje 1
2 Kod jest przedrostkowy, jeśli nie możemy otrzymać żadnego słowa kodu z innego słowa kodu poprzez dodanie do niego zer lub jedynek (tzn. Żadne słowo kodu nie jest przedrostkiem innego słowa kodu)
Definicja Może istnieć wiele takich kodów
Twierdzenie Ważne twierdzenie – nazywa się nierównością Krafta
Przykład.
Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję”
Jakżeż ja się uspokoję - Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje - Jakżeż ja się uspokoję…
Założenia:
• Każdy symbol odpowiada jednemu znakowi
• Prawdopodobieństwo wystąpienia każdego symbolu jest jednakowo prawdopodobne
• Przyjmujemy kod ASCII
rozszerzony o „polskie litery”, czyli ISO 8859-2
Przykład.
Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję”
Jakżeż ja się uspokoję - Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje - Jakżeż ja się uspokoję…
Założenia:
• Każdy symbol odpowiada jednemu znakowi
• Prawdopodobieństwo wystąpienia każdego symbolu jest jednakowo prawdopodobne
• Przyjmujemy kod ASCII
rozszerzony o „polskie litery”, czyli ISO 8859-2
Przykład.
Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję”
Jakżeż ja się uspokoję - Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje - Jakżeż ja się uspokoję…
Założenia:
• Każdy symbol odpowiada jednemu znakowi
• Prawdopodobieństwo wystąpienia każdego symbolu jest jednakowo prawdopodobne
• Przyjmujemy kod ASCII
rozszerzony o „polskie litery”, czyli ISO 8859-2
Model bardziej złożony
Przykład.
Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję”
Jakżeż ja się uspokoję - Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje - Jakżeż ja się uspokoję…
Założenia:
• Każdy symbol odpowiada jednemu znakowi
• Prawdopodobieństwo wystąpienia każdego symbolu jest jednakowo prawdopodobne
• Przyjmujemy kod ASCII
rozszerzony o „polskie litery”, czyli ISO 8859-2
Model bardziej złożony
Model bardziej złożony
Dodatkowe koszty
Częstość
występowania symboli w
sekwencji:
Rozważmy model wykorzystujący informacje o częstości występowania symboli
Przykładowy kod
Dodatkowe koszty
Definicja
Zalety Wady
•Bardzo szybkie kodowanie dzięki prostocie konstrukcji kodów i ich
regularności
•Brak potrzeby
przesyłania informacji o budowie kodu do dekodera
•Zwykle słaby
współczynnik kompresji
•Możliwa ekspansja danych jeśli rozkład prawdopodobieństwa
występowania symboli nie pasuje do założonego przy konstrukcji kodu
Kod unarny
Cechy
Zastosowania
Długość: x bitów
Kod binarny
Cechy
Zastosowania
Długość:
Definicja
Komentarz:
Cechy
Zastosowania
Długość:
Definicja
Komentarz:
Cechy
Zastosowania
Długość:
Definicja
Komentarz:
Cechy
Zastosowania
Długość:
Liczby Fibonacciego definiuje następująca zależność rekurencyjna:
przy czym
Każda liczba całkowita dodatnia może być zapisana jako suma różnych liczb Fibonacciego
Definicja
Przykład
Odwrócona reprezentacja Zeckedndofra
W trakcie kodowania wygodniejsza jest reprezentacja, w której najmniej znaczący bit znajduje się na początku
Przykład
Każdą liczbę całkowitą można przedstawić w odwróconej reprezentacji Zeckendorfa w taki sposób, aby nie zawierała dwóch następujących po sobie jedynek.
Definicja
Komentarz
Definicja
Komentarz
Zalety
•Prosta budowa
•Stosunkowo dobry
współczynnik kompresji dla danych, dla których
prawdopodobieństwo
występowania symboli maleje dla kolejnych symboli alfabetu
Wady
•Nieco trudniejszy w obliczaniu niż wcześniejsze kody
Definicja
Zalety Wady
Podstawowe twierdzenie Shannona o kodowaniu bezszumowym
Dla bezpamięciowego źródła S o entropii H(S) możliwe jest przypisanie ciągom k symboli źródła, słów kodu przedrostkowego tak, że spełnione jest
H(S) ≤ Lk / k < H(S) + 1 / k
asymptotycznie, możliwe jest uzyskanie średniej długości kodu (w przeliczeniu na pojedynczy symbol) równej entropii źródła
optymalna długość słowa kodowego dla symbolu o
prawdopodobieństwie p równa jest –log (p) (czyli autoinformacji dla tego symbolu)
można zbudować koder entropijny o efektywności bliskiej 100%
Jak wygenerować kod przedrostkowy?
Problem:
◦ Mamy wyznaczony przez model rozkład prawdopodobieństwa symboli źródła
p1, p2, p3, p4 ... pN, : ∑pi = 1
◦ Znamy optymalne długości słów kodowych (tj. przybliżone długości słów optymalnego kodu przedrostkowego)
l1, l2, l3, l4 ... lN : li = –log (pi)
◦ Wiemy jaki warunek muszą spełniać długości słów kodowych aby istniał kod jednoznacznie dekodowalny (nierówność Krafta)
∑2-li ≤ 1
Chcemy wyznaczyć
◦ Kod przedrostkowy o minimalnej średniej długości kodu
szukamy: dokładnych długości słów
szukamy: postaci (kolejnych bitów) słów
Algorytm Shannona-Fano generuje kod przedrostkowy dla zadanego rozkładu prawdopodobieństwa symboli alfabetu.
Krok 1:
Ustaw symbole alfabetu źródła w ciąg s uporządkowane zgodnie z prawdopodobieństwem ich użycia;
Krok 2:
AlgorytmShannonaFano(ciąg s) if (s zawiera dwa symbole)
dołącz 0 do słowa kodowego jednego z symboli, 1 do słowa drugiego symbolu;
elseif (s zawiera więcej niż dwa symbole)
podziel s na dwa podciągi s1 i s2 tak, by różnica między sumą prawdopodobieństw symboli w podciągach była najmniejsza;
dołącz 0 do słów kodowych symboli w s1 i 1 do słów symboli w s2;
AlgorytmShannonaFano(s1);
AlgorytmShannonaFano(s2);
endif;
Przykład: kodujemy ciąg abracadabra
W tabeli mamy ciąg symboli alfabetu źródła i kolejne kroki budowania słów kodowych
ciąg s c d r b a
częstość symbolu 1/11 1/11 2/11 2/11 5/11
ciąg s1 i s2 c d r b a
słowo symbolu 0 0 0 0 1
ciąg s11 i s12 c d r b
słowo symbolu 0 0 0 0 0 1 0 1
ciąg s111 i s112 c d słowo symbolu 0 0 0 0 0 1
ciąg s121 i s122 r b
słowo symbolu 0 1 0 0 1 1
wynik 0 0 0 0 0 1 0 1 0 0 1 1 1
Przykład: kodujemy ciąg abracadabra
Można wygenerować kod o innych długościach słów
ciąg s c d r b a
częstość symbolu 1/11 1/11 2/11 2/11 5/11
ciąg s1 i s2 c d r b a
słowo symbolu 0 0 0 0 1
ciąg s11 i s12 c d r b
słowo symbolu 0 0 0 0 0 0 0 1
ciąg s111 i s112 c d r
słowo symbolu 0 0 0 0 0 0 0 0 1 ciąg s1111 i s1112 c d
słowo symbolu 0 0 0 0 0 0 0 1
wynik 0 0 0 0 0 0 0 1 0 0 1 0 1 1
Algorytm Huffmana generuje kod przedrostkowy dla zadanego rozkładu prawdopodobieństwa symboli alfabetu
1. W algorytmie Huffmana buduje się drzewo binarne, zwane drzewem Huffmana.
Każdemu z liści odpowiada pojedynczy symbol alfabetu źródła.
Z każdym węzłem skojarzona jest waga równa łącznemu prawdopodobieństwu liści w poddrzewie dla którego ten węzeł jest korzeniem
2. Utwórz n drzew, gdzie n jest rozmiarem alfabetu źródła.
Każdemu z symboli alfabetu źródła odpowiada pojedyncze drzewo składające się wyłącznie z korzenia i mające wagę równą prawdopodobieństwu wystąpienia danego symbolu.
3. Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo, w którym dwa właśnie wyznaczone drzewa te są synami korzenia o wadze równej sumie ich wag.
Powtarzaj krok 2 aż pozostanie tylko jedno drzewo (n – 1 razy).
4. Słowo kodowe kodu Huffmana dla danego symbolu znajduje się przechodząc ścieżką od korzenia drzewa Huffmana do liścia odpowiadającego temu symbolowi (i-ty bit słowa kodowego ma wartość 0, jeżeli i-ta krawędź ścieżki prowadzi do lewego syna i-tego węzła, a 1 — jeżeli do prawego).
Przykład: kodujemy ciąg abracadabra
2. Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo, w którym dwa właśnie wyznaczone drzewa te są synami korzenia o wadze równej sumie ich wag. Powtarzaj krok 2 aż pozostanie tylko jedno drzewo
(n – 1 razy).
r 2/11 d
1/11 c
1/11 a
5/11
b 2/11
2/11 4/11
0
0 1
1
Przykład: kodujemy ciąg abracadabra
2. Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo, w którym dwa właśnie wyznaczone drzewa te są synami korzenia o wadze równej sumie ich wag.
Powtarzaj krok 2 aż pozostanie tylko jedno drzewo
(n – 1 razy).
r 2/11 d
1/11 c
1/11 a
5/11
b 2/11
2/11 4/11
6/11 1
1 0
0
0
0
1
1
1
r 2/11 d
1/11 c
1/11 a
5/11
b 2/11
2/11 4/11
6/11 1
1 0
0
0
0
1
1
1
3. Słowo kodowe kodu Huffmana dla danego symbolu znajduje się
przechodząc ścieżką od korzenia drzewa Huffmana do liścia
odpowiadającego temu symbolowi (i-ty bit słowa kodowego ma wartość 0, jeżeli i-ta krawędź ścieżki prowadzi do
lewego syna i-tego węzła, a 1 — jeżeli do prawego).
symbol słowo kodowe
a 0
b 1 0 0
c 1 0 1 0
d 1 0 1 1
r 1 1
Własności kodów Huffmana
Podobnie, jak algorytm Shannona-Fano, przedstawiony algorytm jest niedeterministyczny
niedeterminizm można łatwo usunąć – kanoniczne kodowanie Huffmana
Efektywnośc kodów Huffmana jest typowo nieznacznie większa niż Shannona-Fano (dla przykładu „abracadabra” jest taka sama)
algorytm Huffmana jest prostszy
symbol Shannon-Fano (1) Shannon-Fano (2) Huffman
a 1 1 0
b 0 1 1 0 1 1 0 0
c 0 0 0 0 0 0 0 1 0 1 0
d 0 0 1 0 0 0 1 1 0 1 1
r 0 1 0 0 0 1 1 1
Własności kodów Huffmana - cd
Kod wygenerowany algorytmem Huffmana jest optymalny w klasie kodów przedrostkowych
(gdy prawdopodobieństwa symboli są 2 -N, gdzie N jest nieujemną liczbą całkowitą, to kod jest optymalny, gdyż dla symbolu o
prawdopodobieństwie p optymalna długość słowa kodowego to – log (p) bitów)
Nieefektywność kodu Huffmana
Jednocześnie nieefektywność kodów przedrostkowych
pmax to prawdopodobieństwo najbardziej prawdopodobnego symbolu.
Kod Huffmana jest nieefektywny, gdy prawdopodobieństwo wystąpienia jednego z symboli jest duże, najbardziej gdy bliskie 1.
• długość słowa kodowego tego symbolu wynosi 1 bit
• optymalna długość słowa kodowego jest bliska 0
• zatem średnia długość kodu jest wielokrotnie większa od entropii rozkładu prawdopodobieństwa symboli.