Zaawansowane algorytmy i struktury danych/Wykład 1
Tekst jest ciągiem symboli, przyjmujemy żejest on zadany tablicą x[1..k] elementami której są symbole. Liczba jest długością (rozmiarem)tekstu.W większości naszych algorytmów jedyne operacje dopuszczalne na symbolach wejściowychto porównania dwóch symboli. Postawowym problemem tekstowem jest problem {\em string matchingu} polegający na szukaniu wzorca wteście . Elementami tablic są symbole. Na kursie z ASD przerabialiśmy algorytm Knutha-Morrisa-Pratt(w skrócie KMP) i jego wariacje. Zaprezentujemy teraz bardziej zaawansowany algorytm dla tego problemu:\algorytm Boyera-Moore'a (w skrócie BM). Pomimo tego, że jest jasne jak ten algorytm działa to jednak jegopełna analiza (złożoność, preprocessing) jest zawansowana.
Algorytm {\em przykłada} x do tesktu y startując od pozycji i-tej w y, sprawdzamy czy Parser nie mógł rozpoznać (nieznana funkcja „\y”): {\displaystyle x[1..m]\ =\y[i+1..i+m]} . Pozycja {\em wędruje } ze strony lewej do prawej. Jednakże, w przeciwieństwie do algorytmuKMP, równość sprawdzamy od strony prawej do lewej. Zaczniemy od algorytmu naiwnego.\myskip\begin{center}\begin{minipage}{14cm}\vskip0.3cm\hspace*{0.6cm}\textbf{Algorytm} \textit{Naiwny-BM};\\\hspace*{1.2cm};\\\hspace*{1.2cm}\textbf{while} \textbf{do }\\\hspace*{1.8cm};\\\hspace*{1.8cm}\textbf{while} \textbf{and} \textbf{do}\;\\\hspace*{1.8cm}\textbf{if} \textbf{then return} true;\\\hspace*{1.8cm}\{zachodzi niezmiennik\}\; \vskip 0.1cm \noindent\hspace*{1.2cm}\textbf{return} false;\\\vskip0.4cm\end{minipage}\end{center}\myskip Jeśli zachodzi równość to stwierdzamy, że znaleźliśmy wystąpienie x i kończymy. w przeciwnym razie mamy niezmiennik: \begin{center} oraz .\end{center} Korzystając z niezmiennika liczymy większe przesunięcie niż 1. Przesunięcie jest bezpieczne gdyjesteśmy pewni że w każdej sytuacji pomiędzy oraz nie zaczyna się żadne wystąpienie wzorca x wtekście y. Przypuśćmy, że x zaczyna od pozycji (zobacz Rysunek #figure2-5, gdzie jestprzedstawionyprzypadek .\\\noindent Zachodzi wtedy następujący warunek:
$warunek1(j,s):$ dla każdego $k$ \ $j<k\leq m\ \Rightarrow\ s>k$ lub $x[k-s]=x[k]$, |
$warunek2(j,s)$: $s<j\ \Rightarrow\ x[j-s]\neq x[j]$\ \ \{ własność niezgodności \}. |
\begin{figure}%[htb]\begin{center}\includegraphics[width=11.6cm]{teksty_fig10.eps}\caption{Przesuni:ecie w algorytmie BM. Przypadek gdy .} \end{center}\end{figure}\myskip Definiujemy dwa rodzaje przesunięć, każde z nich dotyczy sufiksu wzorca zaczynającego się od pozycji.
$warunek1(j,s):$ dla każdego $k$ \ $j<k\leq m\ \Rightarrow\ s>k$ lub $x[k-s]=x[k]$, |
$warunek2(j,s)$: $s<j\ \Rightarrow\ x[j-s]\neq x[j]$\ \ \{ własność niezgodności \}. $BMShift'[j]=\min \{ s>0:\ warunek1(j,s) \},$ |
$BMShift[j] =\min \{ s>0:warunek1(j,s) \textrm{ oraz } warunek2(j,s) \}$. |
Definiujemy również\begin{center}.\end{center}Algorytm {BM} jest wersją algorytmu Naiwny-BM, w którym przeunięcie o jeden zamieniamy na przesunięcie o, zobacz Rysunek #figure2-6. \myskip\begin{center}\begin{minipage}{14cm}\vskip0.3cm\hspace*{0.6cm}\textbf{Algorytm} \textit{BM};\\\hspace*{1.2cm};\\\hspace*{1.2cm}\textbf{while} \textbf{do }\\\hspace*{1.8cm};\\\hspace*{1.8cm}\textbf{while} \textbf{and} \textbf{do}\ ;\\\hspace*{1.8cm}\textbf{if} \textbf{then return} true;\\\hspace*{1.8cm}\{ \} ; \vskip 0.1cm \noindent\hspace*{1.2cm}\textbf{return} false;\\\vskip0.4cm\end{minipage}\end{center}\myskip Udowodnimy potem, że algorytm ten ma złożoność liniową. Jednakże w przeciwieństwie do łatwejanalizy algorytmu KMP w tym przypadku analiza jest skomplikowana. Mamy tu przykład algorytmu, któregopoprawność jest dosyć oczywista, a analiza kosztu jest nietrywialna.
\begin{figure}%[htb]\begin{center}\includegraphics[width=12.3cm]{teksty_fig11.eps}\caption{ Historia algorytmu {BM} na przykładowych tekstach x, y.}
\end{center}\end{figure}Jeśli zastąpimy tablicę przez wówczas czas algorytmu BM staje się kwadratowy. Przykłademtekstów dla których osiągana jest wtedy złożoność kwadratowa są teksty:Różnica między i wydaje się być podobna do tej między silnymiprefisko-sufiksami i prefikso-sufiksami w algorytmie KMP. W obu przypadkach różnica sprowadza się dowykorzystania jednego bitu informacji, niezgodności dwóch symboli. Podczas gdy nie robi to istotnej różnicy wpesymistycznej złożoności algorytmu KMP, w tym przypadku jest to znacząca różnica między czasemkwadratowym i liniowym. Porównajmy działanie algorytmu z przesunięciem i of na tekstach(patrz rysunek)\\\centerline{ oraz .}Okresem tekstu jest każda liczba naturalna niezerowa taka, że , dla każdego i dlaktórego obie strony są zdefiniowane. Przez period(x) oznaczmy minimalny okres x. Okres jest {\em pełny} gdyjest dzielnikiem . Jeśli jest własciwym (mniejszym od ) dzielnikeim to x nazywamy rozkładalnym, wprzeciwnym przypadku x nazywamy słowem {\em pierwotnym} (albo nierozkładalnym). Na przykład jest rozkładalne, natomiast jest pierwotne.\myskip %Lemat\(Kombinatoryczna własność słów pierwotnych) Jeśli jest pierwotne to x nie ma wystąpienia wewnątrz xx. \myskip\begin{figure}[bh]\begin{center}\includegraphics[width=6cm]{teksty_fig13.eps}\caption{Jeśli tekst x jest pierwotny to taka sytuacja jest niemozliwa (x nie może wystepowac wewnatrz tekstuxx.) } \end{center}\end{figure}\myskip Własność ta {\em mówi}, że nie może zajść sytuacja przedstawiona na Rysunku #pierwotne.Dowód własności korzysta z tzw. {\em lematu o kresowości} dla tekstów: \ jeśli x ma okresy p, q oraz to jest również okresem x. \myskip Popatrzmy na rysunek, gdyby x wystepowal w xx to xxmiałby dwa okresy p,q, takie, że , z lematu o okresowości wynika wtedy, że xx ma okres mniejszyof i będący dzielnikiem . Zatem słowo x nie byłoby pierwotne, co jest sprzeczne z założeniem.\myskip Jako ćwiczenie pozostawiamy problem sprawdzania w czasie liniowym czy słowo x jest pierwotne. Dokładne oszacowanie na liczbę porównań w algorytmie BM wynosi około 3n. Dowód tego faktu jest jednakzbyt skomplikowany. Pokażemy tutaj oszacowanie górne 4n oraz dolne 3n. Zaczniemy od prostszego oszacowaniadolnego. Zastosujmy algorytm BM do tekstów: , gdzie usuwamy ostatni symbol,oraz . \noindentPozostawimay jako ćwiczenie sprawdzenie tego, że dla tych danych liczba porównań symboli wynosi wprzybliżeniu , gdzie jest długością .\myskipPrzejdziemy teraz do górnego oszacowania . \myskipJeśli się głębiej zastanowić to liniowy czasalgorytmu BM jest zdumiewający, algorytm zapomina jaka część tekstu y pasowała do wzorca x, i sprawdzawielokrotnie te same fragmenty które już poprzednio były sprawdzone z wynikem pozytywnym. Zjawisko takie niema miejsca w algorytmie KMP, gdzie raz sprawdzony pozytywnie symbol w tekście y nie jest już nigdy więcejsprawdzany. \begin{figure}%[htb]\begin{center}\includegraphics[width=15cm]{teksty_fig14.eps}\caption{Segment tekstu y jest aktualnym dopasowaniem, oznacza najkrótszy pełny okressufiksu wzorca x, jest również okresem aktualnego dopasowania. Zaciemniony obszar jest częścią tekstu,która nigdy wcześniej nie była odwiedzana (sprawdzana). } \end{center}\end{figure} Załóżmy, że w danej nieterminalnej iteracji algorytm BM sprawdza segment tekstu y, anstępnie wykonuje przesunięcie, gdzie oraz. Przez \textit{aktualne dopasowanie} rozumiemy aktualnie sprawdzany segment tekstu y bez pozycji, na którejwystępuje niezgodność symboli, (patrz Rysunek #figure3-4). Niech będzie najmniejszym pełnym okresem tekstu , a niech będzie słowemodpowiadającym temu okresowi. Inaczej mówiąc zakładamy, że mamy taką sytuację jak naRysunku #figure3-4). Zauważmy, że rozważamy tu okresowość w dwóch aspektach: jako liczbę(długość) oraz jako słowo. \noindent Zdefiniujmy własność pierwszego odwiedzenia: \begin{quotation}\noindent: \ pozycje w segmencie nie były sprawdzane w poprzednich iteracjach.\end{quotation}\myskipUdowodnimy następujący silny i całkowicie nietrywialny fakt. \noindent Lemat}.\ Własność {\em pierwszego odwiedzenia zachodzi w każdej nieterminalnejiteracji algorytmu BM. \noindent Dowód będzie polegał na zauważeniu kilku drobniejszych własności. Następująca własnośćwynika w sposób oczywisty z założeń: \ jest słowem-okresem aktualnego dopasowania oraz jestsufiksem wzorca.\myskipWprowadzimy kluczowe pojęcie {\em pozycji krytycznej} jako pozycji w aktualnym dopasowaniu, która jest odległa od końca aktualnego dopasowania o wielokrotność ,oraz od początku co najmniej o .\myskipMówimy, że poprzednie dopasowane kończyło się na pozycji w tekście , jeśli wpewnej poprzedniej iteracji koniec wzorca był przyłożony do pozycji w .\paragraph{Własność 1} żadne poprzednie dopasowanie nie kończy się na pozycji krytycznej w aktualnym dopasowaniu. \noindent Dowód własności 1}.\ Dowód ma charakter {\em filozoficzny: gdyby własność 1 dla pewnejiteracji nie zachodziła to by tej iteracji nie było. Gdyby poprzednia iteracja kończyła się na pozycjikrytycznej to następnym końcem dopasowania byłaby pozycja . W ten sposób byśmy przeskoczyliaktualną iterację. Zatem własność 1 zawsze zachodzi.\paragraph{Własność 2} Wielkość wspólnej częśc aktualnego dopasowania idanego poprzedniego dopasowania jest mniejsza od . \myskip Dowód własności 2.\ Z własności 1wynika, że koniec poprzedniego dopasowania nie kończy się na pozycji krytycznej. Gdyby wspólna część byławiększa niż to słowo pierwotne występowałoby wewnątrz słowa , co zaprzecza własności słówpierwotnych. Zatem musi zachodzić własność 2.\noindent \paragraph{Własność 3.}\ Jeśli poprzednie dopasowanie kończy się na pozycji wewnątrzaktualnego dopasowania i zawiera się całkowicie w aktualnym dopasowaniu. Wtedy nie ma krytycznej pozycji naprawo od .\myskipDowód własności 3.\ Przypuśćmy, że jest pewna pozycja krytyczna na prawo od . Wówczas jest dobrym kandydatem na przesunięcie w Algorytmie {BM}. Ponieważ algorytm BM wybiera najmniejszeprzesunięcie spośród kandydatów na przesunięcie spełniających warunek1 i warunek2 otrzymamy nową pozycję jako koniec następnego dopasowania. Wynika stąd, że mamy sekwencję , końcowych pozycjipoprzednich dopasowań z których każda jest mniejsza od . Wszystkie te liczby są różnymi liczbaminaturalnymi, w pewnym momencie jedna z nich musi być równa . W tym momencie mamy poprzednie dopasowaniekończące się na pozycji krytycznej . Przeczy to własności 2. Zatem własnośc 3 musi zachodzić.\paragraphDowód własności pierwszego odwiedzenia.\Trzy własności przed chwilą udowdnione wystarczją do tego, żeby uzasadnienie własności pierwszego odwiedzeniabyło proste. Dowód jest przez zaprzeczenie. Przypuśćmy, że w pewnej poprzedniejiteracji odwiedziliśmy {\em zabroniony} obszar aktualnego dopasowania (zacienioną częśćtekstu y na Rysunku #figure3-4). Niech będzie końcem tego poprzedniego dopasowania. Zatem nie jest pozycją krytyczną, na prawo od niej jestpewna pozycja krytyczna. Jest to sprzeczne z własnością 3.Kończy to dowód własności pierwszego odwiedzenia.\myskipMożemy teraz przystąpić do ostatecznej analizy algorytmu BM. \begin{theorem} \\Algorytm BM wykonuje co najwyżej porównań symboli do momentu znalezieniapierwszego wystąpienia wzorca lub zakończenia szukania z wynikiem negatywnym.Algorytm działa w czasie , współczynnik kosztu nie zależy od rozmiarualfabetu.\end{theorem} \noindentZ własności {\em pierwszego odwiedzenia} wynika bezpośrednio: jeśli jest przesunięciem w nieterminalnej iteracji, to co najwyżej pozycji tekstu y sprawdzanych wtej iteracji było sprawdzane w poprzednich iteracjach. \myskip Koszt każdej nieterminalnej iteracji możnarozdzielić na dwie części.
- Koszt odwiedzenia symboli w tekście po raz pierwszy,
- Potrojone przesunięcie.
\subsection*{Tablica Prefisko-Prefiksów}W fazie {\em preprocessing}u algorytmu BM (obliczanie tablicy ) potrzebny będzie algorym liczeniatablicy prefikso-prefiksów. Modyfikacją tablicy prefikso-sufiksów jest tablica prefikso-prefiksów: jest długośćią najdłuższego prefiksu tekstu x, którego wystąpienie rozpoczyna się na pozycji .Bardziej formalnie:
\begin{center} jest prefiksem \}.\end{center}\myskip Przykład.\ Dla mamy:Jako ćwiczenie pozostawiamy redukcję problemu liczenia tablicy do liczenia tablicy , co jużpotrafimy. przeskalowanym względem s) jest małe, patrz rysunek. Przedstawimy niezależny interesujący algorytm liczenia tablicy . W algorytmie liczymy tablicę PREFprzeglądając tekst od lewej do prawej. Załóżmy, że przetwarzamy pozycję -tą (gdzie ), wtedyzachodzi następujący niezmiennik (patrz Rysunek #pref):\begin{quotation}\noindentwartości dla są już policzone\\ jest pozycją maksymalizującą .\end{quotation}\noindent Dodajemy specjalny znacznik końca tekstu na pozycji w .Korzystamy z dodatkowej prostej funkcji : \begin{center} = takie, że .\end{center}Jeśli nie ma takiego to . Wartość PREF[1] nie jest dla nas interesująca. \begin{figure}%[hb]\begin{center}\includegraphics[width=15.5cm]{teksty_fig2.eps}\caption{Typowa sytuacja w algorytmie Prefikso-Prefiksy. Liczymy PREF dla nowej pozycji , zakladając, żeznamy wartości tablicy PREF dla pozycji wczesniejszych. } \end{center}\end{figure}\myskip\begin{center}\begin{minipage}{12cm}\vskip0.3cm \hspace*{0.6cm}\textbf{Algorytm} ;\vskip 0.1cm \noindent\hspace*{1.2cm}; ;\vskip 0.1cm \noindent \hspace*{1.2cm}\textbf{for} \textbf{to} \textbf{do}\vskip 0.1cm \noindent \hspace*{1.8cm};\ ;\vskip 0.1cm \noindent\hspace*{1.8cm}\textbf{if} \textbf{then }\\\hspace*{2.4cm};\\\hspace*{2.4cm} \textbf{if} \textbf{then} :=; \\\hspace*{1.8cm}\textbf{else if} \textbf{then}\\\hspace*{2.4cm}\\\hspace*{1.8cm}\textbf{else}\\\hspace*{2.4cm};\\\hspace*{2.4cm};\ ;\\\vskip0.4cm\end{minipage}\end{center}\myskipNajważniejszą częścią algorytmu jest przekopiowywanie, w pewnych sytuacjach, wartości wcześniejpoliczonych na . Dzieje się to wtedy, gdy jest duże i jest małe ( jestwartością przeskalowaną względem ). Pokażemy że czas konstrukcji tablcy jest liniowy, podstawową częścią będzieobliczanie tablicy . Używając algorytmu liczenia obliczamy w czasie liniowym symetryczną tablicę sufisko-sufiksów: jest długością maksymalnego sufiksu tekstu który kończy się na pozycji. Tablica odpowiada tablicy obliczonej dla odwróconego wzorca . \begin{center}\begin{minipage}{10cm}\vskip0.3cm\hspace*{0.6cm}\textbf{Algorytm} Sufikso-sufiksy;\\\hspace*{1.2cm}:=odwrócony wzorzec ;\\\hspace*{1.2cm}oblicz tablicę dla tekstu ;\\\hspace*{1.2cm}\textbf{for each {} do}\ \ ;\\\vskip0.4cm\end{minipage}\end{center}\myskip\begin{figure}%[htb]\begin{center}\includegraphics[width=15cm]{teksty_fig9.eps}\caption{Przypadek gdy . Dla , oraz przykładowgo tekstu rozmiaru , mamy. Otrzymujemy , zatem . Dla ,mamy , zatem . } \end{center}\end{figure} \myskip Obserwacja.\ Jeśli , to . \myskip Przykład.\ Dla iprzykładowego wzorca x na Rysunku #BM-shifts mamy: , oraz . \myskip Korzystając z powyższej obserwacji przesunięcia w algorytmie BMobliczane są następująco. Inicjalizujemy dla każdego . \myskip\begin{center}\begin{minipage}{8cm}\vskip0.3cm\hspace*{0.6cm}\textbf{Algorytm} Oblicz-BMShift;\\\hspace*{1.2cm}\textbf{for} \textbf{to} \textbf{do }\\\hspace*{1.8cm}; ;\\\vskip0.4cm\end{minipage}\end{center}\myskipDla przypadku, gdy po wykonaniu powyższego algorytmu,otrzymane wartości nie muszą być poprawne. W tym przypadku heurystykaniezgodności na jednej pozycji jest ignorowana i sprowadzamy obliczenie do prefikso-sufiksów całego wzorca. Załóżmy wtedy, że , niech będzie długości"maksymalnego prefiksu wzorca, który jest sufiksemcałego wzorca, oraz , wtedy przyjmujemy