ASD Ćwiczenia 13: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Rytter (dyskusja | edycje)
Rytter (dyskusja | edycje)
Linia 226: Linia 226:
Wszystkie nieudane porównania pierwszej litery wzorca <math> x'</math>  (czyli litery <math> b</math> ), dokonane w trakcie szukania wzorca <math> x'</math> .
Wszystkie nieudane porównania pierwszej litery wzorca <math> x'</math>  (czyli litery <math> b</math> ), dokonane w trakcie szukania wzorca <math> x'</math> .


<br> Wszystkie porównania początkowych liter <math> a</math> , za wyjątkiem porównań
<br> Wszystkie porównania początkowych liter <math> a</math> , za wyjątkiem porównań na tych pozycjach, gdzie wcześniej szukaliśmy litery <math> b</math>  (pierwszej litery wzorca <math> x'</math>) i nie znaleźliśmy jej.
na tych pozycjach, gdzie wcześniej szukaliśmy litery <math> b</math>  (pierwszej litery
wzorca <math> x'</math>) i nie znaleźliśmy jej.
<br>
<br>


Linia 236: Linia 234:
Wszystkie nieudane porównania dokonane w trakcie szukania wzorca <math> x'</math> , za wyjątkiem nieudanych porównań pierwszej litery; są to nieudane porównania dokonywane w momencie, gdy znaleźliśmy już jakiś niepusty prefiks <math> x'</math> .
Wszystkie nieudane porównania dokonane w trakcie szukania wzorca <math> x'</math> , za wyjątkiem nieudanych porównań pierwszej litery; są to nieudane porównania dokonywane w momencie, gdy znaleźliśmy już jakiś niepusty prefiks <math> x'</math> .


<br> Porównania początkowych liter <math> a</math>  na tych pozycjach, gdzie wcześniej
<br> Porównania początkowych liter <math> a</math>  na tych pozycjach, gdzie wcześniej szukaliśmy litery <math> b</math>  i nie znaleźliśmy jej.
szukaliśmy litery <math> b</math>  i nie znaleźliśmy jej.
<br>
<br>


Zauważmy, że w algorytmie MP pozycje tekstu, na których nigdy nie było
Zauważmy, że w algorytmie MP pozycje tekstu, na których nigdy nie było żadnego udanego porównania to dokładnie te pozycje, na których nie udało się znaleźć pierwszej litery wzorca (lub pozycja jest pod sam koniec tekstu i nie ma już szans na znalezienie wzorca, algorytm już się zakończył). Dodatkowo, zarówno algorytm MP jak i algorytm Oszczędny-MP ma taką właściwość, że jeśli na pewnej pozycji tekstu było udane porównanie, to ta pozycja tekstu już nigdy nie będzie porównywana (o niej ,,wiemy już wszystko''). W związku z tym każde porównanie z szufladki <math> A</math>  wykonuje się na innej literze tekstu, czyli tych porównań jest co najwyżej <math> n</math> .
żadnego udanego porównania to dokładnie te pozycje, na których nie udało
się znaleźć pierwszej litery wzorca (lub pozycja jest pod sam koniec tekstu
i nie ma już szans na znalezienie wzorca, algorytm już się zakończył).  
Dodatkowo, zarówno algorytm MP jak i algorytm Oszczędny-MP ma taką właściwość,
że jeśli na pewnej pozycji tekstu było udane porównanie, to ta pozycja
tekstu już nigdy nie będzie porównywana (o niej ,,wiemy już wszystko'').  
W związku z tym każde porównanie z szufladki <math> A</math>  wykonuje się na innej
literze tekstu, czyli tych porównań jest co najwyżej <math> n</math> .


Spójrzmy teraz, jak zmienia się wskaźnik, na jakiej pozycji szukamy teraz
Spójrzmy teraz, jak zmienia się wskaźnik, na jakiej pozycji szukamy teraz wzorca <math> x</math> . Zauważmy, że prefikso-sufiks słowa <math> x[1\ldots s]</math>  dla <math> s > k</math> jest długości co najwyżej <math> s - k - 1</math>  (litery <math> a</math>  tego prefikso-sufiksu muszą się zaczynać za literą <math> b</math>  na pozycji <math> k+1</math> ). W związku z tym w momencie nieudanego porównania, które wystąpiło gdy znaleziony już został niepusty prefiks słowa <math> x'</math> , wskaźnik ,,gdzie teraz szukamy'' przesuwa się o conajmniej <math> k+1</math> . Tak też jest, gdy znajdziemy całe słowo <math> x'</math>  ( przesuwamy się do prefikso-sufiksu słowa <math> x</math>) . Dodatkowo, każde nieudane porównanie litery <math> b</math>  z pozycji <math> k+1</math>  w słowie <math> x</math>  przesuwa wskaźnik o jeden.
wzorca <math> x</math> . Zauważmy, że prefikso-sufiks słowa <math> x[1\ldots s]</math>  dla <math> s > k</math>  
jest długości co najwyżej <math> s - k - 1</math>  (litery <math> a</math>  tego prefikso-sufiksu
muszą się zaczynać za literą <math> b</math>  na pozycji <math> k+1</math> ). W związku z tym
w momencie nieudanego porównania, które wystąpiło  
gdy znaleziony już został niepusty prefiks słowa <math> x'</math> , wskaźnik ,,gdzie teraz szukamy'' przesuwa się o conajmniej <math> k+1</math> . Tak też jest, gdy znajdziemy całe słowo <math> x'</math>  ( przesuwamy się do prefikso-sufiksu
słowa <math> x</math>) . Dodatkowo, każde nieudane porównanie litery <math> b</math>  z pozycji
<math> k+1</math>  w słowie <math> x</math>  przesuwa wskaźnik o jeden.


W związku z tym:
W związku z tym:
Linia 266: Linia 248:
<br>
<br>
Po co najwyżej <math> k</math>  porównaniach z szufladki <math> B</math> , podpunkt <math> 2</math>  wskaźnik
Po co najwyżej <math> k</math>  porównaniach z szufladki <math> B</math> , podpunkt <math> 2</math>  wskaźnik
przesunie się o conajmniej <math> k+1</math> . Dodatkowo, każde takie porównanie oznacza,
przesunie się o conajmniej <math> k+1</math> . Dodatkowo, każde takie porównanie oznacza, że wcześniej na tym miejscu było nieudane porównanie litery <math> b</math> . Wliczając przesunięcia pochodzące od tych porównań otrzymujemy, że
że wcześniej na tym miejscu było nieudane porównanie litery <math> b</math> . Wliczając
wskaźnik przesunął się o conajmniej <math> k+1+L \geq 2L</math> , gdzie <math> L</math>  to liczba takich porównań liter <math> a</math>  w jednej próbie znalezienia wzorca <math> x</math> .
przesunięcia pochodzące od tych porównań otrzymujemy, że
wskaźnik przesunął się o conajmniej <math> k+1+L \geq 2L</math> , gdzie <math> L</math>  to liczba
takich porównań liter <math> a</math>  w jednej próbie znalezienia wzorca <math> x</math> .
<br>
<br>


Czyli każde porównanie z szufladki <math> B</math>  przesuwa wskaźnik ,,gdzie teraz
Czyli każde porównanie z szufladki <math> B</math>  przesuwa wskaźnik ,,gdzie teraz szukamy'' o conajmniej <math> 2</math> , czyli tych porównań jest nie więcej niż <math> \frac{n}{2}</math> .
szukamy'' o conajmniej <math> 2</math> , czyli tych porównań jest nie więcej niż
<math> \frac{n}{2}</math> .


''(Rozwiązanie opracował Marcin Pilipczuk)''
''(Rozwiązanie opracował Marcin Pilipczuk)''
</div>
</div>
</div>
</div>

Wersja z 18:05, 18 gru 2006

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 delay=O(logm)

Rozwiązanie



Zadanie 3

Udowodnij, że w wersji on-line algorytmu KMP mamy delay=Ω(logm)

Rozwiązanie



Zadanie 4

Udowodnij poprawność algorytmu na cykliczną równoważność słów.

Rozwiązanie


Zadanie 5

Dla jakich tekstów algorytm na cykliczną równoważność słów wykonuje maksymalną liczbę porównan symboli?

Rozwiązanie

Zadanie 6

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 7

Udowodnij następującą ciekawą własność kombinatoryczną okresowości w tekstach. Niech nwd(p,q) oznacza najmniejszy wspólny dzielnik p,q.


Lemat [Lemat o okresowości]

Jeśli x ma okresy p, q oraz p+q|x|, to nwd(p,q) jest również okresem x.


Rozwiązanie


Zadanie 8

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 p+q|x|+nwd(p,q), to nwd(p,q) jest również okresem x.

Rozwiązanie

Zadanie 9

Udowdnij poprawność algorytmu KMP realtime

Rozwiązanie

Zadanie 10

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