Teoria informacji/TI Wykład 1: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Stromy (dyskusja | edycje)
Nie podano opisu zmian
Dorota (dyskusja | edycje)
Nie podano opisu zmian
Linia 13: Linia 13:
Zwykle udaje się to znacznie szybciej niż by to wynikało z pesymistycznego oszacowania.
Zwykle udaje się to znacznie szybciej niż by to wynikało z pesymistycznego oszacowania.
Czy jednak będzie to równie łatwe w przypadku odgadywania ''liczby''?
Czy jednak będzie to równie łatwe w przypadku odgadywania ''liczby''?
Zauważmy że w przeciwieństwie do słów w języku naturalnym, liczby całkowite w systemie dziesiętnym  
Zauważmy, że w przeciwieństwie do słów w języku naturalnym, liczby całkowite w systemie dziesiętnym  
(czy ogólnie k-arnym, dla k > 1)
(czy ogólnie k-arnym, dla k > 1)
są „ciasno upakowane”. Mianowicie dowolny ciąg znaków ze zbioru {0, 1, …, 9} przedstawia jakąś liczbę  
są „ciasno upakowane”. Mianowicie dowolny ciąg znaków ze zbioru {0, 1, …, 9} przedstawia jakąś liczbę  
(jeśli zignorujemy początkowe zera),  
(jeśli zignorujemy początkowe zera),  
podczas gdy bardzo niewiele ciągów utworzonych  
podczas gdy bardzo niewiele ciągów utworzonych  
z liter {a, b, …, z} jest sensownymi słowami. Wynika to między innymi z tego, że nasze „algorytmy” do komunikacji za pomocą słów wymagają znacznie więcej redundancji niż te do operowania liczbami. Tę redundancję szczególnie widać, gdy jest ona wprowadzana celowo.
z liter {a, b, …, z} to sensowne słowa. Wynika to między innymi z tego, że nasze „algorytmy” do komunikacji za pomocą słów wymagają znacznie więcej redundancji niż te do operowania liczbami. Tę redundancję szczególnie widać, gdy jest ona wprowadzana celowo.


Przykład: Wypełniając czek wpisujemy kwotę zarówno przy pomocy liczb, jak i słownie. Zajmuje to oczywiście znacznie więcej miejsca, ale dzięki temu nie musimy obawiać się że jakaś literówka zmieni wartość wpisanej kwoty.
Przykład: Wypełniając czek wpisujemy kwotę zarówno przy pomocy liczb, jak i słownie. Zajmuje to oczywiście znacznie więcej miejsca, ale dzięki temu nie musimy obawiać się, że jakaś literówka zmieni wartość wpisanej kwoty.
Podobnie postępujemy, gdy przekazując przez telefon na przykład
Podobnie postępujemy, gdy przekazując przez telefon na przykład
nazwę stolica Gruzji, mówimy: T jak Teresa, B jak Barbara, I jak Iwona, L jak Lucyna,
nazwę stolicy Gruzji, mówimy: T jak Teresa, B jak Barbara, I jak Iwona, L jak Lucyna,
I jak Iwona, S jak Stanisław, I jak Iwona. Radiowcy mają zresztą na tę okoliczność międzynarodowy standard,
I jak Iwona, S jak Stanisław, I jak Iwona. Radiowcy mają zresztą na tę okoliczność międzynarodowy standard,
tzw.
tzw.
Linia 28: Linia 28:


'''Teoria informacji''' charakteryzuje w sposób matematyczny  zapis, przesyłanie i odtwarzanie informacji.  
'''Teoria informacji''' charakteryzuje w sposób matematyczny  zapis, przesyłanie i odtwarzanie informacji.  
Dąży przy tym do pogodzenia
Dąży przy tym do pogodzenia
dwóch przeciwstawnych celów:
dwóch przeciwstawnych celów:
* zapisywania wiadomości jak najzwięźlej
* zapisywania wiadomości jak najzwięźlej
Linia 72: Linia 72:
takie, że <math> \alpha (m_n ) \ge \lfloor log_r n \rfloor > \lfloor log_r m_n \rfloor </math>
takie, że <math> \alpha (m_n ) \ge \lfloor log_r n \rfloor > \lfloor log_r m_n \rfloor </math>
(przyjmijmy, że <math> log_r 0 = - \infty </math>).
(przyjmijmy, że <math> log_r 0 = - \infty </math>).
Pozostaje zauważyć, że zbiór wszystkich takich <math> m_n </math> jest nieskończony. Istotnie, w przeciwnym razie, dla pewnego <math> m</math>  w tym zbiorze, mielibyśmy <math> m = m_n</math> i w
Pozostaje zauważyć, że zbiór wszystkich takich <math> m_n </math> jest nieskończony. W przeciwnym razie, dla pewnego <math> m</math>  w tym zbiorze, mielibyśmy <math> m = m_n</math> i w
konsekwencji <math> \alpha (m) \ge \lfloor log_r n \rfloor </math>, dla nieskończenie wielu <math>n</math>, co jest oczywiście niemożliwe.}}
konsekwencji <math> \alpha (m) \ge \lfloor log_r n \rfloor </math> dla nieskończenie wielu <math>n</math>, co jest oczywiście niemożliwe.}}




