Teoria informacji/TI Ćwiczenia 1: Różnice pomiędzy wersjami
Nie podano opisu zmian |
m Zastępowanie tekstu – „<math> ” na „<math>” |
||
(Nie pokazano 10 wersji utworzonych przez 5 użytkowników) | |||
Linia 15: | Linia 15: | ||
:Które są maksymalne bezprefiksowe? }} | :Które są maksymalne bezprefiksowe? }} | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
:{0,01,11} - Jest kodem, nie jest bezprefiksowy (0 jest prefiksem 01). | :{0,01,11} - Jest kodem, nie jest bezprefiksowy (0 jest prefiksem 01). | ||
Linia 25: | Linia 26: | ||
</div> | </div> | ||
</div> | </div> | ||
{{cwiczenie|2 [Rozpoznawanie kodów]|Ćwiczenie 2| | {{cwiczenie|2 [Rozpoznawanie kodów]|Ćwiczenie 2| | ||
Czy istnieje algorytm, który dla dowolnego skończonego zbioru X nad alfabetem <math>\Sigma</math> stwierdza czy X jest kodem?}} | Czy istnieje algorytm, który dla dowolnego skończonego zbioru X nad alfabetem <math>\Sigma</math> stwierdza, czy X jest kodem?}} | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Należy sprawdzić, czy jakiś ciąg znaków można uzyskać więcej niż jednym sposobem. Czy można jakoś ograniczyć z góry długość ciągów, jakie wystarczy sprawdzić? | |||
</div> | |||
</div> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Wygodnym podejściem do problemu jest zbudowanie odpowiedniej struktury danych. Może być nią graf, | |||
którego wierzchołkami są sufiksy słow ze zbioru ''X'', a krawędź prowadzi z ''x'' do ''z'', jeśli | |||
istnieje <math>y \in X</math>, takie że <math>y = x z</math>. W zbiorze wierzchołków wyróżniamy | |||
podzbiór <math>U = \{ z : (\exists x, y \in X) \, y = x z \}</math>. Zbiór ''X'' nie jest | |||
kodem wtedy i tylko wtedy, gdy istnieje słowo posiadające faktoryzacje startujące z dwóch różnych słów | |||
<math>x, y \in X</math>. Łatwo sptawdzić, że jest to równoważne istnieniu w opisanym grafie ścieżki z pewnego wierzchołka <math>z \in U</math> do wierzchołka <math>\varepsilon</math>. | |||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Struktura opisana we Wskazówce 2 prowadzi do poniższego algorytmu. Wykorzystujemy w nim operację odwrotną do konkatenacji słów. Jeśli x i y są słowami takimi, że x jest prefiksem y, to niech <math>z=x^{-1}y \Longleftrightarrow xz=y</math>. | |||
'''function''' Code(X:set of words):boolean; | '''function''' Code(X:set of words):boolean; | ||
//Dla danego zbioru X określamy czy jest on kodem | //Dla danego zbioru X określamy czy jest on kodem | ||
'''var''' x,y : word; | '''var''' x,y : word; | ||
<math>U, \Delta , \, \Delta 1</math> : set of words; | |||
'''begin''' | '''begin''' | ||
<math>U:=\emptyset</math>; | |||
<math>\Delta :=\emptyset</math>; | |||
'''forall''' x '''in''' X '''do''' | '''forall''' x '''in''' X '''do''' | ||
'''forall''' y '''in''' X '''do''' | '''forall''' y '''in''' X '''do''' | ||
'''if''' x < y '''then''' | '''if''' x < y '''then''' <math>\Delta := \Delta \cup \{x^{-1}y\}</math>; | ||
'''while''' | '''while''' <math>( \Delta \neq \emptyset \, \wedge \, \varepsilon \not\in \Delta )</math> '''do''' | ||
'''begin''' | |||
'''forall''' x '''in''' | <math>U := U \cup \Delta</math>; | ||
<math>\Delta 1</math> := <math>\emptyset</math>; | |||
'''forall''' x '''in''' <math>\Delta</math> '''do''' | |||
'''forall''' y '''in''' X '''do''' | '''forall''' y '''in''' X '''do''' | ||
'''if''' x <math>\le</math> y '''then''' | '''if''' x <math>\le</math> y '''then''' <math>\Delta 1</math>:=<math>\Delta 1 \cup \{x^{-1}y\}</math>; | ||
'''else''' '''if''' y < x '''then''' <math>\Delta 1</math>:=<math>\Delta 1 \cup \{y^{-1}x\}</math>; | |||
<math>\Delta := \Delta 1 - U</math>; | |||
'''end'''; | '''end'''; | ||
'''if''' <math>\varepsilon \in | '''if''' <math>\varepsilon \in \Delta</math> '''then''' Code:=0 | ||
'''else''' Code:=1; | '''else''' Code:=1; | ||
'''end'''; | '''end'''; | ||
W pierwszej fazie, algorytm generuje zbiór ''U'' opisany we Wskazówce 2. Z kolei, w pętli '''while''', znajduje wszystkie sufiksy osiągalne z tego zbioru. | |||
Pętla zatrzymuje się, bo każdy jej obrót powieksza zbiór ''U''. Poprawność algorytmu wynika z uwagi we wskazówce 2. | |||
</div> | </div> | ||
</div> | </div> | ||
Linia 69: | Linia 87: | ||
{{cwiczenie|3 [Nieskończone kody]|Ćwiczenie 3| | {{cwiczenie|3 [Nieskończone kody]|Ćwiczenie 3| | ||
Definicja kodu nie zakłada że zawiera on skończenie wiele słów. Przykładem nieskończonego kodu jest zbiór <math>\{ 0^n1 | n \in \mathbb{N}\}</math>. | Definicja kodu nie zakłada, że zawiera on skończenie wiele słów. Przykładem nieskończonego kodu jest zbiór <math>\{ 0^n1 | n \in \mathbb{N}\}</math>. | ||
Udowodnij że każdy nieskończony kod również spełnia nierówność Krafta.}} | Udowodnij, że każdy nieskończony kod również spełnia nierówność Krafta.}} | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Załóżmy przeciwnie, że dla pewnego nieskończonego kodu X mamy <math>\sum_{s \in S} \frac{1}{r^{\ell (s)}}=1+\varepsilon</math>. Rozważmy kolejne podzbiory <math>X_1, X_2 \ldots</math> zbioru X zawierające słowa długości co najwyżej 1, 2, itd. | Załóżmy przeciwnie, że dla pewnego nieskończonego kodu X mamy <math>\sum_{s \in S} \frac{1}{r^{\ell (s)}}=1+\varepsilon</math>. Rozważmy kolejne podzbiory <math>X_1, X_2 \ldots</math> zbioru X zawierające słowa długości co najwyżej 1, 2, itd. | ||
Linia 80: | Linia 98: | ||
</div> | </div> | ||
</div> | </div> | ||
{{cwiczenie|4 [Maksymalne kody]|Ćwiczenie 4| | {{cwiczenie|4 [Maksymalne kody]|Ćwiczenie 4| | ||
Załóżmy że X jest maksymalnym zbiorem bezprefiksowym nad alfabetem <math>\Sigma</math> (żaden jego nadzbiór nie jest bezprefiskowy). Czy w takim przypadku nierówność Krafta zamienia się w równość (tzn. <math>\sum_{s \in X} \frac{1}{r^{\ell (s)}} = 1</math>)? }} | Załóżmy, że X jest maksymalnym zbiorem bezprefiksowym nad alfabetem <math>\Sigma</math> (żaden jego nadzbiór nie jest bezprefiskowy). Czy w takim przypadku nierówność Krafta zamienia się w równość (tzn. <math>\sum_{s \in X} \frac{1}{r^{\ell (s)}} = 1</math>)? }} | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span> | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Czy odpowiedź zależy od tego czy X jest skończony? | Czy odpowiedź zależy od tego czy X jest skończony? | ||
Linia 94: | Linia 111: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"> | ||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
W przypadku skończonego X rzeczywiście tak jest. Niech <math>\ell</math> będzie maksymalną długością słowa w X. Wtedy jeśli nierówność Krafta jest ścisła, | W przypadku skończonego X rzeczywiście tak jest. Niech <math>\ell</math> będzie maksymalną długością słowa w X. Wtedy, jeśli nierówność Krafta jest ścisła, któreś słowo długości <math>\ell</math> nie posiada żadnego prefiksu w X - czyli można X rozszerzyć o to słowo. | ||
Inna sytuacja ma miejsce gdy X jest nieskończony. Wtedy nawet dla niewielkiej sumy Krafta możemy zapewnić żeby każde słowo było prefiksem jakiegoś słowa w X. Przykładowo dla alfabetu binarnego weźmy zbiór słów <math>W3=\{www: w \in \Sigma^ | Inna sytuacja ma miejsce, gdy X jest nieskończony. Wtedy nawet dla niewielkiej sumy Krafta możemy zapewnić, żeby każde słowo było prefiksem jakiegoś słowa w X. Przykładowo, dla alfabetu binarnego weźmy zbiór słów <math>W3=\{www: w \in \Sigma^+\}</math> i usuńmy z niego wszystkie słowa, których pewien właściwy prefiks należy do W3 (zauważmy, że ta operacja nie usunie wszystkich słów). Tak uzyskany zbiór jest maksymalny bezprefiksowy, a suma Krafta dla niego jest nie większa niż suma Krafta dla W3, wynosząca <math>\sum_{s \in W3} \frac{1}{2^{\ell (s)}} = \sum_{i =1}^{\infty} \frac{2^i}{2^{3i}} = \sum_{i =1}^{\infty} 4^{-i} = \frac{1}{3}</math>. | ||
</div> | </div> | ||
</div> | </div> | ||
== Zadania domowe == | == Zadania domowe == | ||
Linia 108: | Linia 123: | ||
=== Zadanie 1 - Kody wyczerpujące alfabet === | === Zadanie 1 - Kody wyczerpujące alfabet === | ||
Mówimy że kod '''wyczerpuje''' alfabet, jeśli dowolny wystarczająco długi ciąg liter alfabetu zawsze rozpoczyna się od słowa kodowego (innymi słowy dowolny nieskończony ciąg liter da się rozłożyć na słowa kodowe). Pokaż że dla dowolnego skończonego kodu <math>X</math> dowolne dwa z poniższych warunków implikują trzeci: | Mówimy że kod '''wyczerpuje''' alfabet, jeśli dowolny wystarczająco długi ciąg liter alfabetu zawsze rozpoczyna się od słowa kodowego (innymi słowy dowolny nieskończony ciąg liter da się rozłożyć na słowa kodowe). Pokaż, że dla dowolnego skończonego kodu <math>X</math> dowolne dwa z poniższych warunków implikują trzeci: | ||
* <math>X</math> jest bezprefiksowy | * <math>X</math> jest bezprefiksowy | ||
Linia 114: | Linia 129: | ||
* <math>\sum_{s \in X} \frac{1}{r^{\ell (s)}} = 1</math> | * <math>\sum_{s \in X} \frac{1}{r^{\ell (s)}} = 1</math> | ||
Pokaż że żaden z tych warunków nie implikuje pozostałych dwóch. Czy założenie o skończoności kodu jest konieczne? | Pokaż, że żaden z tych warunków nie implikuje pozostałych dwóch. Czy założenie o skończoności kodu jest konieczne? | ||
=== Zadanie 2 - Ważenie monet === | === Zadanie 2 - Ważenie monet === | ||
Załóżmy że mamy <math>n \ge 3</math> monet, z których jedna jest fałszywa i różni się ciężarem od pozostałych (może być lżejsza lub cięższa). Naszym zadaniem jest znalezienie fałszywej monety i określenie czy jest cięższa czy lżejsza. Do dyspozycji mamy jedynie wagę szalkową, na której | Załóżmy, że mamy <math>n \ge 3</math> monet, z których jedna jest fałszywa i różni się ciężarem od pozostałych (może być lżejsza lub cięższa). Naszym zadaniem jest znalezienie fałszywej monety i określenie czy jest cięższa, czy lżejsza. Do dyspozycji mamy jedynie wagę szalkową, na szalki której możemy kłaść monety. Waga wskazuje zawsze jedną z trzech możliwości: lewa szalka cięższa, prawa szalka cięższa lub równowaga. | ||
* Jakie jest górne ograniczenie na liczbę monet <math>n</math> przy których może się nam to udać przy użyciu <math>k</math> ważeń? | * Jakie jest górne ograniczenie na liczbę monet <math>n</math>, przy których może się nam to udać przy użyciu <math>k</math> ważeń? | ||
* Opracuj strategię pozwalającą rozwiązać zadanie dla trzech ważeń i dwunastu monet. | * Opracuj strategię pozwalającą rozwiązać zadanie dla trzech ważeń i dwunastu monet. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | <span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span> | ||
<div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible-content" style="display:none"> | ||
Ponumeruj monety i spróbuj porównać ważenie do „Gry w 20 pytań”, pamiętając że tym razem na każde pytanie są trzy możliwe odpowiedzi. | Ponumeruj monety i spróbuj porównać ważenie do „Gry w 20 pytań”, pamiętając że tym razem na każde pytanie są trzy możliwe odpowiedzi. | ||
</div> | </div> | ||
</div> | </div> |
Aktualna wersja na dzień 22:17, 11 wrz 2023
Ćwiczenia
Ćwiczenie 1 [Definicja kodu]
Mamy dane zbiory:
- {0,01,11}
- {0,11,10}
- {00,01,10}
- {00,001,100}
- {1,010,110,001,000,101}
Określ:
- Które z nich są kodami?
- Które są bezprefiskowe?
- Które są maksymalne bezprefiksowe?
Rozwiązanie
Ćwiczenie 2 [Rozpoznawanie kodów]
Wskazówka 1
Wskazówka 2
Rozwiązanie
Ćwiczenie 3 [Nieskończone kody]
Definicja kodu nie zakłada, że zawiera on skończenie wiele słów. Przykładem nieskończonego kodu jest zbiór .
Udowodnij, że każdy nieskończony kod również spełnia nierówność Krafta.Rozwiązanie
Ćwiczenie 4 [Maksymalne kody]
Wskazówka
Rozwiązanie
Zadania domowe
Zadanie 1 - Kody wyczerpujące alfabet
Mówimy że kod wyczerpuje alfabet, jeśli dowolny wystarczająco długi ciąg liter alfabetu zawsze rozpoczyna się od słowa kodowego (innymi słowy dowolny nieskończony ciąg liter da się rozłożyć na słowa kodowe). Pokaż, że dla dowolnego skończonego kodu dowolne dwa z poniższych warunków implikują trzeci:
- jest bezprefiksowy
- wyczerpuje alfabet
Pokaż, że żaden z tych warunków nie implikuje pozostałych dwóch. Czy założenie o skończoności kodu jest konieczne?
Zadanie 2 - Ważenie monet
Załóżmy, że mamy monet, z których jedna jest fałszywa i różni się ciężarem od pozostałych (może być lżejsza lub cięższa). Naszym zadaniem jest znalezienie fałszywej monety i określenie czy jest cięższa, czy lżejsza. Do dyspozycji mamy jedynie wagę szalkową, na szalki której możemy kłaść monety. Waga wskazuje zawsze jedną z trzech możliwości: lewa szalka cięższa, prawa szalka cięższa lub równowaga.
- Jakie jest górne ograniczenie na liczbę monet , przy których może się nam to udać przy użyciu ważeń?
- Opracuj strategię pozwalającą rozwiązać zadanie dla trzech ważeń i dwunastu monet.
Wskazówka