Teoria informacji/TI Ćwiczenia 5: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian
Nie podano opisu zmian
Linia 50: Linia 50:
==== Treść ====
==== Treść ====


Dane wejściowe mają postać ciągu <math>\{a_i\}_1^n</math> znaków nad alfabetem <math>A = A_0 \cup A_1 \cup A_2 = \{spacja\} \cup \{'a',...,'z'\} \cup \{'0',...,'9'\}</math>. Kolejne znaki tego ciągu są generowane losowo z następującego rozkładu:
Dane wejściowe mają postać ciągu <math>\{a_i\}_1^n</math> symboli nad alfabetem <math>A = A_0 \cup A_1 \cup A_2 = \{spacja\} \cup \{'a',...,'z'\} \cup \{'0',...,'9'\}</math>. Kolejne znaki tego ciągu są generowane losowo z następującego rozkładu prawdopodobieństwa:
* symbol <math>a_1</math> jest generowany z rozkładu <math>(\mu_1+\mu_2)/2</math>,
* symbol <math>a_1</math> jest generowany z rozkładu <math>(\mu_1+\mu_2)/2</math>,
* jeśli <math>a_n \in A_0</math> , to <math>a_{n+1}</math> jest generowany z rozkładu <math>(\mu_1+\mu_2)/2</math>,
* jeśli <math>a_n \in A_0</math> , to <math>a_{n+1}</math> jest generowany z rozkładu <math>(\mu_1+\mu_2)/2</math>,
Linia 56: Linia 56:
* jeśli <math>a_n \in A_2</math> , to <math>a_{n+1}</math> jest generowany z rozkładu <math>(\mu_0+\mu_2)/2</math>,
* jeśli <math>a_n \in A_2</math> , to <math>a_{n+1}</math> jest generowany z rozkładu <math>(\mu_0+\mu_2)/2</math>,
gdzie:
gdzie:
* <math>\mu_1</math> to rozkład jednopunktowy na zbiorze <math>A_0</math> ,
* <math>\mu_0</math> to rozkład jednopunktowy na zbiorze <math>A_0</math> ,
* <math>\mu_1</math> to pewien ustalony rozkład prawdopodobieństwa na zbiorze <math>A_1</math> ,
* <math>\mu_1</math> to pewien ustalony rozkład prawdopodobieństwa na zbiorze <math>A_1</math> ,
* <math>\mu_2</math> to pewien ustalony rozkład prawdopodobieństwa na zbiorze <math>A_2</math> .
* <math>\mu_2</math> to pewien ustalony rozkład prawdopodobieństwa na zbiorze <math>A_2</math> .
Linia 62: Linia 62:
==== Polecenie ====
==== Polecenie ====


# Opracuj możliwie najskuteczniejszą metodę kompresji danych o powyższej charakterystyce, opartą na kodowaniu Huffmana.
# Opracuj możliwie najskuteczniejszą metodę kompresji danych o powyższej charakterystyce, opartą na kodowaniu Huffmana. Zaimplementuj ją.
# Oszacuj teoretycznie ile średnio bitów <math>L</math> pliku skompresowanego będzie przypadało na jeden symbol pliku wejściowego. Przyjmij, że znana jest entropia rozkładów <math>\mu_1</math> i <math>\mu_2</math> .
# Wykonaj eksperymenty, aby sprawdzić swoje przewidywania. Wygeneruj kilka ciągów o podanej wyżej charakterystyce, dla różnych wyborów rozkładów <math>\mu_1</math> i <math>\mu_2</math> , skompresuj je Twoją metodą i porównaj rozmiary plików wejściowych i wynikowych.
# Oszacuj teoretycznie wartość <math>L</math> dla zwykłej kompresji Huffmana zastosowanej do danych o podanej charakterystyce. Czy Twój algorytm osiąga lepszą kompresję?
# Jaka dodatkowa informacja musiałaby być zapisana w skompresowanym pliku, aby umożliwić jego dekompresję? Oszacuj jej rozmiar.

Wersja z 17:06, 30 lip 2006

Laboratorium

Zadanie 1

Treść

Rozważmy trzy warianty kompresji pliku tekstowego, które wykorzystują korelację między sąsiednimi symbolami do osiągnięcia większego stopnia kompresji:

  1. Kodowanie Huffmana zastosowane do bloków 2 symboli.
  2. Kodowanie kolejnego symbolu pliku, an+1, za pomocą kodu Huffmana, który zależy od symbolu poprzedniego, an.
    W algorytmie tym, dla każdego symbolu a występującego w pliku, obliczany jest warunkowy rozkład prawdopodobieństwa następnego symbolu, b, pod warunkiem a: p(b|a). Dla takiego rozkładu symboli b (przy ustalonym a) obliczany jest kod Huffmana φa. Kody są generowane dla wszystkich symboli a.
    Symbole pliku są kodowane kolejno, od pierwszego do ostatniego, przy czym symbol an+1 kodowany jest za pomocą kodu φan. Tak zakodowana wiadomość jest możliwa do odkodowania, ponieważ w chwili dekodowania an+1 symbol an jest już znany.
  3. Kodowanie analogiczne do (2), jednak przebiegające od końca pliku do początku, zatem korzystające z kodu φan+1 do zakodowania an. W tym przypadku φb jest kodem wygenerowanym dla rozkładu p(a|b) symboli a poprzedzających ustalony symbol b.

