ASD Ćwiczenia 13: Różnice pomiędzy wersjami
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 25: | Linia 25: | ||
<math> P'[i]=j,\ P'[j]=k>0\ \Rightarrow \ i\ge k+j </math> | <math> P'[i]=j,\ P'[j]=k>0\ \Rightarrow \ i\ge k+j </math> | ||
Fakt ten wynika z lematu o okresowości i z definicji tablicy P'. | Fakt ten wynika z lematu o okresowości i z definicji tablicy P'. | ||
</div> | </div> | ||
Linia 218: | Linia 217: | ||
''(Rozwiązanie opracował Marcin Pilipczuk)'' | ''(Rozwiązanie opracował Marcin Pilipczuk)'' | ||
</div> | |||
</div> | |||
=='''Zadanie 9''' == | |||
Słowa cykliczne (de Bruijna): | |||
Słowo binarne w długości dokładnie <math> 2^n </math> nazwiemy cyklicznym (słowem de Bruijna, który to wymyślił) rzędu n gdy każde słowo binarne długości n jest podsłowem słowa ww. | |||
Następujący algorytm generuje takie słowo, co więcej jest ono leksykograficznie pierwsze spośród wszystkich możliwych | |||
Niech Cutfirst(x) oznacza obciecie x o pierwszy symbol, a Append(x,b) dopisanie litery b do słowa x na końcu. | |||
Algorytm Słowa-Cykliczne | |||
1 x := 1111..1 (n jedynek); | |||
2 Z := \emptyset ; wynik := słowo puste; | |||
3 while istnieje <math>b \in \{0,1\}</math> takie, że <math>Append(Cutfirst(x),b)\notin Z</math> do | |||
4 wybierz minimalne takie b ; | |||
5 Append(Cutfirst(x),b); | |||
6 insert(x,Z) ; | |||
7 Append(wynik,b); | |||
Na przykład dla n=3 wynik = 00010111, a dla n=2 wynik = 0011 | |||
Udowodnij poprawność algorytmu. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
Rozwiązanie | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Zadanie ma to związek z pewną metodą konstrukcji cyklu Eulera, chociaż zadanie pozornie wydaje się nie mieć nic wspólnego z grafami. | |||
Mamy tu do czynienia z grafem ktorego węzłami są wszystkie słowa binarne długości n-1. | |||
Istnieje krawędż u \rightarrow v o etykieci a, gdy Append(Cutfirst(u),a)=v. | |||
Ciąg operacji w algorytmie Słowa-Cykliczne odpowiada zachłannej ścieżce Eulera która startuje z węzła <math>1^{n-1}</math>. patrz zadania w module Algorytmy grafowe. | |||
</div> | </div> | ||
</div> | </div> |
Wersja z 17:02, 31 sie 2007
Zadanie 1
Uzasadnij poprawność algorytmu obliczającego długość najkrótszego słowa pokrywającego dany tekst.
Rozwiązanie
Zadanie 2
Udowodnij, że w wersji on-line algorytmu KMP mamy
Rozwiązanie
Zadanie 3
Udowodnij, że w wersji on-line algorytmu KMP mamy
Rozwiązanie
Zadanie 4
Mamy zbiór słów, każde długości dwa, obliczyć długość minimalnego tekstu który zawiera wszystkie słowa.
Rozwiązanie
Zadanie 5
Udowodnij następującą ciekawą własność kombinatoryczną okresowości w tekstach. Niech oznacza najmniejszy wspólny dzielnik p,q.
Lemat [Lemat o okresowości]
Jeśli x ma okresy p, q oraz , to jest również okresem x.
Rozwiązanie
Zadanie 6
Lemat o okresowości można wzmocnić, osłabiając założenia. Udowodnij następujący lemat.
Lemat [Silny lemat o okresowości]
Jeśli x ma okresy p, q oraz , to jest również okresem x.
Rozwiązanie
Zadanie 7
Udowdnij poprawność algorytmu KMP realtime
Rozwiązanie
Zadanie 8
Przprowadź dokładny dowód tego, że algorytm Oszczędny KMP wykonuje co najwyżej 3/2 n porównań (schemat dowodu był już opisany w odpowiednim module)
Rozwiązanie
Zadanie 9
Słowa cykliczne (de Bruijna): Słowo binarne w długości dokładnie nazwiemy cyklicznym (słowem de Bruijna, który to wymyślił) rzędu n gdy każde słowo binarne długości n jest podsłowem słowa ww.
Następujący algorytm generuje takie słowo, co więcej jest ono leksykograficznie pierwsze spośród wszystkich możliwych
Niech Cutfirst(x) oznacza obciecie x o pierwszy symbol, a Append(x,b) dopisanie litery b do słowa x na końcu.
Algorytm Słowa-Cykliczne
1 x := 1111..1 (n jedynek);
2 Z := \emptyset ; wynik := słowo puste;
3 while istnieje takie, że do
4 wybierz minimalne takie b ;
5 Append(Cutfirst(x),b);
6 insert(x,Z) ;
7 Append(wynik,b);
Na przykład dla n=3 wynik = 00010111, a dla n=2 wynik = 0011
Udowodnij poprawność algorytmu.
Rozwiązanie