Linia 94: Linia 94:


Niektóre własności notacji mają szczególne znaczenie dla ich praktycznego zastosowania.
Niektóre własności notacji mają szczególne znaczenie dla ich praktycznego zastosowania.
Przyjrzyjmy się na przykład co się dzieje jeśli w naturalny sposób rozszerzymy notację  
Przyjrzyjmy się na przykład temu co się dzieje, jeśli w naturalny sposób rozszerzymy notację  
<math> \varphi : S \to \Sigma^*</math> do morfizmu <math> \hat\varphi: S^* \to \Sigma^*</math>:
<math> \varphi : S \to \Sigma^*</math> do morfizmu <math> \hat\varphi: S^* \to \Sigma^*</math>:
<center><math> \hat\varphi (s_1 \ldots s_i)= \varphi(s_1) \varphi(s_2) \ldots \varphi(s_i)</math></center>
<center><math> \hat\varphi (s_1 \ldots s_i)= \varphi(s_1) \varphi(s_2) \ldots \varphi(s_i)</math></center>


Mając dany wynikowy ciąg znaków, kluczowe znaczenie ma czy potrafimy odtworzyć jednoznacznie ciąg argumentów.  
Mając dany wynikowy ciąg znaków, kluczowe znaczenie ma to, czy potrafimy odtworzyć jednoznacznie ciąg argumentów.  