Polecenie

  1. Porównaj warianty (1) i (2) oraz (2) i (3) pod względem osiąganego stopnia kompresji:
    • Który z wariantów pozwoli uzyskać większy stopień kompresji? Czy zależy to od charakterystyki danych wejściowych? Jeśli to możliwe, podaj ścisły dowód.
    • Czy fakt, że znaki w pliku tekstowym są zapisane w "naturalnej" kolejności, czyli w takiej, w jakiej są odczytywane przez człowieka, pozwala na uzyskanie większego stopnia kompresji za pomocą metody (2) niż (3)?
    • Oprócz wariantów (1)-(3) rozważ też sytuację, gdy zamiast kodu Huffmana stosowany jest kod, którego średnia długość jest dokładnie równa entropii odpowiedniego rozkładu (dla zainteresowanych: kodowanie arytmetyczne jest metodą, która w pewnym sensie pozwala osiągnąć średnią długość kodu równą entropii; zob. arithmetic coding).
  2. Jaka jest złożoność pamięciowa i czasowa metod (1)-(3)?
  3. Napisz programy kompresuj1, kompresuj2 i kompresuj3, implementujące algorytmy (1)-(3). Wykonaj eksperymenty, które potwierdzą poprawność Twoich odpowiedzi na powyższe pytania.

Wskazówki

Wskazówka I:
Wskazówka II:

Rozwiązanie

Rozwiązanie zadania powinno zawierać:

  • wykonywalne programy,
  • kody źródłowe programów,
  • dane wejściowe wykorzystane do eksperymentów,
  • raport zawierający:
    • odpowiedzi na pytania, być może z dowodami,
    • opis wykonanych eksperymentów i wykorzystanych danych wejściowych,
    • interpretację wyników eksperymentów.

Pliki źródłowe i raport należy podpisać imieniem i nazwiskiem autora.

Ocenie podlegać będzie: poprawność i ścisłość rozumowania, poprawność implementacji, umiejętność zaplanowania eksperymentów i interpretacji ich wyników. Nie będzie brana pod uwagę efektywność czasowa i pamięciowa programów.


Zadanie 2

Treść

Dane wejściowe mają postać ciągu {ai}1n symboli nad alfabetem A=A0A1A2={spacja}{a,...,z}{0,...,9}. Kolejne znaki tego ciągu są generowane losowo z następującego rozkładu prawdopodobieństwa:

  • symbol a1 jest generowany z rozkładu (μ1+μ2)/2,
  • jeśli anA0 , to an+1 jest generowany z rozkładu (μ1+μ2)/2,
  • jeśli anA1 , to an+1 jest generowany z rozkładu (μ0+μ1)/2,
  • jeśli anA2 , to an+1 jest generowany z rozkładu (μ0+μ2)/2,

gdzie:

  • μ0 to rozkład jednopunktowy na zbiorze A0 ,
  • μ1 to pewien ustalony rozkład prawdopodobieństwa na zbiorze A1 ,
  • μ2 to pewien ustalony rozkład prawdopodobieństwa na zbiorze A2 .

Polecenie

  1. Opracuj możliwie najskuteczniejszą metodę kompresji danych o powyższej charakterystyce, opartą na kodowaniu Huffmana. Zaimplementuj ją.
  2. Oszacuj teoretycznie ile średnio bitów L pliku skompresowanego będzie przypadało na jeden symbol pliku wejściowego. Przyjmij, że znana jest entropia rozkładów μ1 i μ2 .
  3. Wykonaj eksperymenty, aby sprawdzić swoje przewidywania. Wygeneruj kilka ciągów o podanej wyżej charakterystyce, dla różnych wyborów rozkładów μ1 i μ2 , skompresuj je Twoją metodą i porównaj rozmiary plików wejściowych i wynikowych.
  4. Oszacuj teoretycznie wartość L dla zwykłej kompresji Huffmana zastosowanej do danych o podanej charakterystyce. Czy Twój algorytm osiąga lepszą kompresję?
  5. Jaka dodatkowa informacja musiałaby być zapisana w skompresowanym pliku, aby umożliwić jego dekompresję? Oszacuj jej rozmiar.