Teoria informacji/TI Ćwiczenia 4: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 35: | Linia 35: | ||
== Zadanie 2 == | == Zadanie 2 == | ||
Wykonaj następujący eksperyment: | Wykonaj następujący eksperyment aby sprawdzić, czy ponowna kompresja pliku już skompresowanego może pozwolić na dalsze zmniejszenie rozmiaru pliku: | ||
# Przygotuj plik <tt>dane.txt</tt> zawierający tekst w języku naturalnym (polskim lub angielskim) o długości przynajmniej 50000 znaków. | # Przygotuj plik <tt>dane.txt</tt> zawierający tekst w języku naturalnym (polskim lub angielskim) o długości przynajmniej 50000 znaków. | ||
# Skompresuj <tt>dane.txt</tt> [[Teoria informacji/TI Wykład 3#huffman|algorytmem Huffmana]], zapisując zakodowaną informację do pliku <tt>wynik.huf</tt> (możesz wykorzystać program <tt>kompresuj</tt> z zadania 1). Dla ułatwienia możesz każdy wynikowy bit zapisywać na oddzielnym bajcie, jako znak "0" lub "1". | # Skompresuj <tt>dane.txt</tt> [[Teoria informacji/TI Wykład 3#huffman|algorytmem Huffmana]], zapisując zakodowaną informację do pliku <tt>wynik.huf</tt> (możesz wykorzystać program <tt>kompresuj</tt> z zadania 1). Dla ułatwienia możesz każdy wynikowy bit zapisywać na oddzielnym bajcie, jako znak "0" lub "1". | ||
# Wynikowy ciąg bitów skompresuj [[Teoria informacji/TI Wykład 3#huffman|algorytmem Huffmana]], zastosowanym [[Teoria informacji/TI Wykład 3#kodowanie par|do | # Wynikowy ciąg bitów skompresuj [[Teoria informacji/TI Wykład 3#huffman|algorytmem Huffmana]], zastosowanym [[Teoria informacji/TI Wykład 3#kodowanie par|do bloków]] 1, 2, 4, 8 i 16 bitów, otrzymując pięć kolejnych plików: <tt>wynik01.huf</tt>, <tt>wynik02.huf</tt>, <tt>wynik04.huf</tt>, <tt>wynik08.huf</tt>, <tt>wynik16.huf</tt> (możesz wykorzystać program <tt>kompresujbloki</tt> z zadania 1). | ||
# Porównaj liczbę bitów w plikach <tt>wynik.huf</tt> oraz <tt>wynik??.huf</tt>. | <!--# Porównaj liczbę bitów w plikach <tt>wynik.huf</tt> oraz <tt>wynik??.huf</tt>.--> | ||
Odpowiedz na pytania: | |||
# Czy poprzez powtórne zastosowanie tego samego algorytmu kodowania (tzn. algorytmu Huffmana dla bloków 1-elementowych) można osiągnąć mniejszy rozmiar pliku? Wyjaśnij dlaczego. | |||
# Czy poprzez powtórne zastosowanie innego algorytmu kodowania można osiągnąć mniejszy rozmiar pliku? Wyjaśnij dlaczego. | |||
# W praktyce, aby móc wykonać dekompresję, w nagłówku wynikowego pliku musiałby być też zapisany kod, użyty do zakodowania wiadomości. Oszacuj ile bajtów byłoby potrzebnych w takiej sytuacji na zapisanie każdego z pięciu kodów, użytych w pkt. 3 do powtórnej kompresji. | |||
# Czy powtórne zastosowanie algorytmu Huffmana, być może z innym rozmiarem bloku, może spowodować zwiększenie rozmiaru pliku z nagłówkiem, czyli łącznego rozmiaru zakodowanej wiadomości i kodu, użytego do zakodowania? | |||
== Zadanie 3 == | == Zadanie 3 == | ||
Linia 47: | Linia 52: | ||
Wykonaj następujący eksperyment: | Wykonaj następujący eksperyment: | ||
# Przygotuj plik <tt>dane.txt</tt> zawierający tekst w języku naturalnym (polskim lub angielskim) o długości przynajmniej 50000 znaków. | # Przygotuj plik <tt>dane.txt</tt> zawierający tekst w języku naturalnym (polskim lub angielskim) o długości przynajmniej 50000 znaków. | ||
# Wygeneruj [[Teoria informacji/TI Wykład 3#huffman|kody Huffmana]] <math>\varphi_1</math>, <math>\varphi_2</math> i <math>\varphi_3</math> [[Teoria informacji/TI Wykład 3#kodowanie par|dla | # Wygeneruj [[Teoria informacji/TI Wykład 3#huffman|kody Huffmana]] <math>\varphi_1</math>, <math>\varphi_2</math> i <math>\varphi_3</math> [[Teoria informacji/TI Wykład 3#kodowanie par|dla bloków]] 1, 2 i 3 symboli pliku <tt>dane.txt</tt>. | ||
# Wygeneruj losowy ciąg 10000 bitów i zapisz do pliku <tt>kod.huf</tt>. | # Wygeneruj losowy ciąg 10000 bitów i zapisz do pliku <tt>kod.huf</tt>. | ||
# Odczytaj 1000 symboli poprzez "zdekodowanie" pliku <tt>kod.huf</tt> (tak jakby był to plik skompresowany), używając każdego z kodów <math>\varphi_1</math>, <math>\varphi_2</math> i <math>\varphi_3</math>. Wynik dekodowania zapisz do plików <tt>dekod1.txt</tt>, <tt>dekod2.txt</tt> i <tt>dekod3.txt</tt>. | # Odczytaj 1000 symboli poprzez "zdekodowanie" pliku <tt>kod.huf</tt> (tak jakby był to plik skompresowany), używając każdego z kodów <math>\varphi_1</math>, <math>\varphi_2</math> i <math>\varphi_3</math>. Wynik dekodowania zapisz do plików <tt>dekod1.txt</tt>, <tt>dekod2.txt</tt> i <tt>dekod3.txt</tt>. | ||
Linia 54: | Linia 59: | ||
# Czy każdy ciąg bitów można zdekodować za pomocą [[Teoria informacji/TI Wykład 3#huffman|kodów Huffmana]] <math>\varphi_i</math>? A za pomocą dowolnego kodu, niekoniecznie będącego kodem Huffmana? | # Czy każdy ciąg bitów można zdekodować za pomocą [[Teoria informacji/TI Wykład 3#huffman|kodów Huffmana]] <math>\varphi_i</math>? A za pomocą dowolnego kodu, niekoniecznie będącego kodem Huffmana? | ||
# Ile bitów pliku <tt>kod.huf</tt> musiałeś zdekodować w każdym z 3 przypadków, aby uzyskać 1000 symboli? W którym przypadku liczba bitów była największa, a w którym najmniejsza? Dlaczego są one różne dla każdego przypadku? | # Ile bitów pliku <tt>kod.huf</tt> musiałeś zdekodować w każdym z 3 przypadków, aby uzyskać 1000 symboli? W którym przypadku liczba bitów była największa, a w którym najmniejsza? Dlaczego są one różne dla każdego przypadku? | ||
# Jak można przewidzieć te wartości bez wykonywania eksperymentu, znając jedynie kod <math>\varphi_i</math>? | # Jak można przewidzieć te wartości bez wykonywania eksperymentu, znając jedynie kod <math>\varphi_i</math>? Podaj odpowiedni wzór. | ||
# Który z plików <tt>dekod*.txt</tt> jest najbardziej podobny do pliku <tt>dane.txt</tt>? | # Który z plików <tt>dekod*.txt</tt> jest najbardziej podobny do pliku <tt>dane.txt</tt>? |
Wersja z 19:08, 1 wrz 2006
Laboratorium
Zadanie 1
Polecenie
- Przygotuj trzy pliki, zawierające tekst w trzech różnych językach: polskim, angielskim i trzecim dowolnie wybranym. Każdy plik powinien zawierać przynajmniej 50000 znaków. Duży wybór tekstów w różnych językach można znaleźć na przykład na stronie Projektu Gutenberg.
- Napisz program litery, który czyta plik tekstowy o podanej nazwie (przekazanej jako parametr wywołania programu) i wypisuje wszystkie symbole występujące w pliku wraz z ich częstością, w formie: A 0.134 <nowa_linia> b 0.126 ... Nie musi poprawnie wypisywać znaków narodowych. Program powinien wypisać też entropię binarną obliczonego rozkładu prawdopodobieństwa. Uruchom program dla trzech przygotowanych wcześniej plików, porównaj otrzymane wyniki.
- Napisz program huffman, który czyta plik tekstowy o podanej nazwie i oblicza kod Huffmana dla rozkładu symboli występujących w tym pliku. Program powinien wypisać otrzymany kod w formie: A 001 <nowa_linia> b 0001010 ...
Napisz program shannon, który oblicza kod Shannona-Fano. - Napisz program kompresuj, który koduje (kompresuje) podany plik tekstowy plik.txt za pomocą kodu Huffmana i Shannona-Fano. Wynik kodowania powinien zostać zapisany do plików plik.huf i plik.sf. Dla ułatwienia można każdy wynikowy bit zapisywać na oddzielnym bajcie, jako znak "0" lub "1".
- Uruchom program kompresuj dla trzech przygotowanych plików tekstowych. Dla każdego z nich porównaj następujące wielkości:
- liczbę bitów oryginalnego pliku,
- liczbę znaków "0"/"1" w plikach .huf i .sf,
- entropię rozkładu prawdopodobieństwa symboli w oryginalnym pliku.
Czy te wielkości zależą od języka kompresowanego tekstu?
- Napisz program kompresujbloki, który kompresuje podany plik metodą Huffmana i Shannona-Fano, zastosowanymi do bloków długości 2, 3, 4 lub więcej (tzn. kod jest generowany nie dla pojedynczych symboli, lecz dla par, trójek, czwórek ... sąsiednich symboli). Porównaj efektywność kompresji pojedynczych symboli i bloków, pod względem:
- rozmiaru zakodowanego pliku,
- rozmiaru kodu (aby móc w praktyce wykonać dekompresję, kod musiałby być zapisany razem z zakodowaną informacją),
- złożoności czasowej i pamięciowej algorytmu.
Prowadzący laboratorium może zrezygnować z części zadania, np. z implementacji kodowania Shannona-Fano.
Rozwiązanie
Rozwiązanie zadania powinno zawierać:
- wykonywalne programy,
- kody źródłowe programów,
- pliki tekstowe wykorzystane do eksperymentów,
- raport z analizą otrzymanych wyników i odpowiedziami na postawione wyżej pytania.
Pliki źródłowe i raport należy podpisać imieniem i nazwiskiem autora.
Ocenie podlegać będzie poprawność implementacji oraz umiejętność analizy i interpretacji wyników eksperymentalnych. Dodatkowe programy, eksperymenty, komentarze będą mile widziane. Nie będzie natomiast brana pod uwagę efektywność czasowa i pamięciowa programów.
Zadanie 2
Wykonaj następujący eksperyment aby sprawdzić, czy ponowna kompresja pliku już skompresowanego może pozwolić na dalsze zmniejszenie rozmiaru pliku:
- Przygotuj plik dane.txt zawierający tekst w języku naturalnym (polskim lub angielskim) o długości przynajmniej 50000 znaków.
- Skompresuj dane.txt algorytmem Huffmana, zapisując zakodowaną informację do pliku wynik.huf (możesz wykorzystać program kompresuj z zadania 1). Dla ułatwienia możesz każdy wynikowy bit zapisywać na oddzielnym bajcie, jako znak "0" lub "1".
- Wynikowy ciąg bitów skompresuj algorytmem Huffmana, zastosowanym do bloków 1, 2, 4, 8 i 16 bitów, otrzymując pięć kolejnych plików: wynik01.huf, wynik02.huf, wynik04.huf, wynik08.huf, wynik16.huf (możesz wykorzystać program kompresujbloki z zadania 1).
Odpowiedz na pytania:
- Czy poprzez powtórne zastosowanie tego samego algorytmu kodowania (tzn. algorytmu Huffmana dla bloków 1-elementowych) można osiągnąć mniejszy rozmiar pliku? Wyjaśnij dlaczego.
- Czy poprzez powtórne zastosowanie innego algorytmu kodowania można osiągnąć mniejszy rozmiar pliku? Wyjaśnij dlaczego.
- W praktyce, aby móc wykonać dekompresję, w nagłówku wynikowego pliku musiałby być też zapisany kod, użyty do zakodowania wiadomości. Oszacuj ile bajtów byłoby potrzebnych w takiej sytuacji na zapisanie każdego z pięciu kodów, użytych w pkt. 3 do powtórnej kompresji.
- Czy powtórne zastosowanie algorytmu Huffmana, być może z innym rozmiarem bloku, może spowodować zwiększenie rozmiaru pliku z nagłówkiem, czyli łącznego rozmiaru zakodowanej wiadomości i kodu, użytego do zakodowania?
Zadanie 3
Wykonaj następujący eksperyment:
- Przygotuj plik dane.txt zawierający tekst w języku naturalnym (polskim lub angielskim) o długości przynajmniej 50000 znaków.
- Wygeneruj kody Huffmana , i dla bloków 1, 2 i 3 symboli pliku dane.txt.
- Wygeneruj losowy ciąg 10000 bitów i zapisz do pliku kod.huf.
- Odczytaj 1000 symboli poprzez "zdekodowanie" pliku kod.huf (tak jakby był to plik skompresowany), używając każdego z kodów , i . Wynik dekodowania zapisz do plików dekod1.txt, dekod2.txt i dekod3.txt.
Odpowiedz na pytania:
- Czy każdy ciąg bitów można zdekodować za pomocą kodów Huffmana ? A za pomocą dowolnego kodu, niekoniecznie będącego kodem Huffmana?
- Ile bitów pliku kod.huf musiałeś zdekodować w każdym z 3 przypadków, aby uzyskać 1000 symboli? W którym przypadku liczba bitów była największa, a w którym najmniejsza? Dlaczego są one różne dla każdego przypadku?
- Jak można przewidzieć te wartości bez wykonywania eksperymentu, znając jedynie kod ? Podaj odpowiedni wzór.
- Który z plików dekod*.txt jest najbardziej podobny do pliku dane.txt?