{{definicja|[Kod]|kod| Odwzorowanie <math> \varphi : S \to \Sigma^*</math> dla skończonego niepustego zbioru ''S'' jest '''kodem''', jeśli jego naturalne rozszerzenie do morfizmu <math> \hat\varphi</math> jest różnowartościowe. Mówimy że kod jest '''bezprefiksowy''' jeśli dodatkowo <math> \hat\varphi(s) \not\leq \hat\varphi(s') </math> dla <math>s \neq s'</math>.
{{definicja|[Kod]|kod| Odwzorowanie <math> \varphi : S \to \Sigma^*</math> dla skończonego niepustego zbioru ''S'' jest '''kodem''', jeśli jego naturalne rozszerzenie do morfizmu <math> \hat\varphi</math> jest różnowartościowe. Mówimy, że kod jest '''bezprefiksowy''', jeśli dodatkowo <math> \hat\varphi(s) \not\leq \hat\varphi(s') </math> dla <math>s \neq s'</math>.
}}
}}


Nietrudno jest widzieć, że własność bycia kodem lub bycia kodem bezprefiksowym zależy wyłącznie od postaci zbioru wartości funkcji <math>\varphi</math>, <math>\varphi(S)</math>.  
Nietrudno jest zauważyć, że własność bycia kodem lub bycia kodem bezprefiksowym zależy wyłącznie od postaci zbioru wartości funkcji <math>\varphi</math>, <math>\varphi(S)</math>.  
Ponadto dla każdego kodu <math>\varepsilon \not\in \varphi (S)</math>.  
Ponadto dla każdego kodu <math>\varepsilon \not\in \varphi (S)</math>.  


Łatwo też zauważyć, że każdy zbiór bezprefiksowy jest kodem. Istnieją oczywiście kody które nie są bezprefiksowe (np. dla <math>\varphi(S)=\{aa, baa, ba\}</math>), a nie każda notacja jest kodem (np. dla <math>\varphi(S)=\{a, ab, ba\}</math>).
Łatwo też zauważyć, że każdy zbiór bezprefiksowy jest kodem. Istnieją oczywiście kody, które nie są bezprefiksowe (np. dla <math>\varphi(S)=\{aa, baa, ba\}</math>), i notacje, które nie są kodami (np. dla <math>\varphi(S)=\{a, ab, ba\}</math>).


W dalszej części będziemy omijać daszek i utożsamiać <math>\hat\varphi</math> z <math>\varphi</math>.
W dalszej części będziemy omijać daszek i utożsamiać <math>\hat\varphi</math> z <math>\varphi</math>.


Aby kodować zbiór ''S'' o ''m'' elementach za pomocą alfabetu <math>\Sigma</math> o ''r'' elementach (dla <math>m,r \ge 2</math>), wystarczy oczywiście używać ciągów długości <math>\lceil \log_r m \rceil</math>. Wtedy <math>|\varphi(w)|\le|w|\cdot \lceil \log_r m \rceil</math>, dla dowolnego <math>w \in S^*</math>.  
Aby kodować zbiór ''S'' o ''m'' elementach za pomocą alfabetu <math>\Sigma</math> o ''r'' elementach (dla <math>m,r \ge 2</math>), wystarczy oczywiście używać ciągów długości <math>\lceil \log_r m \rceil</math>. Wtedy <math>|\varphi(w)|\le|w|\cdot \lceil \log_r m \rceil</math> dla dowolnego <math>w \in S^*</math>.  


Czasem możemy jednak wymyśleć bardziej efektywne kodowanie. Jeśli wiemy że jakieś obiekty z ''S'' pojawiają się częściej, możemy im przyporządkować krótsze ciągi znaków. W ten sposób średnio możemy uzyskać mniejsze <math>|\varphi(w)| </math>.
Czasem możemy jednak wymyślić bardziej efektywne kodowanie. Jeśli wiemy, że jakieś obiekty z ''S'' pojawiają się częściej, możemy im przyporządkować krótsze ciągi znaków. W ten sposób średnio możemy uzyskać mniejsze <math>|\varphi(w)| </math>.


Bliską analogią jest tu ''Gra w 20 pytań''. W tej grze jedna osoba wymyśla obiekt x (w domyśle z jakiegoś dużego zbioru możliwości ''S''), a druga osoba stara się go odgadnąć przez zadawanie pytań (co najwyżej 20), na które odpowiedzą może być tylko ''tak'' lub ''nie''. Ściśle biorąc, pytania są postaci:
Bliską analogią jest tu ''Gra w 20 pytań''. W tej grze jedna osoba wymyśla obiekt x (w domyśle z jakiegoś dużego zbioru możliwości ''S''), a druga osoba stara się go odgadnąć przez zadawanie pytań (co najwyżej 20), na które odpowiedzą może być tylko ''tak'' lub ''nie''. Ściśle biorąc, pytania są postaci:
Linia 119: Linia 119:




Łatwo zauważyć że <math>\lceil \log_2 |S| \rceil</math> pytań wystarczy do zidentyfikowania dowolnego obiektu w ''S''. Czy da się to zrobić lepiej?
Łatwo zauważyć, że <math>\lceil \log_2 |S| \rceil</math> pytań wystarczy do zidentyfikowania dowolnego obiektu w ''S''. Czy da się to zrobić lepiej?
W ogólności oczywiście nie. Dowolną strategię zadawania pytań możemy sobie wyobrazić jako drzewo binarne, z pytaniem w każdym wierzchołku i rozwiązaniami w liściach. Jeśli liści jest <math>2^k</math>, to drzewo musi oczywiście mieć głębokość co najmniej ''k''. Jednak jeśli niektóre rozwiązania są bardziej ''prawdopodobne'' niż inne, możemy zmniejszyć ''oczekiwaną'' liczbę pytań. (Faktycznie dopiero taka wersja tej gry jest interesująca.)
W ogólności oczywiście nie. Dowolną strategię zadawania pytań możemy sobie wyobrazić jako drzewo binarne, z pytaniem w każdym wierzchołku i rozwiązaniami w liściach. Jeśli liści jest <math>2^k</math>, to drzewo musi oczywiście mieć głębokość co najmniej ''k''. Jednak jeśli niektóre rozwiązania są bardziej ''prawdopodobne'' niż inne, możemy zmniejszyć ''oczekiwaną'' liczbę pytań. (Faktycznie dopiero taka wersja tej gry jest interesująca.)




Jak działa to w praktyce, możemy prześledzić na przykładzie prostej gry umieszczonej poniżej. Zadaniem czytelnika jest tu odgadnięcie wylosowanej przez komputer planety, przez zadanie komputerowi jak najmniejszej liczby pytań. Pytania są zawsze postaci: "Czy wylosowana planeta jest w zbiorze ...?" (zbiór jest definiowany przez zaznaczenie odpowiednich checkboxów). Komputer odpowiada tylko '''T''' lub '''N'''. Zachęcamy do zastanowienia się nad optymalną strategią dla każdego z podanych rozkładów prawdopodobieństwa, i porównanie ile pytań potrzeba średnio do znalezienia rozwiązania dla każdego z nich. Po rozegraniu sześciu gier na danym rozkładzie, komputer wyświetli ile pytań potrzeba przy optymalnej strategii (którą poznamy na następnych wykładach).
Jak działa to w praktyce, możemy prześledzić na przykładzie prostej gry umieszczonej poniżej. Zadaniem czytelnika jest tu odgadnięcie wylosowanej przez komputer planety poprzez zadanie komputerowi jak najmniejszej liczby pytań. Pytania są zawsze postaci: "Czy wylosowana planeta jest w zbiorze ...?" (zbiór jest definiowany przez zaznaczenie odpowiednich checkboxów). Komputer odpowiada tylko '''T''' lub '''N'''. Zachęcamy do zastanowienia się nad optymalną strategią dla każdego z podanych rozkładów prawdopodobieństwa i do porównania ile pytań potrzeba średnio do znalezienia rozwiązania dla każdego z nich. Po rozegraniu sześciu gier na danym rozkładzie, komputer wyświetli ile pytań potrzeba przy optymalnej strategii (którą poznamy na następnych wykładach).


<applet code="ZgadujZgadula" archive="images/3/3b/Gra.jar" width="750" height="550">
<applet code="ZgadujZgadula" archive="images/3/3b/Gra.jar" width="750" height="550">
Linia 142: Linia 142:




Korzystając z tych definicji, możemy powiedzieć że dowolny bezprefiksowy kod <math>\varphi:S\to \Sigma^*</math> indukuje drzewo nad <math>\Sigma</math>: :<math>T_\varphi = \{w: \exists s: w \le \varphi(s)\}</math>.  
Korzystając z tych definicji, możemy powiedzieć, że dowolny bezprefiksowy kod <math>\varphi:S\to \Sigma^*</math> indukuje drzewo nad <math>\Sigma</math>: :<math>T_\varphi = \{w: \exists s: w \le \varphi(s)\}</math>.  
W drugą stronę, dowolne drzewo <math>T \subset \Sigma^*</math> z |S| liśćmi indukuje bezprefiksowy kod nad ''S'' (z dokładnością do permutacji elementów zbioru ''S'').
W drugą stronę, dowolne drzewo <math>T \subset \Sigma^*</math> z |S| liśćmi indukuje bezprefiksowy kod nad ''S'' (z dokładnością do permutacji elementów zbioru ''S'').




Jak wspominaliśmy wcześniej, naszym zadaniem jest optymalizacja długości kodu, jednocześnie zabezpieczając się na przekłamania w czasie transmisji. Pierwszym krokiem będzie sprawdzenie jak krótkie mogą być długości słów kodowych.
Jak wspominaliśmy wcześniej, naszym zadaniem jest optymalizacja długości kodu i jednocześnie zabezpieczenie się na przekłamania w czasie transmisji. Pierwszym krokiem będzie sprawdzenie, jak krótkie mogą być długości słów kodowych.


Dla danego kodu <math>\varphi:S\to \Sigma^*</math>, niech <math>|\varphi|:S \to \mathbb{N}</math> określa ''funkcję długości'', zdefiniowaną jako <math>|\varphi|(s)= |\varphi(s)|</math>.
Dla danego kodu <math>\varphi:S\to \Sigma^*</math>, niech <math>|\varphi|:S \to \mathbb{N}</math> określa ''funkcję długości'', zdefiniowaną jako <math>|\varphi|(s)= |\varphi(s)|</math>.




{{twierdzenie|[Nierówność Krafta]|kraft| Niech <math>2 \le |S| < \infty </math> i niech <math>|\Sigma|=r</math>. Funkcja <math>\ell:S \to \mathbb{N}</math> jest funkcją długości (<math>\ell = |\varphi|</math>) dla pewnego bezprefiksowego kodu <math>\varphi:S\to \Sigma^*</math> wtedy i tylko wtedy gdy:
{{twierdzenie|[Nierówność Krafta]|kraft| Niech <math>2 \le |S| < \infty </math> i niech <math>|\Sigma|=r</math>. Funkcja <math>\ell:S \to \mathbb{N}</math> jest funkcją długości (<math>\ell = |\varphi|</math>) dla pewnego bezprefiksowego kodu <math>\varphi:S\to \Sigma^*</math> wtedy i tylko wtedy, gdy:
<center><math>\sum_{s \in S} \frac{1}{r^{\ell (s)}} \leq 1</math></center>}}
<center><math>\sum_{s \in S} \frac{1}{r^{\ell (s)}} \leq 1</math></center>}}


{{dowod||do_kraft|
{{dowod||do_kraft|
<math>\Rightarrow</math>
<math>\Rightarrow</math>
Jeśli wszystkie słowa <math>\varphi(S)</math> mają tą samą długość ''k'', to uwzględniając różnowartościowość <math>\varphi</math> dostajemy
Jeśli wszystkie słowa <math>\varphi(S)</math> mają tą samą długość ''k'', to uwzględniając różnowartościowość <math>\varphi</math>, dostajemy
<math>\sum_{s \in S} \frac{1}{r^{|\varphi (s)|}} \leq \frac{r^k}{r^k} = 1.</math>
<math>\sum_{s \in S} \frac{1}{r^{|\varphi (s)|}} \leq \frac{r^k}{r^k} = 1.</math>


Linia 162: Linia 162:
<center><math>P_s = \{ \varphi (s) v : v \in \Sigma^{k-i} \}</math></center>
<center><math>P_s = \{ \varphi (s) v : v \in \Sigma^{k-i} \}</math></center>


(czyli zbiór wszystkich liści na poziomie ''k'' poniżej <math>\varphi(s)</math> w pełnym <math>\Sigma</math>-drzewie). Łatwo teraz zauważyć że podmienienie <math>\varphi(s)</math> na cały zbiór <math>P_s</math> nie zmieni sumy:
(czyli zbiór wszystkich liści na poziomie ''k'' poniżej <math>\varphi(s)</math> w pełnym <math>\Sigma</math>-drzewie). Łatwo teraz zauważyć, że podmienienie <math>\varphi(s)</math> na cały zbiór <math>P_s</math> nie zmieni sumy:
<center><math>\sum_{w \in P_s} \frac{1}{r^{|w|}} = \frac{r^{k-i}}{r^{k}} = \frac{1}{r^i}</math></center>
<center><math>\sum_{w \in P_s} \frac{1}{r^{|w|}} = \frac{r^{k-i}}{r^{k}} = \frac{1}{r^i}</math></center>


Linia 170: Linia 170:


<math>\Leftarrow</math>
<math>\Leftarrow</math>
Posortujmy elementy zbioru S względem rosnącej długości ich kodów <math>\ell (s)</math>, tak że <math>\ell (s_1 ) \leq \ldots \leq \ell (s_m )</math>. Indukcyjnie dla <math>i = 0,1, \ldots ,m-1</math> będziemy definiować <math> \varphi (s_{i+1})</math> jako ''leksykograficznie'' pierwsze słowo długości <math>\ell(s_{i+1})</math> które nie jest porównywalne z żadnym ze słów <math>\varphi (s_1), \ldots , \varphi (s_i)</math> (względem porządku prefiksowego). Jedyne co musimy pokazać to że takie słowo zawsze istnieje. Tak jak w poprzednim przypadku, oznaczmy przez <math>P_{s_j}</math> zbiór wszystkich węzłów rzędu <math>\ell(s_{i+1})</math> poniżej <math>\varphi(s_j)</math>. Łatwo sprawdzić że <math>|P_{s_j}| = r^{\ell (i+1)-\ell (j)}</math>. Warunkiem koniecznym i wystarczającym do istnienia szukanego wierzchołka jest
Posortujmy elementy zbioru S względem rosnącej długości ich kodów <math>\ell (s)</math>, tak że <math>\ell (s_1 ) \leq \ldots \leq \ell (s_m )</math>. Indukcyjnie dla <math>i = 0,1, \ldots ,m-1</math> będziemy definiować <math> \varphi (s_{i+1})</math> jako ''leksykograficznie'' pierwsze słowo długości <math>\ell(s_{i+1})</math> które nie jest porównywalne z żadnym ze słów <math>\varphi (s_1), \ldots , \varphi (s_i)</math> (względem porządku prefiksowego). Jedyne co musimy pokazać, to że takie słowo zawsze istnieje. Tak jak w poprzednim przypadku, oznaczmy przez <math>P_{s_j}</math> zbiór wszystkich węzłów rzędu <math>\ell(s_{i+1})</math> poniżej <math>\varphi(s_j)</math>. Łatwo sprawdzić, że <math>|P_{s_j}| = r^{\ell (i+1)-\ell (j)}</math>. Warunkiem koniecznym i wystarczającym do istnienia szukanego wierzchołka jest
<center><math> r^{\ell (i+1)-\ell (1)} +  r^{\ell (i+1)-\ell (2)}+ \ldots + r^{\ell (i+1)-\ell (i)} < r^{\ell (i+1)}</math></center>
<center><math> r^{\ell (i+1)-\ell (1)} +  r^{\ell (i+1)-\ell (2)}+ \ldots + r^{\ell (i+1)-\ell (i)} < r^{\ell (i+1)}</math></center>


Linia 176: Linia 176:
<center><math> \frac{1}{r^{\ell (1)}} +  \frac{1}{r^{\ell (2)}}+ \ldots + \frac{1}{r^{\ell (i)}} < 1</math></center>
<center><math> \frac{1}{r^{\ell (1)}} +  \frac{1}{r^{\ell (2)}}+ \ldots + \frac{1}{r^{\ell (i)}} < 1</math></center>


To z kolej jest spełnione na mocy założenia dla każdego <math>i<m</math>.}}
To z kolei jest spełnione na mocy założenia dla każdego <math>i<m</math>.}}




Linia 185: Linia 185:
}}
}}


