By wykazać, że algorytm Oszczędny-MP wykonuje co najwyżej
porównań, pogrupujemy te porównania w dwie szufladki: i . Pokażemy, że
w szufladce będzie co najwyżej porównań, a w szufladce co najwyżej
porównań.
Do szufladki wrzucamy:
Wszystkie udane porównania dokonane w trakcie szukania wzorca .
Wszystkie nieudane porównania pierwszej litery wzorca (czyli litery
), dokonane w trakcie szukania wzorca .
Wszystkie porównania początkowych liter , za wyjątkiem porównań
na tych pozycjach, gdzie wcześniej szukaliśmy litery --- pierwszej litery
wzorca --- i nie znaleźliśmy jej.
Do szufladki wrzucamy wszystkie pozostałe porównania, czyli:
Wszystkie nieudane porównania dokonane w trakcie szukania wzorca ,
za wyjątkiem nieudanych porównań pierwszej litery; są to nieudane porównania
dokonywane w momencie, gdy znaleźliśmy już jakiś niepusty prefiks .
Porównania początkowych liter na tych pozycjach, gdzie wcześniej
szukaliśmy litery i nie znaleźliśmy jej.
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 wykonuje się na innej
literze tekstu, czyli tych porównań jest co najwyżej .
Spójrzmy teraz, jak zmienia się wskaźnik, na jakiej pozycji szukamy teraz
wzorca . Zauważmy, że prefikso-sufiks słowa dla
jest długości co najwyżej --- litery tego prefikso-sufiksu
muszą się zaczynać za literą na pozycji . W związku z tym
w momencie nieudanego porównania, które wystąpiło
gdy znaleziony już został niepusty prefiks słowa , wskaźnik ,,gdzie
teraz szukamy przesuwa się o conajmniej . Tak też jest,
gdy znajdziemy całe słowo --- przesuwamy się do prefikso-sufiksu
słowa . Dodatkowo, każde nieudane porównanie litery z pozycji
w słowie przesuwa wskaźnik o jeden.
W związku z tym:
Porównania z szufladki , podpunkt przesuwają wskaźnik o conajmniej
.
Po co najwyżej porównaniach z szufladki , podpunkt wskaźnik
przesunie się o conajmniej . Dodatkowo, każde takie porównanie oznacza,
że wcześniej na tym miejscu było nieudane porównanie litery . Wliczając
przesunięcia pochodzące od tych porównań otrzymujemy, że
wskaźnik przesunął się o conajmniej , gdzie to liczba
takich porównań liter w jednej próbie znalezienia wzorca .
Czyli każde porównanie z szufladki przesuwa wskaźnik ,,gdzie teraz
szukamy o conajmniej , czyli tych porównań jest nie więcej niż
.
(Rozwiązanie opracował Marcin Pilipczuk)