{{dowod||do_McMillan|Przypadek <math>|S| = 1</math> jest trywialny. Dla <math>|S|\ge 2</math> musi zachodzić również <math>r=|\Sigma| \ge 2</math>. Wystarczy wtedy pokazać że <math>\varphi</math> spełnia nierówność Krafta. Wprowadźmy oznaczenie <math> K = \sum_{s \in S} \frac{1}{r^{|\varphi (s)|}}</math> i załóżmy że ta nierówność nie jest spełniona, czyli <math>K>1</math>. Niech <math>\mathit{Min} = \min \{ |\varphi (s)| : s \in S \}</math>, <math>\mathit{Max} = \max \{ |\varphi (s)| : s \in S \}</math>. Rozważmy teraz
{{dowod||do_McMillan|Przypadek <math>|S| = 1</math> jest trywialny. Dla <math>|S|\ge 2</math> musi zachodzić również <math>r=|\Sigma| \ge 2</math>. Wystarczy wtedy pokazać, że <math>\varphi</math> spełnia nierówność Krafta. Wprowadźmy oznaczenie <math> K = \sum_{s \in S} \frac{1}{r^{|\varphi (s)|}}</math> i załóżmy, że ta nierówność nie jest spełniona, czyli <math>K>1</math>. Niech <math>\mathit{Min} = \min \{ |\varphi (s)| : s \in S \}</math>, <math>\mathit{Max} = \max \{ |\varphi (s)| : s \in S \}</math>. Rozważmy teraz
<center><math>K^n = \left( \sum_{s \in S} \frac{1}{r^{|\varphi (s)|}} \right)^n = \sum_{i = \mathit{Min} \cdot n}^{\mathit{Max}\cdot n} \frac{N_{n,i}}{r^i}</math></center>
<center><math>K^n = \left( \sum_{s \in S} \frac{1}{r^{|\varphi (s)|}} \right)^n = \sum_{i = \mathit{Min} \cdot n}^{\mathit{Max}\cdot n} \frac{N_{n,i}}{r^i}</math></center>


Gdzie <math>N_{n,i}</math> jest liczbą sekwencji <math>q_1, \ldots ,q_n \in S^n</math> takich że <math>i = |\varphi (q_1)| + \ldots + |\varphi (q_n)| =| \varphi (q_1 \ldots q_n)|</math>. Z warunku że <math>\varphi</math> jest kodem, wynika że każda sekwencja odpowiada innemu słowu długości i, a więc takich sekwencji jest nie więcej niż słów.
Gdzie <math>N_{n,i}</math> jest liczbą sekwencji <math>q_1, \ldots ,q_n \in S^n</math> takich, że <math>i = |\varphi (q_1)| + \ldots + |\varphi (q_n)| =| \varphi (q_1 \ldots q_n)|</math>. Z warunku, że <math>\varphi</math> jest kodem, wynika że każda sekwencja odpowiada innemu słowu długości i, a więc takich sekwencji <font color=red>nie ma</font> więcej niż słów.
<center><math>\frac{N_{n,i}}{r^i} \leq 1</math></center>
<center><math>\frac{N_{n,i}}{r^i} \leq 1</math></center>



Wersja z 17:52, 17 wrz 2006

Blaise Pascal (1623–1662)

Je n’ai fait celle-ci plus longue que parce que je n’ai pas eu le loisir de la faire plus courte.

(Napisałem ten [list] trochę dłuższy, gdyż nie miałem czasu napisać go krócej).

Blaise Pascal, Lettres provinciales, 1657


Notacja, co to takiego?

Na początek prosty eksperyment: Ktoś wymyśla słowo, a kto inny ma za zadanie je odgadnąć, zgadując literę po literze. Zwykle udaje się to znacznie szybciej niż by to wynikało z pesymistycznego oszacowania. Czy jednak będzie to równie łatwe w przypadku odgadywania liczby? Zauważmy, że w przeciwieństwie do słów w języku naturalnym, liczby całkowite w systemie dziesiętnym (czy ogólnie k-arnym, dla k > 1) są „ciasno upakowane”. Mianowicie dowolny ciąg znaków ze zbioru {0, 1, …, 9} przedstawia jakąś liczbę (jeśli zignorujemy początkowe zera), podczas gdy bardzo niewiele ciągów utworzonych z liter {a, b, …, z} to sensowne słowa. Wynika to między innymi z tego, że nasze „algorytmy” do komunikacji za pomocą słów wymagają znacznie więcej redundancji niż te do operowania liczbami. Tę redundancję szczególnie widać, gdy jest ona wprowadzana celowo.

Przykład: Wypełniając czek wpisujemy kwotę zarówno przy pomocy liczb, jak i słownie. Zajmuje to oczywiście znacznie więcej miejsca, ale dzięki temu nie musimy obawiać się, że jakaś literówka zmieni wartość wpisanej kwoty. Podobnie postępujemy, gdy przekazując przez telefon na przykład nazwę stolicy Gruzji, mówimy: T jak Teresa, B jak Barbara, I jak Iwona, L jak Lucyna, I jak Iwona, S jak Stanisław, I jak Iwona. Radiowcy mają zresztą na tę okoliczność międzynarodowy standard, tzw. alfabet fonetyczny: Alpha Bravo Charlie Delta... Yankee Zulu.

Teoria informacji charakteryzuje w sposób matematyczny zapis, przesyłanie i odtwarzanie informacji. Dąży przy tym do pogodzenia dwóch przeciwstawnych celów:

  • zapisywania wiadomości jak najzwięźlej
  • chronienia wiadomości przed przekłamaniami podczas transmisji.


Bertrand Russell (1872–1970)

Zacznijmy od prostego pytania. Czy istnieją wiadomości, których nie da się zapisać zwięźlej? Przypuśćmy, że wiadomość jest liczbą naturalną. Liczby naturalne można na wiele sposobów zapisać w języku polskim, na przykład sto dwadzieścia pięć, najmniejsza liczba doskonała, rok bitwy pod Grunwaldem itp. Jeśli jednak spróbujemy objąć wszystkie te sposoby „w ogólności”, natrafimy na słynny paradoks Berry'ego (podany przez B.Russela):

Niech n będzie najmniejszą liczbą naturalną której nie da się zdefiniować w języku polskim za pomocą mniej niż dwudziestu pięciu słów.

Ale przecież właśnie zdefiniowaliśmy tę liczbę - za pomocą powyższego zdania!

Istotne jest zatem prawidłowe zdefiniowanie notacji, która służy nam do definiowania liczb. Aby uniknąć paradoksów takich jak wyżej, notacja nie może być częścią badanego obiektu. Musi być czymś zewnętrznym, nadanym w celu rozróżniania pomiędzy obiektami.


Definicja [Notacja]

Notacją dla S nazywamy dowolną różnowartościową funkcję α:SΣ* gdzie Σ jest skończonym alfabetem.


Fakt

Jeśli |S|=m1 i |Σ|=r2 to dla pewnego sS zachodzi:
|α(s)|logrm

Dowód

Ciągów znaków z Σ o długości mniejszej niż k jest:
1+r+r2++rk1=rk1r1<rk
Podstawiając k=logrm, stwierdzamy że nie ma wystarczająco wiele ciągów krótszych niż k do oznaczenia wszystkich elementów S.


Wniosek

Jeśli α:NΣ* jest dowolną notacją dla liczb naturalnych, to dla nieskończenie wielu n musi zajść: α(n)>logrn.

Dowód

Oczywiście obcięcie α do {0,1,,n1} jest także

notacją. Zatem z powyższego Faktu, dla każdego n>0 możemy wskazać mn{0,1,,n1} takie, że α(mn)logrn>logrmn (przyjmijmy, że logr0=). Pozostaje zauważyć, że zbiór wszystkich takich mn jest nieskończony. W przeciwnym razie, dla pewnego m w tym zbiorze, mielibyśmy m=mn i w

konsekwencji α(m)logrn dla nieskończenie wielu n, co jest oczywiście niemożliwe.


Jako zastosowanie, możemy podać teorioinformacyjny dowód znanego faktu:

Euklides (ok. 365p.n.e.-ok. 300p.n.e)

Fakt (Euklides)

Istnieje nieskończenie wiele liczb pierwszych.

Dowód

Załóżmy przeciwnie, że istnieje tylko M liczb pierwszych: p1,p2,,pM. Wprowadzamy notację α:{0,1,#}* w następujący sposób: Dla n=p1β1p2β2pMβM niech
α(n)=bin(β1)#bin(β2)##bin(βM)

gdzie bin(β) jest zwykłym zapisem binarnym liczby β (a więc |bin(β)|1+log2β).

Ponieważ 2βipiβin, mamy βilog2n, dla wszystkich i. A zatem

|α(n)|M(1+log2log2n)
dla wszystkich n, co oczywiście przeczy twierdzeniu że dla nieskończenie wielu n |a(n)|log3n.

Kody

Niektóre własności notacji mają szczególne znaczenie dla ich praktycznego zastosowania. Przyjrzyjmy się na przykład temu co się dzieje, jeśli w naturalny sposób rozszerzymy notację φ:SΣ* do morfizmu φ^:S*Σ*:

φ^(s1si)=φ(s1)φ(s2)φ(si)

Mając dany wynikowy ciąg znaków, kluczowe znaczenie ma to, czy potrafimy odtworzyć jednoznacznie ciąg argumentów.


Definicja [Kod]

Odwzorowanie φ:SΣ* dla skończonego niepustego zbioru S jest kodem, jeśli jego naturalne rozszerzenie do morfizmu φ^ jest różnowartościowe. Mówimy, że kod jest bezprefiksowy, jeśli dodatkowo φ^(s)≰φ^(s) dla ss.

Nietrudno jest zauważyć, że własność bycia kodem lub bycia kodem bezprefiksowym zależy wyłącznie od postaci zbioru wartości funkcji φ, φ(S). Ponadto dla każdego kodu ε∉φ(S).

Łatwo też zauważyć, że każdy zbiór bezprefiksowy jest kodem. Istnieją oczywiście kody, które nie są bezprefiksowe (np. dla φ(S)={aa,baa,ba}), i notacje, które nie są kodami (np. dla φ(S)={a,ab,ba}).

W dalszej części będziemy omijać daszek i utożsamiać φ^ z φ.

Aby kodować zbiór S o m elementach za pomocą alfabetu Σ o r elementach (dla m,r2), wystarczy oczywiście używać ciągów długości logrm. Wtedy |φ(w)||w|logrm dla dowolnego wS*.

Czasem możemy jednak wymyślić bardziej efektywne kodowanie. Jeśli wiemy, że jakieś obiekty z S pojawiają się częściej, możemy im przyporządkować krótsze ciągi znaków. W ten sposób średnio możemy uzyskać mniejsze |φ(w)|.

Bliską analogią jest tu Gra w 20 pytań. W tej grze jedna osoba wymyśla obiekt x (w domyśle z jakiegoś dużego zbioru możliwości S), a druga osoba stara się go odgadnąć przez zadawanie pytań (co najwyżej 20), na które odpowiedzą może być tylko tak lub nie. Ściśle biorąc, pytania są postaci: czy xS?, gdzie SS.


Łatwo zauważyć, że log2|S| pytań wystarczy do zidentyfikowania dowolnego obiektu w S. Czy da się to zrobić lepiej? W ogólności oczywiście nie. Dowolną strategię zadawania pytań możemy sobie wyobrazić jako drzewo binarne, z pytaniem w każdym wierzchołku i rozwiązaniami w liściach. Jeśli liści jest 2k, to drzewo musi oczywiście mieć głębokość co najmniej k. Jednak jeśli niektóre rozwiązania są bardziej prawdopodobne niż inne, możemy zmniejszyć oczekiwaną liczbę pytań. (Faktycznie dopiero taka wersja tej gry jest interesująca.)


Jak działa to w praktyce, możemy prześledzić na przykładzie prostej gry umieszczonej poniżej. Zadaniem czytelnika jest tu odgadnięcie wylosowanej przez komputer planety poprzez zadanie komputerowi jak najmniejszej liczby pytań. Pytania są zawsze postaci: "Czy wylosowana planeta jest w zbiorze ...?" (zbiór jest definiowany przez zaznaczenie odpowiednich checkboxów). Komputer odpowiada tylko T lub N. Zachęcamy do zastanowienia się nad optymalną strategią dla każdego z podanych rozkładów prawdopodobieństwa i do porównania ile pytań potrzeba średnio do znalezienia rozwiązania dla każdego z nich. Po rozegraniu sześciu gier na danym rozkładzie, komputer wyświetli ile pytań potrzeba przy optymalnej strategii (którą poznamy na następnych wykładach).

<applet code="ZgadujZgadula" archive="images/3/3b/Gra.jar" width="750" height="550"> </applet>


Dla jakiego rozkładu prawdopodobieństwa odgadnięcie rozwiązania wymaga największej liczby pytań?


Kody bezprefiksowe jako drzewa

Sformalizujmy teraz nasze strategie jako metody kodowania losowanych obiektów. Drzewem nad zbiorem X (albo krócej 'X-drzewem'), będziemy nazywać dowolny niepusty zbiór TX* zamknięty na operację brania prefiksu. Relację bycia prefiksem będziemy oznaczać przez . W X-drzewie dowolny element w jest węzłem rzędu |w|, ε jest korzeniem, -maksymalne węzły są liśćmi.

Dodatkowo będziemy posługiwać się następującymi pojęciami: dla dowolnego wT, xX i vX*:

  • wx jest bezpośrednim następnikiem (lub dzieckiem) w
  • wv jest poniżej w
  • zbiór Tw={v:wvT} nazywamy poddrzewem indukowanym przez w


Korzystając z tych definicji, możemy powiedzieć, że dowolny bezprefiksowy kod φ:SΣ* indukuje drzewo nad Σ: :Tφ={w:s:wφ(s)}. W drugą stronę, dowolne drzewo TΣ* z |S| liśćmi indukuje bezprefiksowy kod nad S (z dokładnością do permutacji elementów zbioru S).


Jak wspominaliśmy wcześniej, naszym zadaniem jest optymalizacja długości kodu i jednocześnie zabezpieczenie się na przekłamania w czasie transmisji. Pierwszym krokiem będzie sprawdzenie, jak krótkie mogą być długości słów kodowych.

Dla danego kodu φ:SΣ*, niech |φ|:S określa funkcję długości, zdefiniowaną jako |φ|(s)=|φ(s)|.


Twierdzenie [Nierówność Krafta]

Niech 2|S|< i niech |Σ|=r. Funkcja :S jest funkcją długości (=|φ|) dla pewnego bezprefiksowego kodu φ:SΣ* wtedy i tylko wtedy, gdy:
sS1r(s)1

Dowód

Jeśli wszystkie słowa φ(S) mają tą samą długość k, to uwzględniając różnowartościowość φ, dostajemy sS1r|φ(s)|rkrk=1.

Jeśli teraz mamy słowa różnej długości, to oznaczmy przez k maksymalną długość φ(s). Następnie dla każdego s mierzymy długość jego kodu |φ(s)|=i i definiujemy

Ps={φ(s)v:vΣki}

(czyli zbiór wszystkich liści na poziomie k poniżej φ(s) w pełnym Σ-drzewie). Łatwo teraz zauważyć, że podmienienie φ(s) na cały zbiór Ps nie zmieni sumy:

wPs1r|w|=rkirk=1ri

a zbiory Ps,Ps są parami rozłączne. Tym samym

sS1r|φ(s)|=sSwPs1r|w|rkrk=1

Posortujmy elementy zbioru S względem rosnącej długości ich kodów (s), tak że (s1)(sm). Indukcyjnie dla i=0,1,,m1 będziemy definiować φ(si+1) jako leksykograficznie pierwsze słowo długości (si+1) które nie jest porównywalne z żadnym ze słów φ(s1),,φ(si) (względem porządku prefiksowego). Jedyne co musimy pokazać, to że takie słowo zawsze istnieje. Tak jak w poprzednim przypadku, oznaczmy przez Psj zbiór wszystkich węzłów rzędu (si+1) poniżej φ(sj). Łatwo sprawdzić, że |Psj|=r(i+1)(j). Warunkiem koniecznym i wystarczającym do istnienia szukanego wierzchołka jest

r(i+1)(1)+r(i+1)(2)++r(i+1)(i)<r(i+1)

co można zapisać jako

1r(1)+1r(2)++1r(i)<1
To z kolei jest spełnione na mocy założenia dla każdego i<m.


Jeśli kod nie jest bezprefiksowy, nierówność Krafta wciąż jest spełniona, co można pokazać za pomocą sprytnej techniki.


Twierdzenie (Mcmillan)

Dla dowolnego kodu φ:SΣ* istnieje bezprefiksowy kod φ dla którego |φ|=|φ|

Dowód

{{{3}}}