Analiza automatów Boyera-Moore a

Podobne dokumenty
Znaleźć wzór ogólny i zbadać istnienie granicy ciągu określonego rekurencyjnie:

0 + 0 = 0, = 1, = 1, = 0.

Rozwiązania około dwustu łatwych zadań z języków formalnych i złożoności obliczeniowej i być może jednego chyba trudnego (w trakcie tworzenia)

Matematyka dyskretna. Andrzej Łachwa, UJ, /10

Wykład z równań różnicowych

Temat: Algorytm kompresji plików metodą Huffmana

Języki formalne i automaty Ćwiczenia 1

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

Matematyka Dyskretna 2/2008 rozwiązania. x 2 = 5x 6 (1) s 1 = Aα 1 + Bβ 1. A + B = c 2 A + 3 B = d

Dystrybucje, wiadomości wstępne (I)

Hierarchia Chomsky ego Maszyna Turinga

Maszyna Turinga języki

Rozwiązaniem jest zbiór (, ] (5, )

Obliczenia inspirowane Naturą

Indukcja matematyczna

Układy równań i nierówności liniowych

Przykładowe zadania z teorii liczb

1 Działania na zbiorach

Topologia zbioru Cantora a obwody logiczne

Przykład: Σ = {0, 1} Σ - zbiór wszystkich skończonych ciagów binarnych. L 1 = {0, 00, 000,...,1, 11, 111,... } L 2 = {01, 1010, 001, 11}

Zadanie 1. Czy prawdziwa jest następująca implikacja? Jeśli L A jest językiem regularnym, to regularnym językiem jest też. A = (A, Q, q I, F, δ)

LOGIKA I TEORIA ZBIORÓW

Temat: Algorytmy wyszukiwania wzorca w tekście

Algorytmy przeszukiwania wzorca

Dlaczego nie wystarczają liczby wymierne

Rodzinę F złożoną z podzbiorów zbioru X będziemy nazywali ciałem zbiorów, gdy spełnione są dwa następujące warunki.

Ciała i wielomiany 1. przez 1, i nazywamy jedynką, zaś element odwrotny do a 0 względem działania oznaczamy przez a 1, i nazywamy odwrotnością a);

Logarytmy. Funkcje logarytmiczna i wykładnicza. Równania i nierówności wykładnicze i logarytmiczne.

Funkcje wymierne. Funkcja homograficzna. Równania i nierówności wymierne.

1 Automaty niedeterministyczne

5. OKREŚLANIE WARTOŚCI LOGICZNEJ ZDAŃ ZŁOŻONYCH

Poprawność semantyczna

Dowód pierwszego twierdzenia Gödela o. Kołmogorowa

VII. Elementy teorii stabilności. Funkcja Lapunowa. 1. Stabilność w sensie Lapunowa.

Matematyczne Podstawy Informatyki

Maszyna Turinga. Algorytm. czy program???? Problem Hilberta: Przykłady algorytmów. Cechy algorytmu: Pojęcie algorytmu

Imię, nazwisko, nr indeksu

Matematyczne Podstawy Informatyki

złożony ze słów zerojedynkowych o długości co najmniej 3, w których druga i trzecia litera od końca sa

3a. Wstęp: Elementarne równania i nierówności

JAO - Wprowadzenie do Gramatyk bezkontekstowych

Zbiory, relacje i funkcje

Zajęcia nr. 3 notatki

A i. i=1. i=1. i=1. i=1. W dalszej części skryptu będziemy mieli najczęściej do czynienia z miarami określonymi na rodzinach, które są σ - algebrami.

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Aproksymacja funkcji a regresja symboliczna

TEORETYCZNE PODSTAWY INFORMATYKI

Indukcja matematyczna, zasada minimum i maksimum. 17 lutego 2017

Matematyka dyskretna dla informatyków

Aproksymacja diofantyczna

Rozdział 6. Ciągłość. 6.1 Granica funkcji

Wyszukiwanie binarne

LX Olimpiada Matematyczna

Logika Stosowana. Wykład 1 - Logika zdaniowa. Marcin Szczuka. Instytut Informatyki UW. Wykład monograficzny, semestr letni 2016/2017

0-0000, , , itd

3. Macierze i Układy Równań Liniowych

Algorytmy w teorii liczb

VI. Równania różniczkowe liniowe wyższych rzędów

B jest liniowo niezależny V = lin (B) 1. Układ pusty jest bazą przestrzeni trywialnej {θ}. a i v i = i I. b i v i, (a i b i ) v i = θ.

1. Synteza automatów Moore a i Mealy realizujących zadane przekształcenie 2. Transformacja automatu Moore a w automat Mealy i odwrotnie

VIII. Zastosowanie rachunku różniczkowego do badania funkcji. 1. Twierdzenia o wartości średniej. Monotoniczność funkcji.

Macierze. Rozdział Działania na macierzach

System BCD z κ. Adam Slaski na podstawie wykładów, notatek i uwag Pawła Urzyczyna. Semestr letni 2009/10

Kongruencje pierwsze kroki

Zasada indukcji matematycznej

Nierówność Krafta-McMillana, Kodowanie Huffmana

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Wykład 6. Wyszukiwanie wzorca w tekście

Języki formalne i automaty Ćwiczenia 7

Teoria miary. WPPT/Matematyka, rok II. Wykład 5

Liczby zespolone. x + 2 = 0.

AiSD zadanie trzecie

Finanse i Rachunkowość studia niestacjonarne Wprowadzenie do teorii ciągów liczbowych (treść wykładu z 21 grudnia 2014)

5. Algebra działania, grupy, grupy permutacji, pierścienie, ciała, pierścień wielomianów.

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Zadania do Rozdziału X

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

Indukcja matematyczna

Notatki z Analizy Matematycznej 2. Jacek M. Jędrzejewski

Pochodna funkcji odwrotnej

Drzewa BST i AVL. Drzewa poszukiwań binarnych (BST)

(j, k) jeśli k j w przeciwnym przypadku.

Algebra Boole a i jej zastosowania

Języki, automaty i obliczenia

Kodowanie i kompresja Streszczenie Studia dzienne Wykład 6

Przepustowość kanału, odczytywanie wiadomości z kanału, poprawa wydajności kanału.

Efektywność Procedur Obliczeniowych. wykład 5

Kodowanie i kompresja Tomasz Jurdziński Studia Wieczorowe Wykład Kody liniowe - kodowanie w oparciu o macierz parzystości

Modele Obliczeń. Wykład 1 - Wprowadzenie. Marcin Szczuka. Instytut Matematyki, Uniwersytet Warszawski

Lista 4. Kamil Matuszewski 22 marca 2016

Języki formalne i automaty Ćwiczenia 9

Temat: Zastosowanie wyrażeń regularnych do syntezy i analizy automatów skończonych

Kody blokowe Wykład 2, 10 III 2011

Wstęp do programowania

Następnie przypominamy (dla części studentów wprowadzamy) podstawowe pojęcia opisujące funkcje na poziomie rysunków i objaśnień.

1. Granice funkcji - wstępne definicje i obliczanie prostych granic

Matematyka dyskretna. Andrzej Łachwa, UJ, /10

Układy równań liniowych

Zasady analizy algorytmów

Wykład 4 Przebieg zmienności funkcji. Badanie dziedziny oraz wyznaczanie granic funkcji poznaliśmy na poprzednich wykładach.

Transkrypt:

Uniwersytet Warszawski Wydział Matematyki, Informatyki i Mechaniki Wojciech Tyczyński Nr albumu: 237242 Analiza automatów Boyera-Moore a Praca magisterska na kierunku INFORMATYKA Praca wykonana pod kierunkiem prof. dr hab. Wojciecha Ryttera Kwiecień 2011

Oświadczenie kierującego pracą Potwierdzam, że niniejsza praca została przygotowana pod moim kierunkiem i kwalifikuje się do przedstawienia jej w postępowaniu o nadanie tytułu zawodowego. Data Podpis kierującego pracą Oświadczenie autora (autorów) pracy Świadom odpowiedzialności prawnej oświadczam, że niniejsza praca dyplomowa została napisana przeze mnie samodzielnie i nie zawiera treści uzyskanych w sposób niezgodny z obowiązującymi przepisami. Oświadczam również, że przedstawiona praca nie była wcześniej przedmiotem procedur związanych z uzyskaniem tytułu zawodowego w wyższej uczelni. Oświadczam ponadto, że niniejsza wersja pracy jest identyczna z załączoną wersją elektroniczną. Data Podpis autora (autorów) pracy

Streszczenie Tematem niniejszej pracy magisterskiej jest analiza automatów Boyera-Moore a. Zaprezentowany został w niej pełny i formalny dowód dolnego ograniczenia na maksymalną ilość stanów rzędu Θ(m 3 ). Nowym wynikiem tej pracy jest analiza struktury automatów dla klasy wzorców, dla których oszacowanie to zostało uzyskane. Ponadto w ramach pracy zostały zaimplementowane algorytmy generowania automatów Boyera-Moore a oraz wykonane zostały liczne eksperymenty prowadzące do nowych hipotez, których opis również zawarty jest w niniejszej pracy. Poza tym praca ma charakter przeglądowy i zawiera opis znanych obserwacji związanych z automatami Boyera-Moore a. Słowa kluczowe Automat Boyera-Moore a, automaty skończone, wyszukiwanie wzorców 11.3 Informatyka Dziedzina pracy (kody wg programu Socrates-Erasmus) Klasyfikacja tematyczna F. Theory of Computation F.2 Analysis of Algorithms and Problem Complexity F.2.2. Nonnumerical Algorithms and Problems - Pattern matching Boyer-Moore automata analysis Tytuł pracy w języku angielskim

Spis treści Wprowadzenie....................................... 5 1. Postawienie problemu - pojęcie automatu Boyera-Moore a......... 7 1.1. Definicja automatu Boyera-Moore a....................... 7 1.2. Ogólna postać stanów w automatach Boyera-Moore a.............. 9 1.3. Własności ogólnej postaci stanów automatu Boyera-Moore a.......... 10 2. Budowa automatu Boyera-Moore a........................ 13 2.1. Ogólna metoda konstrukcji automatu....................... 13 2.2. Generowanie następników w czasie O(m)..................... 14 2.3. Dalsze udoskonalenia................................ 15 2.4. Wnioski....................................... 16 3. Rozmiar alfabetu a rozmiar automatów..................... 17 3.1. Uwagi wstępne................................... 17 3.2. Twierdzenie 1.................................... 17 3.3. Twierdzenie 2.................................... 18 4. Ograniczenia na ilość stanów............................ 23 4.1. Automaty o rozmiarze Θ(m 3 )........................... 23 4.2. Automaty o rozmiarze Ω(m 5 )........................... 26 5. Struktura automatów dla wzorców postaci a i 1 ba i 2............... 29 5.1. Struktura stanów na przykładzie wzorca a 3 ba 6................. 29 5.2. Struktura funkcji przejścia na przykładzie wzorca a 3 ba 6............ 31 5.2.1. Przejścia po wczytaniu litery a...................... 32 5.2.2. Przejścia po wczytaniu litery b...................... 33 6. Rozmiary automatów dla krótkich wzorców.................. 39 6.1. Dokładne rozmiary automatów dla krótkich wzorców.............. 39 6.2. Klasa wzorców niezawierających podsłowa aa.................. 40 6.3. Ograniczenie klasy B1............................... 41 6.4. Klasa wzorców prawie-palindromicznych.................... 43 6.5. Klasa C4....................................... 46 6.6. Długość reprezentacji wzorca a rozmiar automatu................ 48 6.7. Średni rozmiar automatu............................. 50 7. Podsumowanie..................................... 53 3

Bibliografia......................................... 55 4

Wprowadzenie Pojęcie automatu Boyera-Moore a będące centralnym i tytułowym pojęciem niniejszej pracy magisterskiej po raz pierwszy pojawiło się w pracy Donalda Knutha, Jamesa Morrisa i Voughana Pratta Fast pattern matching in strings opublikowanej w 1977 roku. Obiekt ten zostanie w sposób formalny zdefiniowany w pierwszym rozdziale poniższej pracy. Wprowadzenie automatu było swoistą próbą udoskonalenia opublikowanego kilka miesięcy wcześniej przez Roberta Moore a oraz J Boyera algorytmu wyszukiwania wzorca w tekscie. Zmodyfikowana wersja tej metody jest obecnie znana właśnie pod nazwą algorytmu Boyera- Moore a, natomiast wprowadzona modyfikacja poprawiała pesymistyczną złożoność czasową z kwadratowej w oryginalnej pracy na liniową (przy założeniu, że szukamy pierwszego wystąpienia wzorca lub stwierdzamy, że w ogóle on tam nie występuje). Motywacją do stworzenia pojęcia automatu Boyera-Moore a była próba wykorzystania wiedzy, którą zdobyliśmy podczas wykonywania wcześniejszych operacji, gdyż sam algorytm jest pozbawiony pamięci. Stany automatu pozwalają na zapamiętanie wyników wcześniejszych operacji, które mogę być przydatne w dalszych obliczeniach. Dzięki temu nie musimy wykonywać porównań, które w algorytmie Boyera-Moore a są wykonywane, a których wynik można wydedukować na podstawie wcześniejszych obliczeń. We wspomnianej na początku pracy autorzy stwierdzają, iż ilość stanów automatu Boyera- Moore a można ograniczyć przez 2 m, gdzie m jest długością wzorca dla którego budujemy automat. Sugerują również istnienie znacznie lepszego ograniczenia. Niestety nie wiadomo jednak jakie miało by ono być. Co więcej, nie jest wcale jasne dla jakich wzorców zadanej długości automaty Boyera-Moore a będą miały najwięcej stanów oraz czy będzie ich wykładniczo wiele. Niniejsza praca magisterska służy przynajmniej częściowej odpowiedzi na te pytania. Mimo iż najważniejsze z nich - czy istnieją wzorce dla których automaty Boyera-Moore a mają wykładniczo wiele stanów względem ich długości - pozostaje w dalszym ciągu otwarte, to analiza i eksperymenty przeprowadzone w ramach tej pracy magisterskiej znacznie przybliżają nas do zrozumienia struktury tych obiektów. W pierwszym rozdziale niniejszej pracy podaję formalną definicję automatu Boyera- Moore a oraz dowodzę pewnej silnej charakteryzacji jego stanów. Drugi rozdział zawiera opis i analizę optymalnego algorytmu konstrukcji automatów. Ponieważ w ramach eksperymentów generowane były automaty posiadające nawet kilkadziesiąt milinów stanów, to rozdział ten wydaje się być pod tym względem kluczowy. Trzeci rozdział zawiera twierdzenie, które podaje zależność pomiędzy rozmiarem alfabetu a maksymalnym rozmiarem automatu. Czwarty rozdział zawiera pewne dolne ograniczenia na maksymalną ilość stanów. W pierwszej części prezentuję klasę wzorców, dla której automaty Boyera-Moore a posiadają Θ(m 3 ) stanów oraz przedstawiam dowód tego faktu. Druga część zawiera wynik eksperymentu, który empirycznie dowodzi dolnego ograniczenia postaci Ω(m 5 ). W piątym rozdziale pokazuję jak regularną strukturę mają automaty dla wzorców z klasy rozważanej w rozdziale czwartym. Natomiast w szóstym rozdziale prezentuję wyniki swoich 5

eksperymentów przeprowadzonych w ramach pracy magisterskiej. Pokazują one złożoność problematyki związanej z automatami Boyera-Moore a oraz wskazują na hipotezy wzmacniające ograniczenia z rozdziału czwartego. 6

Rozdział 1 Postawienie problemu - pojęcie automatu Boyera-Moore a Centralnym pojęciem poniższej pracy magisterskiej jest pojęcie automatu Boyera-Moore a. Rozpocznijmy zatem od wprowadzenia formalnej definicji tego obiektu. 1.1. Definicja automatu Boyera-Moore a Na początek przypomnijmy ogólną definicję automatu skończonego, w oparciu o którą zdefiniujemy automat Boyera-Moore a. Definicja 1.1 Automatem nazywamy piątkę uporządkowaną A = (Q, Σ, δ, q 0, F ), gdzie: Q - skończony zbiór stanów automatu Σ - skończony zbiór symboli wejściowych (alfabet) δ - funkcja przejścia, która jako argumenty przyjmuje stan oraz symbol wejściowy i zwraca stan q 0 - stan początkowy (q 0 Q) F - zbiór stanów akceptujących (F Q) Mając już pojęcie automatu skończonego, możemy formalnie zdefiniować wprowadzony po raz pierwszy w pracy [2] automat Boyera-Moore a. Definicja 1.2 Automatem Boyera-Moore a dla słowa w Σ ( w = m) nazywamy automat skończony A = (Q, Σ, δ, q 0, F ), w którym: stanami q Q są słowa długości m, spełniające warunek: 1 i m q[i] = w[i] lub q[i] = # definiujemy również funkcję P : Q {1,..., m}, która dla danego stanu zwraca numer pozycji najbardziej prawego znaku # Σ - alfabet nad którym zostało zbudowane słowo w 7

δ - funkcja przejścia δ : Q Σ Q zdefiniowana w następujący sposób: Niech q Q, a Σ i niech i = P (q). Wówczas: q = q 1 q[i]q 2, gdzie q[i] = # natomiast q 1, q 2 (Σ {#}). Niech r = q 1 w[i]q 2. Jeżeli a = w[i] to δ(q, a) = r. W przeciwnym przypadku niech: s = min{j : k {j+1,,m} (r[k] # r[k] = w[k j])} Wówczas δ(q, a) = q, gdzie q spełnia warunki: 1. 1 k m s q [k] = r[k + s] 2. m s<k m q [k] = # Operację utworzenia stanu q ze stanu q nazywamy przesunięciem, zaś wartość s wielkością tego przesunięcia. stanem początkowym q 0 jest słowo # m jedynym stanem akceptującym q A jest słowo w Po wprowadzeniu formalnej definicji warto przyjrzeć się intuicji, która za nią stoi. Po pierwsze symbol # pełni rolę niewiadomej. Tym samym jest on zgodny z dowolnym innym symbolem. Drugą kwestią wartą wyjaśnienia jest funkcja P - jej wartość odpowiada numerowi pozycji, z której wczytujemy symbol wejściowy. Na koniec przyjrzyjmy się jeszcze definicji funkcji przejścia. Najłatwiej zrozumieć ją patrząc na poniższy rysunek. W przypadku niezgodności symbolu a z symbolem w[i], szukamy minimalnej wielkości przesunięcia s takiej, żeby zaznaczone fragmenty słów w i r były zgodne. Następnie stan q tworzymy poprzez wzięcie zaznaczonej części ze stanu r i dopełnieniu go znakami #. Jako że głównym tematem pracy jest analiza możliwych rozmiarów automatów Boyera- Moore a, od tej pory będziemy zakładać, że stan akceptujący q A (któremu odpowiada słowo w) jest stanem pochłaniającym (czyli a Σ δ(q A, a) = q A ) oraz będziemy rozważać tylko stany automatu osiągalne ze stanu początkowego (a zatem od teraz przez zbiór Q rozumiemy zbiór {q Q : a1,...,a n q1,...,q n i={1,...,n} q i = δ(q i 1, a i ) oraz q n = q} Po wprowadzeniu formalnej definicji warto zilustrować ją na przykładzie. W tym celu poniżej prezentuję automat dla słowa w = aba. 8

Warto wspomnieć również, że czasami rozważa się też rozszerzone automaty Boyera- Moore a. Różnią się one tylko definicją funkcji P, która zwraca numer pozycji pewnego znaku # (niekoniecznie najbardziej prawego, jak to ma miejsce w standardowych automatach). W szczególności jeśli funkcja P zwraca numer pozycji najbardziej lewego znaku #, to taki automat symuluje algorytm Knutha-Morrisa-Pratta. 1.2. Ogólna postać stanów w automatach Boyera-Moore a W poprzednim podrozdziale utożsamiliśmy stany automatu ze słowami długości m nad alfabetem Σ {#}. Przedstawię teraz jak w ogólności wygląda postać pojedynczego stanu. Mimo iż poniższe twierdzenie ją wprowadzające wydaje się być oczywiste, to jednak jest ono tylko wstępem do pokazania bardzo silnej charakteryzacji tej właśnie postaci. Twierdzenie 1.3 Każdy stan automatu Boyera-Moore a jest postaci: # i 0 w 1 # i1 w k 1 # i k 1 w k (1.1) gdzie k > 0, i 0 0, 1 s k 1 i s > 0, w 1,... w k 1 Σ + oraz w k Σ. Dowód: Skorzystamy z zasady indukcji matematycznej względem długości najkrótszej ścieżki od stanu początkowego q 0 do rozważanego stanu q. Podstawa indukcji (czyli uzasadnienie faktu dla stanu początkowego q 0 = # m ) jest oczywista. Przejdźmy zatem od razu do kroku indukcyjnego. Na początek zauważmy, że jeżeli mamy słowo q postaci 1.1, to również dowolne jego przesunięcie (w sensie operacji wprowadzonej przy okazji definicji automatu Boyera-Moore a) jest również takiej postaci. Istotnie, załóżmy bowiem że q = # i 0 w 1 # i1 w k 1 # i k 1w k. Wówczas przesunięcie słowa q ma jedną z trzech poniższych postaci: # m Do takiego stanu prowadzi przesunięcie o wielkości s m w przypadku w k ɛ oraz s m i k 1 gdy w k = ɛ # j 0 z 1 # j1 z r 1 # j r 1 z r # jr, j 0 > 0 Tutaj musimy rozważyć dwa przypadki. Jeżeli w k ɛ to r k, z s = w k r+s dla 9

s = 1,..., r, j 0 i k r, j s = i k r+s dla s = 1,..., r 1, zaś j r jest równe wielkości przesunięcia. Jeżeli natomiast w k = ɛ to mamy r < k, z s = w k 1 r+s dla s = 1,..., r, j 0 i k 1 r, j s = i k 1 r+s dla s = 1,..., r 1 oraz j r = i k 1 + t, gdzie t > 0 i t jest wielkością przesunięcia w tym przypadku. z 1 # j1 z r 1 # j r 1 z r # jr Tutaj również mamy analogiczne przypadki. Jeżeli w k ɛ to r k, z s = w k r+s dla s = 2,..., r, z 1 = s k r+1, gdzie w k r+1 = xs k r+1 dla x Σ (s k r+1 jest sufixem, niekoniecznie właściwym, słowa w k r+1 ), j s = i k r+s dla s = 1,..., r 1 zaś j r jest równe wielkości przesunięcia. Natomiast gdy w k = ɛ mamy r < k, z s = w k 1 r+s dla s = 2,..., r, z 1 = s k r, gdzie w k r = xs k r dla x Σ, j s = i k 1 r+s dla s = 1,..., r 1 oraz j r = i k 1 + t gdzie t > 0 i t jest wielkością przesunięcia. Jednakże wszystkie trzy powyższe formy są w istocie przypadkami szczególnymi postaci 1.1. Na mocy tej uwagi wystarczy zatem pokazać,że dla danego stanu q postaci 1.1, wczytanie symbolu zgodnego z wzorcem prowadzi do stanu tej samej postaci. Załóżmy więc, że mamy stan q zadanej postaci, q nie jest stanem akceptującym (czyli i k 1 > 0) oraz wczytujemy symbol a zgodny z wzorcem na odpowiedniej pozycji. Rozważmy trzy przypadki: 1. k = 1 Ponieważ q nie jest stanem akceptującym i 0 > 0. A zatem stan q jest równy albo # m i wtedy δ(q, a) jest równy # m 1 z 1 dla z 1 = a, albo q = # i 0 w 1 (i 0 < m) i wówczas q jest równe # j 0 z 1, gdzie j 0 = i 0 1 oraz z 1 = aw 1. W dalszej części rozumowania będę zakładał, że k > 1. 2. w k ɛ Jeżeli i k 1 = 1, to stan q = δ(q, a) jest równy # j 0 z 1 # j1 z k 1, gdzie z s = w s dla s = 1,..., k 2, z k 1 = w k 1 aw k oraz j s = i s dla s = 0,..., k 2. W przeciwnym przypadku (i k 1 > 1) stan q jest równy # j 0 z 1 # j1 z k 1 # j k 1z k, gdzie z s = w s dla s = 1,..., k 1, z k = aw k, j s = i s dla s = 0,..., k 2 oraz j k 1 = i k 1 1. 3. w k = ɛ Tym razem jeżeli i k 1 = 1, to stan q = δ(q, a) jest równy # j 0 z 1 # j1 z k 1, gdzie z s = w s dla s = 1,..., k 2 oraz z k 1 = w k 1 a i j s = i s dla s = 0,..., k 2. Jeśli zaś i k 1 > 1 to stan q jest równy # j 0 z 1 # j1 z k 1 # j k 1z k, gdzie z s = w s dla s = 1,..., k 1, z k = a, j s = i s dla s = 0,..., k 2 oraz j k 1 = i k 1 1. A zatem na mocy zasady indukcji matematycznej zapostulowana postać stanów automatu Boyera-Moore a jest rzeczywiście poprawna. 1.3. Własności ogólnej postaci stanów automatu Boyera-Moore a Powyższe twierdzenie samo w sobie nie jest godne uwagi. Jednakże dzięki niemu jesteśmy w stanie podać bardzo silną charakteryzację stanów. Przedstawia ją poniższe twierdzenie. Twierdzenie 1.4 Jeżeli q = # i 0 w 1 # i1 w k 1 # i k 1w k jest stanem automatu Boyera-Moore a to prawdziwe są stwierdzenia: 1. 2 s k 1 istnieje dokładnie jedno l s takie, że 1 l s w s, dla którego w s [l s ] w[m w s + l s ] (czyli w s są niezgodne z sufixem w długości w s na dokładnie jednej pozycji). 10

2. jeżeli i 0 > 0 i k > 1, powyższą własność ma również w 1 3. jeżeli i 0 = 0 i k > 1, w 1 jest niezgodne z sufixem w długości w 1 na dokładnie jednej pozycji albo jest w pełni zgodne z tym sufixem. Dowód: Dowód przeprowadzamy korzystając z zasady indukcji matematycznej względem długości d najkrótszej ścieżki ze stanu początkowego # m do stanu q. Baza indukcji dla d = 0 jest trywialna i nie wymaga uzasadnienia. Przejdźmy zatem do kroku indukcyjnego. Załóżmy, że teza spełniona jest dla wszystkich stanów odległych od q 0 o nie więcej niż d 1 i niech q będzie stanem odległymo d od stanu początkowego. Niech q będzie poprzednikiem q na najkrótszej ścieżce z # m do q. Ponadto niech q = δ(q, a) oraz niech q = # i 0 w 1 # i1 w k 1 # i k 1w k. Oczywiście zakładamy też, że q nie jest stanem akceptującym, a zatem i k 1 > 0. Wówczas musimy rozważyć dwa przypadki: 1. a = w[p (q )] (po wczytaniu a nie następuje przesunięcie) Musimy rozważyć tutaj trzy podprzypadki, a mianowicie: k = 1 Z założenia, że q nie jest akceptujący i 0 > 0. A zatem stan q jest równy albo # m i wtedy q jest równy # m 1 z 1 dla z 1 = a, albo q = # i 0 w1 (i 0 < m) i wówczas q jest równe # j 0 z1, gdzie j 0 = i 0 1 oraz z 1 = aw 1. Teza jest zatem spełniona w sposób trywialny. W dalszej części dowodu zakładam, że k > 1. w k ɛ Jeżeli i k 1 = 1, to stan q = δ(q, a) jest równy # j 0 z 1 # j1 z k 1, gdzie z s = w s dla s = 1,..., k 2, z k 1 = w k 1 aw k oraz j s = i s dla s = 0,..., k 2. W przeciwnym przypadku (i k 1 > 1) stan q jest równy # j 0 z 1 # j1 z k 1 # j k 1z k, gdzie z s = w s dla s = 1,..., k 1, z k = aw k, j s = i s dla s = 0,..., k 2 oraz j k 1 = i k 1 1. W obu sytuacjach teza jest spełniona na mocy prawdziwości założenia indukcyjnego. w k = ɛ Tym razem jeżeli i k 1 = 1, to stan q = δ(q, a) jest równy # j 0 z 1 # j1 z k 1, gdzie z s = w s dla s = 1,..., k 2, z k 1 = w k 1 a oraz j s = i s dla s = 0,..., k 2. Jeśli zaś i k 1 > 1 to stan q jest równy # j 0 z 1 # j1 z k 1 # j k 1z k, gdzie z s = w s dla s = 1,..., k 1, z k = a, j s = i s dla s = 0,..., k 2 oraz j k 1 = i k 1 1. Jak wyżej teza wynika w sposób oczywisty z założenia indukcyjnego. 2. a w[p (q )] (po wczytaniu a nastepuje przesunięcie) Zauważmy, że możemy teraz w dużej mierze wykorzystać poprzedni przypadek. Tutaj bowiem tworzymy dokładnie takie same słowa jak powyżej, ale następnie zostają one odpowiednio przesunięte w celu osiągnięcia zgodności z wzorcem. Na mocy poprzedniego przypadku wiemy, że zanim dokonamy przesunięcia, po wczytaniu symbolu a dostajemy słowo postaci: # j 0 z 1 # j1 z k 1 # j k 1z k, gdzie k > 0, j 0 0, j s > 0 dla s = 1,..., k 1 oraz z s Σ + dla s = 1,..., k. Wiemy również, że: z 1,..., z k 1 spełniają tezę twierdzenia z k jest niezgodne z sufixem w długości z k na dokładnie jednej pozycji (jest o pozycja wczytanego właśnie symbolu a). Gdyby z k było zgodne z odpowiednim sufixem nie następowałoby bowiem przesunięcie. Oznaczmy powyższę uwagę przez ( ). 11

Teraz pozostaje już tylko zauważyć, że dowolne przesunięcie takiego słowa jest jednej z następujących postaci: # m Do takiego stanu prowadzi przesunięcie o wielkości s = m. W tym przypadku teza twierdzenia jest spełniona w sposób trywialny. # l 0 v 1 # l1 v r 1 # l r 1 v r # lr, l 0 > 0 W tym przypadku r k, v s = z k r+s dla s = 1,..., r oraz l s = j k r+s dla s = 1,..., r 1 oraz l 0 j k r. Ponadto l r jest równe wielkości przesunięcia. Na mocy uwagi ( ) wiemy, że v s jest niezgodne z sufixem w długości v s na dokładnie jednej pozycji dla s = 2,..., r. Ponadto jeżeli v 1 = z e dla e > 1 to na mocy tej samej uwagi v 1 jest niezgodne z odpowiednim sufixem w na dokładniej jednej pozycji. Jeżeli zaś v 1 = z 1, to korzystając z faktu, że wielkość przesunięcia musi być liczbą dodatnią dostajemy j 0 > 0, co na mocy uwagi ( ) daje nam również niezgodność v 1 z sufixem w długości v 1 na dokładnie jednej pozycji. To kończy dowód tego przypadku. v 1 # l1 v r 1 # l r 1 v r # lr, Teraz r k, v s = z k r+s dla s = 2,..., r, v 1 = s k r+1, gdzie z k r+1 = xs k r+1 dla x Σ (s k r+1 jest sufixem, niekoniecznie właściwym, słowa z k r+1 ), l s = j k r+s dla s = 1,..., r 1, zaś j r jest równe wielkości przesunięcia. Na mocy uwagi ( ) dostajemy prawdziwość pierwszego punktu tezy. Pozostaje pokazać jeszcze punkt trzeci. Ale v 1 jest sufixem z k r+1 niezgodnego z sufixem w odpowiedniej długości na co najwyżej jednej pozycji. Ponadto oczywisty jest fakt, że biorac sufixy równej długości dwóch słów niezgodnych na co najwyżej jednej pozycji, dostajemy również słowa niezgodne na co najwyżej jednej pozycji. A zatem v 1 jest niezgodne z sufixem w długości v 1 na co najwyżej jednej pozycji. Powyższe rozważania kończą dowód twierdzenia w tym przypadku. A zatem na mocy zasady indukcji matematycznej, twierdzenie to jest prawdziwe dla wszystkich osiągalnych stanów w automacie Boyera-Moore a. 12

Rozdział 2 Budowa automatu Boyera-Moore a Głównym punktem prezentowanej pracy jest analiza możliwych rozmiarów automatów Boyera- Moore a. Aby ją wykonać niezbędne było przeprowadzenie eksperymentów. Nie byłoby to jednak możliwe, gdybyśmy nie umieli w efektywny sposób kontruować automatów, gdyż rozważane przeze mnie klasy wzorców, prowadzą do automatów posiadających setki tysięcy stanów już dla słów o stosunkowo małej długości. W tym rozdziale opiszę zastosowany przeze mnie algorytm konstrukcji automatów Boyera- Moore a oraz zanalizuję jego złożoność. Po raz pierwszy prezentowana tutaj metoda została opisana w pracy [4]. 2.1. Ogólna metoda konstrukcji automatu Patrząc na definicję automatu (wprowadzoną w poprzednim rozdziale) możemy z łatwością podać rekurencyjny algorytm konstrukcji automatu. 1. Rozpoczynamy od stanu początkowego # m. 2. Dla każdego nie przetworzonego jeszcze stanu q i dla każdego możliwego symbolu a Σ: Niech i = P (q), q = q 1 q[i]q 2 (q[i] = #, q 1, q 2 (Σ + #) ) oraz r = q 1 w[i]q 2. Jeżeli w[i] = a to następnikiem q stanu q po wczytaniu symbolu a jest słowo r. W przeciwnym przypadku szukamy minimalnej wielkości przesunięcia s z definicji funkcji przejścia i zgodnie z nią tworzymy następnik q. Jeżeli stan q nie był wcześniej wygenerowany, dodajemy go do zbioru stanów jeszcze nieprzetworzonych. Widać zatem, że ogólna idea algorytmu jest bardzo prosta. Jednakże naiwna implementacja tego podejścia jest zbyt kosztowna czasowo. Jeżeli przez Q oznaczymy łączną liczbę stanów automatu, to taki algorytm ma wówczas złożoność czasową O( Q Σ (m 2 + m log Q )) (znalezienie przesuniecia s kosztuje bowiem O(m 2 ) operacji (naiwna metoda dopasowania wzorca), zaś sprawdzenie czy dany stan został już wcześniej rozważony przy zastosowaniu zrównoważonych drzew binarnych generuje koszt O(m log Q ) operacji). W dalszej części tego rozdziału pokażemy jak udoskonalić powyższą metodę, aby uzyskać złożoność czasową: O(m Σ Q ). 13

2.2. Generowanie następników w czasie O(m) Jako pierwsze udoskonalenie pokażemy, jak kosztem co najwyżej dwukrotnego zwiększenia zużycia pamięci generować następniki w czasie proporcjonalnym do długości wzorca. Niech q będzie rozważanym przez nas stanem oraz niech i = P (q) (zakładam że funkcja P zwraca pozycję najbardziej prawego wystąpienia symbolu #, poniższe udoskonalenie nie jest poprawne w przypadku rozszerzonych automatów Boyera-Moore a). Załóżmy teraz, że z każdym stanem q Q mamy związaną kolejkę Shif t zawierającą wszystkie dozwolone niezerowe przesunięcia posortowane w sposób rosnący. Formalniej: s Shift(q) 1 s m oraz k {s+1,,m} (q[k] # q[k] = w[k s]) Wówczas w przypadku niezgodności wczytanego symbolu a z wzorcem (a w[i]) musimy (zgodnie z definicją) znaleźć wartość s: s = min{j : k {j+1,,m} (r[k] # r[k] = w[k j])} Ale teraz jedynymi kandydatami na wartość s są elementy należące do kolejki Shif t(q), co wynika bezpośrednio z definicji tej struktury. Natomiast sprawdzenie kandydata k Shift(q) sprowadza się tylko do wykonania pojedynczego testu: (s i lub a = w[i s]), gdyż zgodność pozostałych symboli zapewnia nam ponownie definicja kolejki Shif t(q). Ponieważ ilość elementów kolejki Shif t(q) jest niewiększa od m, a sprawdzenie jednego kandydata wykonujemy już w czasie O(1), znalezienie poszukiwanej wartości s kosztuje nas w tym przypadku czas O(m). Posiadając zatem związaną z każdym stanem q wyżej zdefiniowaną strukturę Shif t(q) możemy generować następnik q stanu q w czasie O(m). Musimy jednak pokazać jeszcze, że umiemy również w czasie O(m) obliczać kolejkę Shift(q ) dla następnika stanu q. Niech Shift będzie kolejką związaną ze stanem q. W poniższych pseudokodach będę korzystał ze standardowych procedur EnQueue dodającej element do kolejki oraz DeQueue zwracającej pierwszy element kolejki i usuwającej go z niej. Rozważmy dwa przypadki: 1. a = w[i]: wówczas Shift uzyskujemy z listy Shift biorąc elemety zgodne z wczytanym symbolem a. while ( NotEmpty( S h i f t ) ) do { s = DeQueue ( S h i f t ) i f ( s >= i or a = w[ i s ] ) Enqueue ( s, S h i f t ) ; } 2. a w[i]: niech min będzie najmniejszym elementem kolejki Shif t zgodnym z wczytanym symbolem a (min i lub a = w[i min]). Ponieważ, zgodnie z definicją, kolejka Shift jest posortowana, podzielmy kolejkę Shift na trzy podkolejki : Shift1 = {s Shift : 1 s < i min} Shift2 = {s Shift : i min s < m min} Shift3 = {s Shift : m min s m} Teraz pokażemy jak skonstruować wyżej zdefiniowane podkolejki. Element s (1 s < i min) należy do Shift1 a = w[i s min] oraz s + min Shift 14

Element s (i min s < m min) należy do Shift2 Element s należy do Shift3 m min s m s + min Shift Prowadzi to zatem do następującego pseudokodu generującego kolejkę Shift w tym przypadku. r e p e a t min = DeQueue ( S h i f t ) u n t i l ( min >= i or a = w[ i min ] ) i f ( NotEmpty ( S h i f t ) ) { s = DeQueue ( S h i f t ) while ( s < i ) { i f (w[ i s ] = a ) EnQueue ( s min, S h i f t ) s = DeQueue ( S h i f t ) } // S h i f t 1 while ( s < m) { EnQueue ( s min, S h i f t ) s = DeQueue ( S h i f t ) } // S h i f t 2 } s = m min while ( s <= m) { EnQueue ( s, S h i f t ) s++ } // S h i f t 3 Warto zauważyć, że wykonując operacje DeQueue nie musimy sprawdzać czy kolejka Shift jest pusta, gdyż zawsze m Shift. W obu powyższych przypadkach generowanie kolejki Shift zajmuje czas O(m), gdyż kolejka Shif t zawiera co najwyżej m elementów. Pokazaliśmy zatem, że umiemy (kosztem wzbogacenia struktury stanów o dodatkowe informacje przechowywane w kolejce Shif t) generować następniki w czasie O(m). Jednakże wzbogacenie to nie zmienia asymptotycznej złożoności pamięciowej struktury automatu. 2.3. Dalsze udoskonalenia Pokażemy teraz jeszcze jedno proste udoskonalenie, które pozwoli nam pozbyć się czynnika log Q z wyrażenia opisującego złożoność czasową algorytmu budowy automatu Boyera- Moore a. Oczywiście czynnik log Q pojawia się, gdyż po wygenerowaniu następnika musimy sprawdzić czy stan ten został już wcześniej wygenerowany, a koszt takiego sprawdzenia w przypadku zastosowania drzew binarnych wynosi właśnie O(m log Q ). Jednakże zamiast drzew binarnych możemy wykorzystać drzewa typu TRIE (opis struktury można znaleźć np. w [7]). Dzięki temu sprawdzenie czy dany stan (reprezentowany przez słowo długości m) został już wcześniej wygenerowany można wykonać w czasie O(m) (zauważmy, że alfabet nad którym budowane jest drzewo TRIE jest niejako dwuliterowy - i-ty symbol może być albo nieznany (równy #) albo znany (wówczas jednoznacznie zdefiniowany równy w[i]). Również operacje dodawania i usuwania elementów do drzew typu TRIE wykonujemy w czasie O(m). 15

2.4. Wnioski Wykorzystując powyższe podrozdziały, możemy zmodyfikować wprowadzony na początku rozdziału algorytm generowania automatu Boyera-Moore a. Modyfikujemy strukturę reprezentującą stan automatu, która dodatkowo zawierać będzie (oprócz słowa reprezentującego stan oraz pozycji P (q)) kolejkę Shif t. Ponieważ słowo jest długości m, a struktura Shift zawiera co najwyżej m elementów, nie prowadzi to do zmiany asymptotycznej złożoności pamięciowej. Algorytm budowy automatu ma teraz postać: 1. Rozpoczynamy od stanu początkowego # m (kolejka Shift dla tego stanu jest postaci {1, 2,, m}) 2. Dla każdego nie przetworzonego jeszcze stanu q i dla każdego możliwego symbolu a Σ: Generujemy następnik stanu q oraz kolejkę Shift dla niego w czasie O(m) (zgodnie z podrozdziałem 2.2). Oznaczmy go przez q. Sprawdzamy czy stan q został już wcześniej wygenerowany w czasie O(m) (zgodnie z podrozdziałem 2.3). Jeżeli stan q nie był wcześniej wygenerowany, dodajemy go do do drzewa TRIE oraz do listy stanów jeszcze nieprzetworzonych. Na podstawie powyższych rozważań dostajemy: Twierdzenie 2.1 Automat Boyera-Moore a posiadający Q stanów możemy skonstruować (korzystając z powyższego algorytmu) w czasie O(m Σ Q ) oraz w pamięci O(m Q ). Na koniec zauważmy jeszcze, iż ponieważ sam rozmiar automatu jest rzędu O(m Q ), algorytm ten jest optymalny pamięciowo (oczywiście przy założeniu, że chcemy trzymać w pamięci cały automat). Ponadto w pracy [4] autorzy stwierdzają, że algorytm ten jest również optymalny jeżeli chodzi o złożoność czasową argumentując to stwierdzeniem, że dla każdego stanu oraz każdego możliwego symbolu wejściowego musimy obliczyć następnik składający się z m liter, a zatem potrzebujemy na to co najmniej O(m) czasu. 16

Rozdział 3 Rozmiar alfabetu a rozmiar automatów W poniższym rozdziale pokażę, że w pewnym sensie w naszych rozważaniach możemy się ograniczyć do alfabetów dwuliterowych. Twierdzenie, które poniżej zaprezentuję zostało udowodnione przez V. Bruyere i O. Delgrange a. Przedstawiony tutaj dowód został w większości zaczerpnięty z dodatku do pracy [3]. 3.1. Uwagi wstępne Na początek musimy wyraźnie zaznaczyć, że drugie twierdzenie, które zostanie zaprezentowane w tym rozdziale zostanie udowodnione tylko dla rozszerzonych automatów Boyera- Moore a. Ani ja ani autorzy oryginalnego dowodu nie potrafią pokazać poniższych faktów dla automatów standardowych, mimo iż wydaje się, że dla nich również jest ono prawdziwe. Po drugie muszę uściślić (na razie w sposób intuicyjny) co rozumiem przez stwierdzenie, iż w pewnym sensie alfabet dwuliterowy jest wystarczający. Mianowicie w poniższych dwóch twierdzeniach pokażemy, że rozmiar alfabetu Σ nie wpływa na typ (czy to wielomianowy czy wykładniczy) funkcji zwracającej maksymalny rozmiar rozszerzonego automatu Boyera- Moore a dla wzorców o danej długości m. Konkretniej, jeżeli umielibyśmy wskazać klasę wzorców nad alfabetem Σ, dla których rozmiar automatu jest wykładniczą funkcją długości słowa, to umielibyśmy również skonstruować klasę wzorców nad alfabetem dwuliterowym, dla których automaty Boyera-Moore a są również wykładnicze względem długości wzorców. Ścisłe sformułowanie zostanie przedstawione w twierdzeniu. 3.2. Twierdzenie 1 Rozpoczniemy jednak od bardzo prostego twierdzenia, żeby całościowo pokazać implikacje w obie strony. Twierdzenie 3.1 Niech w będzie słowem nad dwuliterowym alfabetem {a, b} oraz niech A w będzie rozszerzonym automatem Boyera-Moore a dla tego słowa. Wówczas dla każdego alfabetu Σ takiego, że Σ 2 istnieją słowo w nad alfabetem Σ i rozszerzony automat Boyera-Moore a A w odpowiadający słowu w takie, że w = w oraz A w A w. Dowód: Wystarczy wziąć dowolną funkcję różnowartościową f : {a, b} Σ oraz w = f(w). Wówczas 17

rozszerzony automat Boyera-Moore a dla w konstruujemy z A w używając tej samej funkcji P oraz dodając odpowiednie przejścia dla liter z Σ różnych od f(a) i f(b). Wówczas A w posiada co najmniej te same stany co A w. 3.3. Twierdzenie 2 Przedstawimy teraz główne twierdzenie tego rozdziału (wspomniane we wstępie), które odwraca sytuację z poprzedniego twierdzenia. Twierdzenie 3.2 Niech w będzie słowem nad alfabetem Σ ( Σ 2) i niech c = Σ. Niech A w będzie rozszerzonym automatem Boyera-Moore a skojarzonym ze słowem w. Wówczas istnieją: słowo w nad dwuliterowym alfabetem {a, b} oraz rozszerzony automat Boyera-Moore a A w dla słowa w takie, że w = (c + 3) w oraz A w A w. Dowód: Rozpocznijmy od pokazania jak dla danego słowa w zdefiniować odpowiednie słowo w nad dwuliterowym alfabetem {a, b}. W tym celu będziemy potrzebowali pewnych podstaw z teorii kodów. Będziemy bowiem kodowali wzorzec w we wzorcu w. W naszym przypadku kodowaniem nazywamy funkcję φ zastępującą dowolny symbol z alfabetu Σ przez słowo-kod nad alfabetem {a, b} w taki sposób, że dowolne zakodowane słowo możemy w sposób jednoznaczny odkodować. Oznaczmy przez X zbiór słów-kodów kodujących symbole z Σ - wówczas X nazywamy kodem. W naszym dowodzie wykorzystamy dwie własności kodu (dowody, iż dowolny kod posiada obie te własności można znaleźć w [8]). Każdy kod jest: 1. (1,1)-ograniczony ((1,1)-limited) u,v,w {a,b} uv, vw X v X 2. bezprzecinkowy (comma-free) x X + u,v {a,b} uxv X u, v X Kodem, który wykorzystamy w poniższym dowodzie jest: X = {bba i ba j a i + j + 1 = c (= Σ )} Dzięki wykorzystaniu takiego kodowania, wszystkie słowa z X są tej samej długości równej l = c + 3. Ponadto pozycja litery b znajdującej się pomiędzy a i i a j w słowie kodującym jednoznacznie określa, który symbol z Σ kodujemy. Zdefiniujmy zatem funkcję φ : Σ X jako kodowanie. Wówczas szukanym przez nas wzorcem w z treści twierdzenia jest w = φ(w). Pokażemy teraz jak dla uzyskanego przez nas słowa w zbudować rozszerzony automat Boyera-Moore a tak, aby posiadał wymaganą w treści twierdzenia własność. Niech A w = (Q, Σ, δ, q 0, F ) będzie rozszerzonym automatem Boyera-Moore a dla słowa w oraz niech P będzie funkcją z definicji z pierwszego rozdziału dla automata A w. Definiujemy teraz nowy rozszerzony automat Boyera-Moore a A w = (Q, {a, b}, δ, q 0, F ) wraz z funkcją P. Pokażemy w jaki sposób możemy zakodować w tym automacie automat A w. Rozpocznijmy od pokazania jak skonstruować włożenie z Q w Q. Dla dowolnego stanu q Q, oznaczmy przez φ(q) stan powstały z q poprzez zastąpienie każdego symbolu σ Σ z q przez słowo kodowe φ(σ), oraz każdego symbolu # przez słowo # l, gdzie l = Σ + 3. W ten 18

sposób każdy symbol ze słowa odpowiadającego q zostaje zastąpiony przez słowo długości l ze zbioru X {# l }. Teraz możemy przedstawić już konstrukcję automatu A w bazując na konstrukcji automatu A w i w sposób indukcyjny pokazać, że rodzina stanów {φ(q) q Q} jest podzbiorem Q. Baza indukcji jest oczywista - stan q 0 = φ(q 0) = # q0 l jest oczywiście stanem początkowym automatu A w. Krok indukcyjny jest już znacznie trudniejszy do pokazania. Naszym celem jest udowodnienie, że jeżeli stan φ(q) Q to wówczas σ Σ φ(δ(q, σ)) Q (czyli wszystkie stany będące następnikami q w automacie A w mają swoje odpowiedniki w automacie A w ). Oznaczmy: k = P (q) oraz ρ = w k (czyli litera w słowie w na aktualnie rozważanej pozycji). Musimy teraz rozważyć dwa przypadki. σ = ρ (brak przesunięcia) W tym przypadku w wyjściowym automacie A w wczytujemy symbol ρ. Zatem w automacie A w musimy teraz wczytać słowo φ(ρ) występujące w φ(w) na pozycjach: (k 1) l + 1, (k 1) l + 2,..., k l. Jednakże dzięki możliwości definicji funkcji P możemy dowolnie zdefiniować kolejność wczytywania symboli znajdujących się na tych pozycjach. Niech φ(ρ) = bba i ba c i 1 a. Wówczas funkcję P dla kolejnych stanów definiujemy tak, aby kolejność wczytywanych symboli była następująca: 1. dwie pierwsze litery b - pozycje: (k 1) l + 1, (k 1) l + 2 2. ostatnia litera a - pozycja: k l 3. pozostałe litery a - pozycje: (k 1) l + 3, (k 1) l + 4,..., (k 1) l + i + 2, (k 1) l + i + 4, (k 1) l + i + 5,... k l 1 Tutaj dla poprawności dowodu nie ma znaczenia dokładna kolejność pozycji, dlatego bez straty ogólności zakładamy, że będziemy je wczytywać od lewej do prawej (czyli w kolejności podanej powyżej). 4. środkowa litera b - pozycja (k 1) l + i + 3. Oczywiście rozpoczynając od stanu φ(q) i przechodząc po ścieżce zdefiniowanej przez słowo bba c b dochodzimy do stanu φ(δ(q, ρ)). σ ρ (następuje przesunięcie) W tym przypadku w wyjściowym automacie A w wczytujemy symbol σ. W naszym automacie A w musimy wczytać zatem słowo φ(σ), ale litery tego słowa wczytujemy zgodnie z kolejnością zdefiniowaną w poprzednim punkcie (oczywiście dopóty, dopóki są one tam zdefiniowane). Zauważmy, że słowa φ(ρ) i φ(σ) różnią się tylko na dwóch pozycjach ( środkowe b jest zamienione z pewnym a). Oznaczmy zatem przez n pozycję, dla której φ(ρ)[n] = a oraz φ(σ)[n] = b (jest ona jednoznacznie zdefiniowana oraz oczywiście nie jest równa żadnej z liczb (k 1) l + 1, (k 1) l + 2, k l). Zatem wczytywanie słowa φ(σ) obrazuje poniższy rysunek. Trzeba zaznaczyć, że stan p jest różny dla różnych σ Σ, co w sposób oczywisty wynika z jednoznaczności kodowania. 19

Funkcja przejść w automacie A w w momencie niezgodności Naszym celem jest teraz pokazanie, że stan r z powyższego rysunku różni się od stanu φ(δ(q, σ)) tylko tym, że jeszcze niewczytane symbole a z φ(σ) są w nim zastąpione przez symbole #. Wprowadźmy zatem następujące oznaczenia: q = u#v, gdzie u, v (Σ {#}) oraz u = k 1. Oczywiście przejście δ(q, σ) oznacza, że # zostaje zastąpiony przez σ co prowadzi do przesunięcia, które jest jednej z dwóch postaci: δ(q, σ) = u σv# s, gdzie u - sufix u δ(q, σ) = v # s, gdzie v - sufix v (niekoniecznie właściwy) Ponieważ oba przypadki dowodzi się w sposób identyczny, pokażemy tylko pierwszy z nich (drugi jest tak naprawdę powtórzeniem tych samych przejść). Załóżmy bez straty ogólności, że φ(σ) = bba i ba j b. Podczas wczytywania symboli słowa φ(σ) (w kolejności zdefiniowanej w poprzednim przypadku), pierwsza niezgodność wystąpi, kiedy znajdziemy się w stanie p oraz wczytamy symbol b (powyższy rysunek). Ze wszystkich poprzednich rozważań wiemy, że p = φ(u)bbx#yaφ(v), gdzie x, y {a, #}, x = i oraz y = j. Ponieważ w tle mamy ciągle nasz wyściowy automat A w oczywiste jest, że poprawnym przesunięciem jest przesunięcie s = l s. Zatem szukane przez nas przesunięcie w automacie A w w stanie p jest równe s l s (przesunięcie przy przejściu δ (p, b)). Pokażemy, że jest ono równe dokładnie l s. Załóżmy nie wprost, że s < l s. Oczywiście stan r możemy zapisać w postaci: r = z 1 # i 1 z 2 # i 2... z α # iα bbxbya # i α+1 z α+1 # α+2... # i β z β # s gdzie β 0, z 1, z β {a, b}, z 2, z 3,... z β 1 {a, b} +, i 1,... i α 1, i α+2,... i β > 0, i α, i α+1 0. Wprowadźmy następującą notację: jeżeli X jest zbiorem słów, to przez X oznaczmy zbiór wszystkich możliwych konkatenacji słów z X, włącznie z pustą konkatenacją oznaczaną przez ɛ. Ponadto niech X + = X \{ɛ}. Dodatkowo przez F (X ), P (X ) oraz S(X ) oznaczmy odpowiednio zbiory podsłow, prefixów oraz sufików słów ze zbioru X (przypomnijmy, że podsłowem nazywamy spójny podciąg znaków danego słowa). Korzystając teraz z faktu, że stan r powstaje z φ(q) przez przesunięcie o s oraz wykorzystując założenie indukcyjne możemy napisać, że z 1 S(X ), z 2,... z β X (3.1) Z drugiej strony wiemy jednak, że w rozszerzonym automatacie Boyera-Moore a dla słowa w, w dowolnym stanie q i-tym symbolem jest albo w[i] albo #. Zatem na tej podstawie możemy również napisać: z 1 P (X ), z 2,... z β F (X ), bbxbya (F (X ) {#}) (3.2) 20

Teraz właśnie skorzystamy z własności kodów, o których wspomniałem na początku dowodu. Po pierwsze korzystając faktu, że z 1 S(X ) P (X ) oraz wiedząc, że X jest (1,1)-ograniczony, dostajemy że z 1 X. (W ogólności, gdy nie jest spełnione założenie o (1,1)-ograniczoności nie jest to zawsze prawdziwe.) Teraz zajmiemy się zmiennymi z i dla 2 i β. Ponieważ z i F (X ) to możemy napisać, że z i = s i x i p i, gdzie s i S(X )\X, x i X oraz p i P (X )\X. Ale na mocy 3.1 wiemy też, że z i X. Jeżeli teraz x i = ɛ to s i p i X i z postaci słów-kodów dostajemy od razu s i = p i = ɛ. Jeżeli zaś x i ɛ to z bezprzecinkowości kodowania X dostajemy, że p i = s i = ɛ czyli z i = x i. To samo rozumowanie zachodzi również dla słowa bbxbya, które musi zgadzać się z φ(σ) (własność bezprzecinkowości stosuje się tu dzięki temu, iż znamy dwie początkowe litery b oraz słowo to ma odpowiednią długość). Podsumowując, jeżeli zapiszemy φ(w) jako: to każde z i zapisuje się jako: φ(w) = φ(σ 1 )φ(σ 2 )... φ(σ m ) z i = φ(σ ji )φ(σ ji +1)... φ(σ ji +l i ) oraz bbxbya pojawia się dokładnie w miejscu φ(σ). Pokazaliśmy zatem, że s musi byc zgodne z dekompozycją na słowa ze zbioru X {#} l - a zatem jest s = l s, czyli s < s. Wracając spowrotem do wyjściowego automatu A w oznacza to, że przesunięcie s nie jest najmniejszym możliwym przejściem - możliwe jest przejście s. Oczywiście jest to sprzeczność, a zatem nasze założenie, że s < l s było nieprawdziwe. Zachodzi zatem s = l s. Odpowiednia definicja funkcji P w dolnym łańcuchu stanów z rysunku, kończy dowód tego punktu. Na koniec trzeba jeszcze zauważyć, że dla dwóch różnych stanów p i q φ(p) φ(q), co wynika wprost z definicji kodowania. A zatem na mocy zasady indukcji matematycznej automat A w posiada zakodowany w sobie automat A w, a tym samym A w A w. 21

Rozdział 4 Ograniczenia na ilość stanów W tym rozdziale zaprezentuję przekrój wyników związanych z ograniczeniami na ilość stanów automatów Boyera-Moore a. Dla porządku rozpocznę od trywialnego faktu nie wymagającego uzasadnienia. Twierdzenie 4.1 Niech w będzie m-literowym słowem nad alfabetem Σ (w Σ m ). Wówczas automat Boyera-Moore a dla słowa w posiada Q stanów, przy czym: m + 1 Q 2 m 4.1. Automaty o rozmiarze Θ(m 3 ) W poniższym podrozdziale pokażemy, że dla alfabetu o rozmiarze Σ 2 umiemy podać wzorzec długości m, dla którego automat Boyera-Moore a posiada Ω(m 3 ) stanów. Powyższe ograniczenie pokażemy dla Σ = 2 (oczywiście ten sam rezultat stosuje się w sposób trywialny dla alfabetów Σ > 2 poprzez wykorzystanie tylko dwóch liter. Rozważmy wzorzec postaci: w = a i 1 ba i 2 a, b Σ, i 2 > i 1 > 0 Poniżej przedstawię wszystkie osiągalne stany, podzielone na grupy wraz z opisem przejść pomiędzy nimi. 1. stan początkowy: # m Po wczytaniu symbolu a przechodzimi do grupy 2, bo wczytaniu b do grupy 3. 2. stany: # + a j (1 j i 2 ) Jeżeli j < i 2 to po wczytaniu a zostajemy w tej grupie, po wczytaniu b przechodzimy do grupy 3. Jeżeli zaś j = i 2 to po wczytaniu a przechodzimy do stanu z grupy 4 (z j = i 1 ), zaś po wczytaniu b do grupy 3. 3. stany: # + ba j # i 2 j (0 j i 2 ) Jeżeli j < i 2 to po wczytaniu a przechodzimy do grupy 5 lub (dla j = i 2 1) pozostajemy w grupie 3, po wczytaniu b przechodzimy do grupy 7 (j i 2 i 1 ) lub pozostajemy w grupie w 3 z j = 0 (o ile j < i 2 i 1 ). W przeciwnym przypadku (j = i 2 ) po wczytaniu a przechodzimy do grupy 6, zaś po wczytaniu b przechodzimy do stanu z grupy 4. 4. stan: a j # + (min(i 1, i 2 i 1 ) j i 1 ) Po wczytaniu a przechodzimy do grupy 9, zaś po wczytaniu b przechodzimy do grupy 3 (z j = 0). 23

5. stany: # + ba j # + a k (j + k < i 2, k > 0) Jeżeli wczytamy a to pozostajemy albo w tej samej grupie (j +k < i 2 1) albo przechodzimy do grupy 3. Jeżeli natomiast wczytamy b to w zależności od stanu przechodzimy albo do grupy 7 (i 2 k 1 i 1 ) albo do grupy 4 (i 2 k 1 < i 1 ). 6. stany: a j # + a k ba i 2 (1 j + k i 1 ) Stan ten jest dla j +k = i 1 stanem akceptującym, w przeciwnym przypadku po wczytaniu a zostajemy w tej samej grupie, zaś po wczytaniu b przechodzimy do stanu z grupy 4 (z j = i 1 ). 7. stany: a j # + ba k # + (a) j {1,..., i 1 }, k {0,..., i 2 i 1 1} (b) j {max(1, min(i 2 i 1, i 1 ) i 2 + k),..., i 1 i 2 + k}, k {i 2 i 1,..., i 2 1}) Po wczytaniu a przechodzimy do stanów z grupy 8 lub grupy 6 (dla k = i 2 1),zaś po wczytaniu b przechodzimy do grupy 3 z j = 0 (jeśli i 2 k 1 i 1 ) lub pozostajemy w grupie 7 z k = 0 w przeciwnym przypadku. 8. stany: a j # + ba k # + a l (k + l < i 2, l > 0) (a) j {1,..., i 1 }, k {0,..., i 2 i 1 1} (b) j {max(1, min(i 2 i 1, i 1 ) i 2 + k),..., i 1 i 2 + k}, k {i 2 i 1,..., i 2 1}) Po wczytaniu a pozostajemy w tej samej grupie (gdy k + l < i 2 1) albo przechodzimy do grupy 6 z k = 0. Po wczytaniu b przechodzimy do grupy 4 albo do grupy 7 (jest to sytuacja analogiczna do grupy 5). 9. stan: a j # + a k (min(i 1, i 2 i 1 ) j i 1, 1 k i 2 ) Po wczytaniu a pozostajemy albo w tej samej grupie (gdy k < i 2 ), albo przechodzimy do grupy 4 (z j = i 1 ) w przeciwnym przypadku. Natomiast po wczytaniu b przechodzimy do grupy 6 (gdy k = i 2 ) albo do grupy 7 (w przeciwnym przypadku). Wyjaśnienia wymagają jeszcze dwie kwestie. Po pierwsze ogranicznie na j w opisie stanów z grupy 4 wynika z przejścia z grupy 5 do grupy 4 i nierówności i 2 k 1 i 1 opisującej to przejście. Natomiast ograniczenia w grupie 7 wynikają: a - z możliwości przejścia z grup 3 i 5, b - z możliwości przejścia z grupy 9. Obliczmy teraz ilość stanów automatu Boyera-Moore a dla rozważanego wzorca. Jednakże dla ułatwienia obliczeń dołożymy założenie i 2 2 i 1 (4.1) Wówczas min(i 2 i 1, i 1 ) = i 1. Ponieważ mamy już opisane wszystkie osiągalne stany, to obliczymy ilości wzorców z poszczególnych grup. 1. grupa 1: 1 stan 2. grupa 2: i 2 stanów 3. grupa 3: i 2 + 1 stanów 4. grupa 4: 1 stan 5. grupa 5: i 2 1 k=1 (i 2 k) = i 2 (i 2 1) 1 2 i 2 (i 2 1) = 1 2 i2 2 1 2 i 2 24

6. grupa 6: i 1 1 j=0 (i 1 j) 1 + 1 = i 2 1 1 2 i 1 (i 1 1) = 1 2 i2 1 + 1 2 i 1 7. grupa 7: i 1 (i 2 i 1 ) + i 2 1 k=i 2 i 1 +1 ((i 1 i 2 + k) max(1, i 1 i 2 + k) + 1) = = i 1 (i 2 i 1 ) + i 2 1 k=i 2 i 1 +1 1 = i 1 (i 2 i 1 ) + i 1 1 = i 1 i 2 i 2 1 + i 1 1 8. grupa 8: i 2 i 1 1 k=0 (i 1 (i 2 k 1)) + i 2 1 k=i 2 i 1 +1 (1 (i 2 k 1)) = = i 1 i 2 i 1 k=1 (i 2 k) + i 2 k=i2 i 1 +2 (i 2 k) = = i 1 (i 2 (i 2 i 1 ) 1 2 (i 2 i 1 ) (i 2 i 1 + 1)) + i 1 2 k=0 k = = i 1 (i 2 2 i 1 i 2 1 2 i2 2 + i 1 i 2 1 2 i2 1 1 2 i 2 + 1 2 i 1) + 1 2 (i 1 2) (i 1 1) = = i 1 ( 1 2 i2 2 1 2 i2 1 1 2 i 2 + 1 2 i 1) + 1 2 i2 1 3 2 i 1 + 1 = = 1 2 i 1 i 2 2 1 2 i3 1 1 2 i 1 i 2 + 1 2 i2 1 + 1 2 i2 1 3 2 i 1 + 1 = 1 2 i 1 i 2 2 1 2 i3 1 1 2 i 1 i 2 + i 2 1 3 2 i 1 + 1 9. grupa 9: i 2 stanów Patrząc na grupę numer 8 i korzystając z założenia 4.1 możemy zauważyć, że jeżeli i 2 oraz i 1 są rzędu Θ(m) to stała przy czynniku m 3 jest wówczas dodatnia. Obliczymy teraz zatem jaki powinien byc stosunek i 2 do i 1, żeby stała ta była maksymalna oraz ile wynosi wówczas jej wartość. Sumaryczna ilość stanów automatu wynosi więc: Q = 1 + i 2 + i 2 + 1 + 1 + 1 2 i2 2 1 2 i 2 + 1 2 i2 1 + 1 2 i 1 + i 1 i 2 i 2 1 + i 1 1+ + 1 2 i 1 i 2 2 1 2 i3 1 1 2 i 1 i 2 + i 2 1 3 2 i 1 + 1 + i 2 = = 3 + 5 2 i 2 + 1 2 i2 1 + 1 2 i2 2 + 1 2 i 1 i 2 + 1 2 i 1 i 2 2 1 2 i3 1 Zauważmy teraz, że i 2 = m i 1 1. Po podstawieniu dostajemy: Q = 3 + 5 2 (m i 1 1) + 1 2 i2 1 + 1 2 (m i 1 1) 2 + 1 2 i 1 (m i 1 1)+ + 1 2 i 1 (m i 1 1) 2 1 2 i3 1 = = 1 + 3 2 m 3 2 i 1 + 3 2 i2 1 + 1 2 m2 3 2 m i 1 + 1 2 m2 i 1 m i 2 1 Przyjmując teraz t = i 1 i traktując powyższe wyrażenie jako funkcję zmiennej t możemy wyznaczyć jej ekstrema korzystając z rachunku różniczkowego. f (t) = 3 2 + 3t 3 2 m + 1 2 m2 2 m t Przyrównując powyższą równość do zera i przechodząc z m w granicy do nieskończoności dostajemy, maksymalną wartość t dla: t = 1 m = 0, 25m 4 czyli i 2 3 i 1 i wówczas rozważany przez nas wzorzec posiada w przybliżeniu 0, 0625 m 3 + O(m 2 ) stanów. Powyższa analiza pokazuje zatem prawdziwość następującego twierdzenia. Twierdzenie 4.2 Dla alfabetu Σ ( Σ 2) i dowolnego m istnieje wzorzec w Σ m, dla którego ilość stanów automatu Boyera-Moore a wynosi Ω(m 3 ). 25

4.2. Automaty o rozmiarze Ω(m 5 ) W tym podrozdziale rozważmy klasę wzorców zaproponowaną w pracy [3] zdefiniowaną następująco: C3 = bbab i ab i+2 ab i+2 ab i a gdzie i = 4 j + 3, j 1. Niestety wszystkie poniższe rozważania są tylko wynikiem eksperymentów i nie pojawi się formalny dowód żadnego z poniższych stwierdzeń. W przypadku klasy C3 nie będziemy jednak przyglądać się całym automatom Boyera- Moore a dla tych wzorców a tylko ich fragmentom. Konkretniej, będziemy patrzeć na ścieżkę zdefiniowaną w sposób następujący: { r0 = # m 6 b ## b b # r i = δ(r i 1, b) dla i 1 gdzie m jest oczywiście długością wzorca. Eksperymenty pokazują, że ścieżka ta jest w rzeczywistości cyklem, a zatem N>0 (r N = r 0 oraz 1 i<n r i r 0 ) Niech LC(C3) = N oznacza długość tego cyklu. Poniższa tabela pokazuje wartości LC(C3) dla dwudziestu najkrótszych słów należących do klasy C3. wzorzec i m LC(C3) bbab 7 ab 9 ab 9 ab 7 a 7 39 13 656 bbab 11 ab 13 ab 13 ab 11 a 11 55 99 598 bbab 15 ab 17 ab 17 ab 15 a 15 71 403 468 bbab 19 ab 21 ab 21 ab 19 a 19 87 1 194 594 bbab 23 ab 25 ab 25 ab 23 a 23 103 2 904 736 bbab 27 ab 29 ab 29 ab 27 a 27 119 6 166 486 bbab 31 ab 33 ab 33 ab 31 a 31 135 11 851 668 bbab 35 ab 37 ab 37 ab 35 a 35 151 727 922 bbab 39 ab 41 ab 41 ab 39 a 39 167 35 406 184 bbab 43 ab 45 ab 45 ab 43 a 43 183 56 560 926 bbab 47 ab 49 ab 49 ab 47 a 47 199 86 786 716 bbab 51 ab 53 ab 53 ab 51 a 51 215 128 727 538 bbab 55 ab 57 ab 57 ab 55 a 55 231 185 497 008 bbab 59 ab 61 ab 61 ab 59 a 59 247 260 716 774 bbab 63 ab 65 ab 65 ab 63 a 63 263 358 554 916 bbab 67 ab 69 ab 69 ab 67 a 67 279 483 764 346 bbab 71 ab 73 ab 73 ab 71 a 71 295 641 721 208 bbab 75 ab 77 ab 77 ab 75 a 75 311 838 463 278 bbab 79 ab 81 ab 81 ab 79 a 79 327 1 080 728 364 bbab 83 ab 85 ab 85 ab 83 a 83 343 1 375 992 706 Patrząc teraz na wykres logarytmiczny zależności długości cyklu LC(C3) od długości wzorca m zamieszczony poniżej, widzimy że jest on niemal idealnie liniowy. Nachylenie tej prostej sugeruje, że długości cyklu możemy prawdopodobnie dość dobrze aproksymować wielomianem stopnia 5. 26

Okazuje się, że można tak dobrać współczynniki wielomianu stopnia 5, aby zwracał on dokładnie wartości LC(C3). Wielomian ten jest równy: LC(C3) = 1 16 (5i5 + 48i 4 + 76i 3 110i 2 209i 2) Biorąc pod uwagę, że i = m 11 4 dostajemy: LC(C3) = 5 16384 m5 + O(m 4 ) Jedyną wartością i spośród wyników eksperymentalnych, dla której załamuje się powyższy wzór jest i = 35 (wartość LC(C3) dla tego i została pogrubiona w powyższej tabeli). Jednakże widać, iż i = 35 jest w pewnym sensie wyjątkowe, gdyż załamuje się tam również monotoniczność wartości LC(C3). A zatem pomijając i = 35 dostajemy 19 punktów, dla których mamy zwarty wzór na długość rozważanego cyklu. Pozwala to podejrzewać, że istnieje nieskończenie wiele słów należących do tej klasy, dla których wzór ten jest prawdziwy, a co za tym idzie automat posiada wówczas Ω(m 5 ) stanów. W następnym rozdziale pokażę jeszcze, że wybór takiej klasy nie jest zupełnie przypadkowy i spróbuję uzasadnić jej wybór przez autorów cytowanej na początku pracy. 27

Rozdział 5 Struktura automatów dla wzorców postaci a i 1ba i 2 W tym rozdziale wrócimy jeszcze raz do automatów rozważaych w rozdziale czwartym i przyjrzymy się dokładniej ich strukturze dla wzorców postaci: w = a i 1 ba i 2 a, b Σ, i 2 > i 1 > 0 Ponadto, dla uproszczenia, założymy również, że: i 2 2 i 1 Niniejszy rozdział służy pokazaniu regularnej struktury automatów Boyera-Moore a dla tej klasy wzorców. 5.1. Struktura stanów na przykładzie wzorca a 3 ba 6 W tym rozdziale, aby lepiej zobrazować strukturę automatów Boyera-Moore a dokonamy podziału stanów automatu na inne grupy niż przy dowodzie rozmiaru automatu w rozdziale czwartym. W tym celu rozważać będziemy 7 klas stanów: 1. stany: # i 1 ## + a j dla 0 j i 2 2. stany: # i 1 ba j # + a k dla 1 j + k < i 2 oraz j 1 3. stany: a j # ba k # + a l dla 1 j i 1, 0 k i 2 i 1 1 oraz k + l < i 2 4. stany: a j # + ba j+i 2 i 1 # + a k dla 1 j < i 1 oraz 0 k < i 1 j 5. stany: a j # + a k ba i 2 dla 1 j + k < i 1 oraz j 1 29

6. stany: a i 1 ## + a j dla 0 j i 2 7. stany: # a j ba i 2 dla 0 j i 1 Teraz musimy jeszcze zdefiniować kolejność numerowania stanów. Tak więc stany numerować będziemy klasami, a wewnątrz poszczególnych klas w sposób następujący: klasy 1, 2, 4, 5, 6 i 7 kolejno według rosnących wartości j oraz k (o ile parametr k istnieje) klasa 3: według malejących wartości j, następnie według rosnących wartości k a w momencie identycznych j i k według rosnących wartości l Powyżej zdefiniowany podział oraz numeracja stanów pozwala nam narysować stany automatu w sposób bardzo uporządkowany. Poniższy rysunek przedstawia ten układ dla naszego przykładowego wzorca. Na powyższym rysunku poszczególne klasy stanów zostały oznaczone różnymi różnymi kolorami - odpowiednio: zielonym, niebieskim, żółtym, fioletowym, granatowym, czarnym i czerwonym. Okazuje się, że dla rozważanej klasy wzorców, stany automatu Boyera-Moore a możemy zawsze narysować w ten właśnie sposób, a żeby sformułować ten fakt musimy najpierw wprowadzić następujące definicje. Definicja 5.1 Ciągiem stanów długości n nazywamy uporządkowany zbiór n stanów narysowanych poziomo jeden obok drugiego. Stany w ciągu numerujemy od lewej do prawej. 30

Przykładem ciągu stanów długości 7 na powyższym rysunku jest zbiór stanów {0... 6}. Definicja 5.2 Trójątem stanów o boku a nazywamy zbiór a2 2 stanów układających się w kształt równoramiennego trójkąta prostokątnego. Formalniej zdefiniujmy dwa rodzaje trójkątów: LG-trójkątem nazywamy a ciągów stanów narysowanych jeden pod drugim o długościach kolejno a, a 1,..., 1 tak, aby i-te stany w każdym z ciągów (o ile istnieją) znajdowały się dokładnie pod sobą. Stany w LG-trójkącie numerujemy wierszami zaczynając od górnego, a w wierszu od lewej do prawej. PD-trójkątem nazywamy a ciągów stanów narysowanych jeden pod drugim o długościach kolejno 1, 2,..., a tak, aby i-te od końca stany w każdym z ciągów (o ile istnieją) znajdowały się dokładnie pod sobą. Stany w PD-trójkącie numerujemy wierszami od dolnego (długości a) do górnego natomiast w wierszu od lewej do prawej. Przykładem LG-trójkąta jest zbiór stanów {73, 74, 77} a przykładem PD-trójkąta jest zbiór stanów {7,..., 27} Definicja 5.3 Trapezem stanów od długości d i wysokości h (h < d) nazywamy d (d h+1) 2 h stanów układających się w kształt trapezu. Formalniej, jest to h ciągów stanów narysowanych jeden pod drugim o długościach kolejno d, d 1,..., d h + 1 tak, aby ponadto i-te stany w każdym z ciągów (o ile istnieją) znajdowały się dokładnie pod sobą. Stany w trapezie numerujemy wierszami poczynając od górnego, a w wierszu od lewej do prawej. Przykładem trapezu stanów o długości 6 i wysokości 3 jest zbiór stanów {28... 42}. Posiadając już powyższe definicje możemy sformułować fakt opisujący strukturę stanów automatów Boyera-Moore a dla rozważanej klasy wzorców. Fakt 5.4 Stany automatu Boyera-Moore a dla wzorca postaci a i 1 ba i 2 podzielić na następujące struktury: ciąg stanów długości i 2 + 1 (klasa 1) (2 i 1 i 2 ) możemy PD-trójkąt o długości i 2 (klasa 2) i 1 trapezów stanów o długości i 2 i wysokości i 2 i 1 (klasa 3) dwa LG-trójkąty o długości i 1 1 (klasy 4 i 5) ciąg stanów długości i 2 + 1 (klasa 6) ciąg stanów długości i 1 + 1 (klasa 7) Prawdziwość powyższego faktu wynika wprost z definicji powyżej wprowadzonych klas stanów automatu Boyera-Moore a. 5.2. Struktura funkcji przejścia na przykładzie wzorca a 3 ba 6 Funkcja przejścia automatów Boyera-Moore a dla wzorców z rozważanej klasy, mimo iż jest bardzo strukturalna, nie jest już tak regularna jak same stany. Dlatego też cały graf przejść podzielimy na pięć podgrafów. Oczywiście funkcja przejścia jest sumą tych właśnie podgrafów. Poniżej, bazując na rozważanym przykładzie, przedstawię te podgrafy oraz uogólnię je na całą klasę wzorców. 31

5.2.1. Przejścia po wczytaniu litery a Poniżej przedstawiam funkcję przejścia po wczytaniu litery a dla rozważanego przykładowego automatu. W celu analizy powyższego grafu musimy wprowadzić jeszcze dodatkową definicję: Definicja 5.5 Ostatnimi stanami w strukturach wprowadzonych w poprzednich trzech definicjach nazywamy: w przypadku ciągu stanów, najbardziej prawy stan (zgodnie z definicją numeracji stanów jest to stan o największym numerze) w przypadku trójkąta oraz trapezu są to ostatnie stany każdego z ciągów wchodzących w skład danej struktury W sposób analogiczny definiujemy pierwsze stany zdefiniowanych struktur. W tym momencie możemy już zauważyć następującą własność. Obserwacja 5.6 Po wczytaniu litery a przejście następuje: do kolejnego stanu w ciągu jeżeli taki istnieje (nie jesteśmy w ostatnim stanie żadnej ze struktur) zgodnie z następującymi zasadami w przeciwnym przypadku: do pierwszego stanu klasy 6 z ostatnich stanów klas 1 i 6 do pierwszego stanu klasy 7 z ostatnich stanów klasy 2 do stanu akceptującego (ostatni stan klasy 7) z ostatnich stanów pierwszego trapezu klasy 3 32

do pierwszego stanu w s-tym ciągu trójkąta reprezentującego klasę 5 z ostatnich stanów s + 1-wszego trapezu klasy 3 (trapezów w klasie 3 jest i 1, klasa 5 jest LGtrójkątem o długości i 1 1 a zatem wymiary są zgodne) do pierwszego stanu w s-tym ciągu trójkąta klasy 5 z ostatniego stanu w s-tym ciągu reprezentującego klasę 4 (tutaj również poprawność przejścia wynika ze zgodności wymiarów trójkątów stanów dla klas 4 i 5) do stanu akceptującego z ostatnich stanów klasy 6 Trzeba zaznaczyć, że poprawność powyższej obserwacji jak i wszystkich, które pojawią się poniżej a dotyczyć będą przejść po wczytaniu litery b wynikają wprost z definicji funkcji przejścia automatu Boyera-Moore a oraz wprowadzonej definicji klas stanów i odpowiednio zdefiniowanej ich numeracji. 5.2.2. Przejścia po wczytaniu litery b Niestety w przypadku wczytania litery b funkcja przejścia nie jest już tak ładna jak w poprzednim podrozdziale. Niemniej jednak w dalszym ciągu posiada ona jednoznacznie zdefiniowaną strukturę, którą poniżej opiszę. Pierwszy podgraf pokazuje przejścia po wczytaniu litery b ze stanów z klas 1 i 6. Jego analiza prowadzi do następującej obserwacji. Obserwacja 5.7 Po wczytaniu litery b przejście następuje: z pierwszych i 2 stanów z klasy 1 do pierwszych i 2 stanów klasy 2, konkretniej, z s-tego stanu klasy 1 przechodzimy do pierwszego stanu w s-tym ciągu klasy 2 (przypomnijmy, że w przypadku PD-trójkąta, który reprezentuje klasę 2, ciągi numerujemy zaczynając od dołu) 33

z ostatniego stanu klasy 1 do pierwszego stanu klasy 7 z pierwszych i 2 i 1 + 1 stanów klasy 6 do pierwszych stanów klasy 2 (z s-tego stanu klasy 6 do pierwszego stanu w s-tym ciągu klasy 2) z kolejnych i 1 1 stanów klasy 6 do pierwszych stanów klasy 4 (z i 2 i 1 + 1 + s-tego stanu do pierwszego stanu s-tego ciągu klasy 5) z ostatniego stanu klasy 6 do stanu akceptującego Kolejny podgraf pokazuje przejścia z klasy 2 i 7. W poniższej obserwacji będziemy potrzebowali jeszcze jednej definicji. Definicja 5.8 W PD-trójkącie stanów o długości a, i-tą kolumną (1 i a) nazywamy uporządkowany zbiór stanów: pierwszy z i-tego ciągu, drugi z i 1-wszego ciągu,..., i-ty z pierwszego ciągu. Stany te numerujemy w podanej wyżej kolejności od 1 do i. Obserwacja 5.9 Po wczytaniu litery b przejścia następują: z pierwszych i 2 i 1 kolumn PD-trójkąta stanów klasy 2 zgodnie z następującą regułą: z s-tych stanów (1 s i 2 i 1 ) ciągów 1, 2,..., i 2 i 1 + 1 s do pierwszego stanu s-tego ciągu klasy 2 z pierwszych i 1 stanów i 2 i 1 + s-tej kolumny (1 s i 1 ) do pierwszych stanów s-tego trapezu klasy 3, konkretniej z r-tego stanu danej kolumny do pierwszego stanu r-tego ciągu wspomnianego trapezu z pozostałych stanów ostanich i 1 kolumn PD-trójkąta (czyli stanów i 1 + 1, i 1 + 2,..., s s-tej kolumny (i 2 i 1 + 1 s i 2 ) do pierwszego stanu klasy 6 34

ze stanów z grupy 7 (oczywiście poza ostatnim, który jest stanem akceptującym) do pierwszego stanu klasy 6 Do rozważenia pozostały jeszcze stany z klas 3, 4 i 5, które to rozważymy łącznie. W tym celu rozważmy dwa poniższe podgrafy przejść, które podsumowane zostaną obserwacją. Rozpocznijmy od pokazania następującego faktu. 35

Fakt 5.10 Po wczytaniu litery b przejście z s-tego stanu r-tego ciągu n-tego trapezu klasy 3 nie zależy od numeru trapezu n. Oznacza to, że ograniczając się do przejść po wczytaniu litery b wszystkie i 1 trapezów jest izomorficznych. Dowód Rozważmy dwa odpowiadające sobie stany z dwóch różnych trapezów klasy 3: u 1 = a j 1 # ba k # + a l u 2 = a j 2 # ba k # + a l Zgodnie z definicją klasy musi być 0 k + l < i 2, 1 j 1, j 2 i 1. Ponadto zakładamy, że j 1 j 2. Musimy pokazać, że po wczytaniu litery b przejścia z u 1 i u 2 następują do tego samego stanu. Zauważmy, że po wczytaniu b dostajemy słowa: w 1 = a j 1 # ba k # ba l w 2 = a j 2 # ba k # ba l Oczywiście w obu przypadkach musi nastąpić przesunięcie. Łatwo zauważyć, że minimalna możliwa wielkość przesunięcia wynosi i 1 + 1, gdyż dla mniejszych wielkości przesunięć dostaniemy niezgodność litery b znajdującej się na pozycji i 1 + 1 w słowach w 1 i w 2. A zatem nowy stan nie będzie uwzględniał, co znadowało się na pozycjach {1, 2,..., i 1 +1}, a co za tym idzie przejście to utożsami ze sobą stany u 1 i u 2, które na pozycjach i 1 + 2, i 1 + 3,..., i 1 + i 2 + 1 są identyczne. Uogólnijmy teraz jeszcze pojęcie kolumny na obiekt trapezu stanów oraz LG-trójkąta. Definicja 5.11 W trapezie o długości d i wysokości h i-tą kolumną (1 i d) nazywamy uporządkowany zbiór i-tych stanów z ciągów 1, 2,..., h (o ile istnieją). W LG-trójkącie stanów o długości a, i-tą kolumną (1 i a) nazywamy uporządkowany zbiór stanów i-tych stanów z ciągów 1, 2,..., a (o ile istnieją). Teraz możemy już sformułować obserwację dotyczącą przejść z pozostałych jeszcze do rozważenia klas stanów. Obserwacja 5.12 Po wczytaniu litery b przejście następuje: na mocy faktu 5.10 poniższe spostrzeżenie ogranicza się do pojedynczego trapezu: z ostatnich i 1 kolumn trapezu stanów klasy 3 do pierwszego stanu klasy 6 z pierwszych s stanów s-tej kolumny trapezu stanów klasy 3 (1 s i 2 i 1 ) do pierwszego stanu s-tego ciągu klasy 2 z pozostałych stanów trapezu klasy 3 (czyli stanów s + 1, s + 2,..., i 2 i 1 s-tej kolumny (2 s i 2 i 1 ) przechodzimy według następującej reguły: z s-tego stanu w r-tym ciągu do pierwszego stanu s-tego ciągu (r + s 2 i 2 + 3 i 1 )-tego trapezu stanów klasy 3 z s-tego stanu r-tego ciągu LG-trójkąta stanów klasy 4 do pierwszego stanu s-tego ciągu s + r 1-wszego trapezu stanów klasy 3 ze wszystkich stanów klasy 5 do pierwszego stanu klasy 6 36

Na podstawie wszystkich poprzednich obserwacji z tego rozdziału można sformułować następujący wniosek. Wniosek 5.13 Struktura automatu Boyera-Moore a dla klasy wzorców a i 1 ba i 2 (2 i 1 i 2 ) 1. Stany automatu Boyera-Moore a mają strukturę opisaną w fakcie 5.4. 2. Funkcja przejścia automatu jest sumą czterech podgrafów przedstawionych w obserwacjach 5.6, 5.7, 5.9 i 5.12. Poprawność pierwszego punktu powyższego wniosku wynika oczywiście z wprowadzonego na początku rozdziału podziału na klasy stanów oraz dowodu twierdzenia pokazującego rozmiar automatu Boyera-Moore a dla rozważanej klasy wzorców z rozdziału czwartego. Natomiast zapostulowana postać funkcji przejścia wynika z definicji przesunięcia wprowadzonego w definicji automatu Boyera-Moore a w rozdziale pierwszym. W związku z tym, że we wzorcach należących do rozważanej klasy a i 1 ba i 2 występuje tylko jedna litera b, przy obliczaniu wielkości przesunięcia musimy dokładniej przyjrzeć się tylko pozycji, na której ta litera występuje (gdy przesunięcie nie następuje, przejście jest oczywiste). Opis przejść został dokładniej przedstawiony przy okazji dowodu twierdzenia w rozdziale czwartym, natomiast obserwacje, które składają się na powyższy wniosek wynikają z takich właśnie rozważań. Dzięki sformułowaniu ich dla sytuacji ogólnej niezależnie od rozważanego przykładu, otrzymujemy jednoznaczny opis struktury automatu Boyera-Moore a dla wzorców z rozważanej klasy. 37

Rozdział 6 Rozmiary automatów dla krótkich wzorców W tym rozdziale zaprezentuję przekrój swoich wyników, które pokażą między innymi dlaczego wybór klasy C3 nie jest zwykłym strzałem. Ponadto postawię również nową hipotezę dotycząca rozmiaru automatów Boyera-Moore a. 6.1. Dokładne rozmiary automatów dla krótkich wzorców Kiedy rozpoczynałem eksperymenty z automatami Boyera-Moore a pierwszym moim krokiem było wygenerowanie wszystkich wzorców nad alfabetem dwuliterowym o zadanej długości i wybranie tych, dla których automaty mają największy rozmiar. Poniższa tabela zawiera wyniki tego doświadczenia. m Q max wzorce 1 2 b 2 4 bb, ba 3 7 bbb, abb, bab 4 13 babb 5 21 babbb 6 31 babbbb 7 43 babbbbb, baababb 8 58 bababbbb 9 84 abbbabbaa 10 107 bbababbbaa 11 156 abbababbbaa 12 197 abbabbbbabaa 13 282 abbababbbabaa 14 362 babbbbbabbbaba 15 518 abbababbbabbbaa 16 635 abbbababbabbbbaa 17 968 abbbbbabbbabbbaba 18 1230 babbbbbabbbabbbaba 19 1949 bbababbbbbbbbbbbaba 20 2323 bbbababbbbbbbbbbbaba 21 3461 abbbabbbbbabbbbbabbba 22 4052 babbbabbbbbabbbbbabbba 39

Trzeba zauważyć jednak, że ponieważ role liter a i b są symetryczne, to wzorców dla których osiągany jest maksymalny rozmiar automatu jest dokładnie dwa razy więcej (w powyższych możemy zamienić rolami a i b). Jednakże z powodów wydajnościowych nie jesteśmy w stanie obliczać automatów Boyera- Moore a dla wszystkich 2 m słów długości m dla większych m. Musimy zatem w pewien sposób ograniczyć klasę słów, którą będziemy rozważać. Patrząc na powyższą tabelę możemy zauważyć, że w większości wzorców dla których odpowiadające im automaty Boyera-Moore a są maksymalne, nie występują obok siebie dwie litery a (te wzorce dla których nie jest to prawdziwe zostały pogrubione). A zatem pierwszym pomysłem na ograniczenie klasy wszystkich słów długości m nad dwuliterowym alfabetem jest rozważanie tylko słów nie zawierających podsłowa aa. 6.2. Klasa wzorców niezawierających podsłowa aa Zajmiemy się teraz słowami, które nie zawierają podsłowa aa. Możemy ją zapisać w sposób następujący: B1 = a(b + a) b (b + a) b Zastanówmy się najpierw ile jest słów długości m tej postaci. Zauważmy, że jeżeli słowo rozpoczyna się od a, to musi być ono postaci abx, gdzie x B1 oraz x = m 2. Jeśli zaś słowo rozpoczyna się od b to jest postaci bx, gdzie x B1 i x = m 1. Wprowadzając następujące oznaczenie: B1 m = {x B1 : x = m} z powyższych rozważań otrzymujemy rekurencję B1 m = B1 m 2 + B1 m 1. Dodając jeszcze warunki brzegowe B1 1 = 2 i B1 2 = 3 dostajemy już łatwo rozwiązanie: B1 m = F m+1, gdzie F n oznacza n-tą liczbę Fibonacciego. Oznacza to, że rozmiar klasy B1 m jest mniejszy, ale w dalszym ciągu jest wykładniczy, a zatem będziemy musieli jeszcze ograniczyć tę klasę. Rozpocznijmy jednak od wyznaczenia słów należących do tej klasy, dla których automaty Boyera-Moore a są największe. Wyniki eksperymentów przedstawia poniższa tabela. m Q max wzorce 1 2 a, b 2 4 ab, ba, bb 3 7 aba, abb, bab, bbb 4 13 babb 5 21 babbb 6 31 babbbb 7 43 babbbbb 8 58 bababbbb 9 76 bbabbbbbb 10 100 babbababbb 11 134 abbbbabbaba 12 171 babbabbbbaba 13 279 abbbbbabbbaba 14 362 babbbbbabbbaba 15 462 ababbbabbbbbbba 40

16 627 bababbbbabbbbaba 17 968 abbbbbabbbabbbaba 18 1230 babbbbbabbbabbbaba 19 1949 bbababbbbbbbbbbbaba 20 2323 bbbababbbbbbbbbbbaba 21 3461 abbbabbbbbabbbbbabbba 22 4052 babbbabbbbbabbbbbabbba 23 8440 bbabbbbbabbbbbbbabbbbba 24 9826 bbbabbbbbabbbbbbbabbbbba 25 10505 ababbbbbabbbbbbbbbbbbbaba 26 12270 bababbbbbabbbbbbbbbbbbbaba 27 16259 abbabbbbbabbbbbbbabbbbbabba 28 18338 babbbabbbbbabbbbbabbbbbabbba 29 35104 ababbbbbabbbbbbbbbbbbbbbbbaba 30 40331 bababbbbbabbbbbbbbbbbbbbbbbaba Spróbujmy teraz jeszcze bardziej ograniczyć klasę B1. W tym celu wprowadźmy następującą definicję. Definicja 6.1 Niech w = w[1]w[2]... w[n] będzie słowem długości n nad alfabetem Σ i niech σ Σ. Maksymalnym podsłowem złożonym z samych liter σ Σ nazywamy każde takie podsłowo v = w[i]w[i + 1]... w[j] (1 i j n) słowa w, dla którego spełnione są trzy warunki: 1. s {i,i+1,...,j} w[s] = σ 2. i = 1 lub w[i 1] σ 3. j = n lub w[j + 1] σ Przyglądając się teraz powyższym wynikom można zauważyć, że w znaczącej większości powyższych wzorców, maksymalne podsłowa złożone samych liter b mają długości albo równe jeden albo będące liczbami pierwszymi (słowa nie posiadające tej własności zostały w powyższej tabeli pogrubione). Możemy zatem w ten sposób próbować ograniczyć klasę B1. 6.3. Ograniczenie klasy B1 Zanim formalnie zdefiniujemy rozważane ograniczenie klasy B1, wprowadźmy nastepującą definicję. Definicja 6.2 Niech w będzie słowem należącym do klasy B1. Wówczas słowo w może posiadać jedną z czterech poniższych postaci, które będziemy zapisywać w następujący sposób 1. w = b e 1 ab e 2 a... ab e k (k 0, 1 s k e s 1) zapisujemy jako (e 1, e 2,..., e k ) 2. w = ab e 1 ab e 2 a... ab e k (k 0, 1 s k e s 1) zapisujemy jako (a, e 1, e 2,..., e k ) 3. w = b e 1 ab e 2 a... ab e ka (k 1, 1 s k e s 1) zapisujemy jako (e 1, e 2,..., e k, a) 4. w = ab e 1 ab e 2 a... ab e ka (k 1, 1 s k e s 1) zapisujemy jako (a, e 1, e 2,..., e k, a) Powyższy sposób zapisu wzorców z klasy B1 będę nazywał B-notacją. 41

Spróbujmy zatem teraz ograniczyć klasę B1 w celu przeprowadzenia eksperymentów dla wzorców o trochę większej długości. Rozważmy zatem następującą definicję. Definicja 6.3 Niech w B1. Wówczas w B-notacji możemy zapisać słowo w w jednej z czterech postaci: (e 1, e 2,..., e k ) (a, e 1, e 2,..., e k ) (e 1, e 2,..., e k, a) (a, e 1, e 2,..., e k, a) Definiujemy teraz klasę B2 jako podklasę B1 następująco: słowo w należy do klasy B2 wtedy i tylko wtedy gdy 1 s k e s jest albo równe jeden albo jest liczbą pierwszą. Niestety takie ograniczenie klasy jest dla nas niewystarczające. Dlatego w eksperymencie, którego wyniki przedstawiam poniżej rozważam tylko wzorce należące do klasy B2, dla których (używając B-notacji) k 6. Taką podklasę będziemy oznaczać jako B2 6. A zatem rozważamy tylko wzorce zawierające co najwyżej sześć maksymalnych podsłów złożonych z samych liter b. Poniższa tabela przedstawia wyniki eksperymentów przeprowadzonych dla podklasy B2 6. Wzorce dla których osiągane jest podane maksimum zostały zapisane przy użyciu B-notacji. m Q max wzorce 31 62 933 (2, 5, 7, 7, 5, a) 32 70 939 (3, 5, 7, 7, 5, a) 33 72 161 (a, 5, 7, 3, 7, 5, a) 34 93 910 (5, 5, 7, 7, 5, a) 35 144 965 (2, 1, 13, 13, 1, a) 36 163 443 (3, 1, 13, 13, 1, a) 37 200 514 (a, 1, 5, 19, 5, 1, a) 38 365 626 (5, 1, 13, 13, 1, a) 39 321 551 (a, 2, 11, 7, 11, 2, a) 40 344 864 (1, 7, 3, 13, 3, 7, a) 41 716 349 (2, 7, 3, 13, 3, 7, a) 42 797 186 (3, 7, 3, 13, 3, 7, a) 43 641 971 (a, 7, 5, 13, 5, 7, a) 44 712 180 (1, 7, 5, 13, 5, 7, a) 45 1 460 378 (2, 7, 5, 13, 5, 7, a) 46 1 611 934 (3, 7, 5, 13, 5, 7, a) 47 2 251 115 (a, 3, 11, 13, 11, 3, a) 48 2 984 673 (1, 2, 17, 3, 17, 2, a) 49 4 736 765 (2, 7, 11, 5, 11, 7, a) 50 5 148 047 (3, 7, 11, 5, 11, 7, a) Warto zauważyć tylko, że podane wyżej wzorce, dla których automaty Boyera-Moore a są maksymalne w klasie B2 6, są jedynymi wzorcami dla których osiągane jest maksimum. W tym momencie doszliśmy też do miejsca, w którym można podjąć próbę uzasadnienia, że wybór klasy C3 w rozdziale czwartym nie był strzałem. Patrząc bowiem na powyższe 42

wyniki można zauważyć, że wszystkie te wzorce są prawie-palindromiczne. Konkretniej, jeżeli pominiemy ewentualne litery a z początku i końca wzorca dostając wzorzec postaci (e 1, e 2,..., e k ) to albo (e1, e2,..., e k ) albo (e 2, e 3,... e k ) jest palindromem. Dokładnie taka sama sytuacja ma też miejsce w klasie C3. Bazując teraz na powyższej obserwacji spróbujemy jeszcze zawęzić klasę B2 otrzymując większe automaty dla rozważanych wyżej długości słów oraz kilka wyników dla trochę dłuższych wzorców. 6.4. Klasa wzorców prawie-palindromicznych Opierając się na powyższych obserwacjach zdefiniujmy teraz zaanonsowaną powyżej klasę wzorców prawie-palindromicznych B3. Definicja 6.4 Niech w będzie słowem należącym do klasy B2 (a zatem w nie zawiera podsłowa aa oraz maksymalne podsłowa złożone z liter b mają długości równe jeden bądź będące liczbami pierwszymi). Wówczas stosując B-notację możemy zapisać w w jednej z czterech poniższych postaci: (e 1, e 2,..., e k ) (k 0) (a, e 1, e 2,..., e k ) (k 0) (e 1, e 2,..., e k, a) (k 1) (a, e 1, e 2,..., e k, a) (k 1) Wówczas w należy do klasy B3 wtedy i tylko wtedy, gdy spełniony jest jeden z trzech warunków: 1. w = a lub w = ɛ 2. (e 1, e 2,..., e k ) jest palindromem 3. (e 2, e 3,..., e k ) jest palindromem Niestety podobnie jak w przypadku klasy B2, wzorców należących do tej klasy o większych długościach jest zbyt dużo do rozważenia. Dlatego tak jak poprzednio, będziemy rozważać tylko wzorce, dla których wartość k z powyższej definicji jest ograniczona przez stałą. Jeżeli k r to taką podklasę będziemy oznaczać jako B3 r. Poniższa tabela przedstawia wyniki eksperymentów dla wzorców należących do klasy B3 8 (czyli ilość maksymalnych podsłów złożonych z samych b jest co najwyżej równa 8). m Q max wzorce 31 62 933 (2, 5, 7, 7, 5, a) 32 70 939 (3, 5, 7, 7, 5, a) 33 72 161 (a, 5, 7, 3, 7, 5, a) 34 93 910 (5, 5, 7, 7, 5, a) 35 144 965 (2, 1, 13, 13, 1, a) 36 163 443 (3, 1, 13, 13, 1, a) 37 200 514 (a, 1, 5, 19, 5, 1, a) 38 365 626 (5, 1, 13, 13, 1, a) 39 355 411 (2, 3, 7, 5, 5, 7, 3, a) 40 446 923 (1, 2, 5, 3, 11, 3, 5, 2, a) 43

41 716 349 (2, 7, 3, 13, 3, 7, a) 42 797 186 (3, 7, 3, 13, 3, 7, a) 43 761 905 (2, 2, 5, 7, 5, 7, 5, 2, a) 44 1 024 668 (1, 2, 3, 5, 7, 7, 5, 3, 2, a) 45 2 021 648 (a, 1, 5, 11, 3, 11, 5, 1, a) 46 2 287 357 (1, 1, 5, 11, 3, 11, 5, 1, a) 47 2 755 973 (2, 1, 5, 11, 3, 11, 5, 1, a) 48 3 072 645 (3, 1, 5, 11, 3, 11, 5, 1, a) 49 4 736 765 (2, 7, 11, 5, 11, 7, a) 50 5 177 711 (1, 3, 13, 5, 5, 13, 3, a) W powyższej tabeli pogrubione zostały wartości, które są większe od dotychczas wygenerowanych (czyli większe od wartości wygenerowanych w eksperymencie dla klasy B2 6 ). Ponieważ nowych wartości jest prawie połowa można powiedzieć, że zawężenie klasy B2 do klasy B3 spełnia swoją rolę. Jest to oczywiście spowodowane tym, że w powyższym eksperymencie dopuszczamy większą ilość maksymalnych podsłów złożonych z samych liter b (osiem zamiast sześciu), niemniej jednak widać, że klasa ta zawiera słowa dla których automaty Boyera-Moore a są duże, a to właśnie było naszym celem. Co więcej, w tym przypadku możemy je również konstruować. Dla klasy B3 8 jesteśmy w stanie wygenerować automaty również dla kilku dłuższych wzorców. Wyniki tego eksperymentu przedstawia poniższa tabela. m Q max wzorce 51 9 407 874 (2, 1, 3, 17, 17, 3, 1, a) 52 10 283 853 (3, 1, 3, 17, 17, 3, 1, a) 53 11 001 201 (a, 3, 5, 11, 7, 11, 5, 3, a) 54 18 090 617 (5, 1, 3, 17, 17, 3, 1, a) Kontynuacja tego eksperymentu dla dłuższych wzorców nie jest uzasadniona wynikami poprzednich eksperymentów. Wydaje się bowiem, że moglibyśmy uzyskać wzorce dla których automaty Boyera-Moore a posiadają więcej stanów, jeżeli dopuścilibyśmy większą ilość maksymalnych podsłów złożonych z samych liter b (czyli rozważyli klasę B3 k dla k > 8). Oczywiście nie jest też pewne, że nie uzyskalibyśmy większych automatów dla powyższych długości na przykład w klasie B3 10. Ponadto dla większych k i dłuższych wzorców przeprowadzenie jakichkolwiek eksperymentów jest bardzo trudne. Jednakże problemem nie jest tu jedynie wydajność czasowa (mimo iż do rozważenia mamy wówczas kilkadziesiąt czy nawet kilkaset tysięcy wzorców, a dla wielu z nich automaty Boyera-Moore a posiadają kilka milionów stanów). Nowym problemem, który się tu pojawia jest niedostateczna ilość pamięci operacyjnej w dzisiejszych komputerach, gdyż wygenerowanie całego automatu posiadającego kilkadziesiąt milionów stanów i utrzymanie go w pamięci (co jest niezbędne do obliczenia ilości jego stanów) wymaga nawet kilku gigabajtów pamięci operacyjnej. Co więcej, już do skonstruowania największych automatów w powyższym eksperymencie nie mogłem wykorzystać opisanego w rozdziale drugim algorytmu, gdyż był on zbyt nieefektywny pamięciowo. Musiałem posłużyć się metodą naiwną jak również uciec się do kilku sztuczek programistycznych w celu maksymalnego ograniczenia zużycia pamięci. Niemniej jednak powyższe eksperymenty dają nam pewne wyniki, które możemy teraz przeanalizować. Na początek przyjrzyjmy się wykresowi logarytmicznemu rozmiaru maksymalnego automatu Boyera-Moore a w podklasie B3 8 jako funkcji długości wzorca. Zależność ta przedstawiona została poniżej. 44

Mimo iż punkty na powyższym wykresie wydają się układać wzdłuż linii prostej, to nie jest to już w tym przypadku tak oczywiste jak w poprzednim rozdziale dla automatów o rozmiarze Ω(m 5 ). Z dość dużym prawdopodobieństwem możemy odrzucić tutaj hipotezę, że automaty te mają rozmiar wykładniczy, gdyż obliczenie pierwiastów n-tego stopnia z ich rozmiarów daje ciąg monotonicznie malejący. Jeżeli będziemy próbować przybliżać wyniki eksperymentów wielomianem, to asymptotykę tego wykresu najlepiej oddaje wielomian dziesiątego stopnia. Wielomian ten jest w przybliżeniu równy: W (m) 0.0057674 m 10 + O(m 9 ) Poniżej przedstawiam wykres tego wielomianu wraz z naniesionymi na niego wynikami eksperymentów. Widać zatem, że wykres ten całkiem dobrze oddaje wyniki eksperymentów. Pozwolę sobie zatem postawić następującą hipotezę: 45

Hipoteza 6.5 Istnieje klasa wzorców nad alfabetem Σ = {a, b}, dla których rozmiar automatu Boyera-Moore a asymptotycznie zachowuje się jak wielomian co najmniej dziesiątego stopnia. Warto zauważyć, iż hipoteza ta jest mocniejsza od wszystkich występujących do tej pory w literaturze (jeżeli próbujemy aproksymować rozmiary automatów wielomianami). Dotychczas taką rolę pełniło przypuszczenie postawione w pracy [3] sugerujące, że istnieją wzorce dla których rozmiar automatów zachowuje się jak wielomian stopnia 7. 6.5. Klasa C4 Powróćmy teraz na moment do klasy C3 wprowadzonej w rozdziale czwartym. Wydaje się bowiem, że istotnie łatwiejsza może być analiza pojedynczego cyklu w automacie Boyera- Moore a niż analiza całego automatu. Dlatego też, bazując na rozumowaniu przeprowadzonym dla klasy C3, wprowadzę bardzo podobną klasę wzorców i przedstawię wyniki swoich eksperymentów. Rozważmy klasę: C4 = bbab i ab i+2 ab i 2 ab i+2 ab i a dla i 5 oraz ścieżkę zdefiniowaną w sposób następujący: { r0 = # m 6 b ## b b # r i = δ(r i 1, b) dla i 1 gdzie m jest oczywiście długością wzorca. Podobnie jak poprzednio eksperymenty pokazują, że ścieżka ta jest w rzeczywistości cyklem. Niech więc LC(C4) oznacza długość tego cyklu. Poniższa tabela pokazuje wartości LC(C4) dla najkrótszych słów należących do tej klasy. wzorzec i m LC(C4) bbab 5 ab 7 ab 3 ab 7 ab 5 a 5 35 1 634 bbab 6 ab 8 ab 4 ab 8 ab 6 a 6 40 8 792 bbab 7 ab 9 ab 5 ab 9 ab 7 a 7 45 9 246 bbab 8 ab 10 ab 6 ab 10 ab 8 a 8 50 24 458 bbab 9 ab 11 ab 7 ab 11 ab 9 a 9 55 372 bbab 10 ab 12 ab 8 ab 12 ab 10 a 10 60 321 750 bbab 11 ab 13 ab 9 ab 13 ab 11 a 11 65 104 754 bbab 12 ab 14 ab 10 ab 14 ab 12 a 12 70 1 620 362 bbab 13 ab 15 ab 11 ab 15 ab 13 a 13 75 2 193 426 bbab 14 ab 16 ab 12 ab 16 ab 14 a 14 80 13 497 150 bbab 15 ab 17 ab 13 ab 17 ab 15 a 15 85 2 009 996 bbab 16 ab 18 ab 14 ab 18 ab 16 a 16 90 98 065 416 bbab 17 ab 19 ab 15 ab 19 ab 17 a 17 95 7 565 984 bbab 18 ab 20 ab 16 ab 20 ab 18 a 18 100 55 707 848 bbab 19 ab 21 ab 17 ab 21 ab 19 a 19 105 54 302 250 bbab 20 ab 22 ab 18 ab 22 ab 20 a 20 110 1 242 538 080 bbab 21 ab 23 ab 19 ab 23 ab 21 a 21 115 87 877 516 bbab 22 ab 24 ab 20 ab 24 ab 22 a 22 120 41 429 321 790 bbab 23 ab 25 ab 21 ab 25 ab 23 a 23 125 127 093 398 46

Zauważmy najpierw, że dla i = 22 wygenerowaliśmy cykl, który posiada ponad czterdzieści jeden miliardów stanów. Przy obecnych możliwościach technicznych nie jest absolutnie możliwe wygenerowanie całego automatu o takiej ilości stanów (z powodu braku pamięci operacyjnej). A zatem podejście polegające na obserwowaniu określonego cyklu w automacie ujawnia tutaj swoją kolejną przewagę. Przyrzyjmy się teraz długościom cykli dla parzystych wartości i (zostały one pogrubione w powyższej tabeli). Poniżej prezentuję wykres logarytmiczny wyników eksperymentów dla parzystych wartości i Jednakże w tym przypadku trend tej zależności nie jest łatwy do określenia. Ponadto nie jest w ogóle jasne czy ten wykres asymptotycznie będzie zachowywał się liniowo. Co prawda wydaje się, że hipoteza taka jest fałszywa, ale mamy tutaj zbyt mało wyników doświadczeń aby stwierdzić to jednoznacznie. Niestety następny cykl miałby prawdopodobnie długość kilkuset miliardów (a może nawet ponad bilion) stanów, wygenerowanie go zajęłoby więc zbyt wiele czasu. Już obliczenie długości najdłuższego z powyższych cykli zajęło mi ponad pięćdziesiąt godzin. Próba aproksymacji wyników doświadczeń wielomianem w tym przypadku nie ma zbyt wielkiego sensu. Analiza danych sugerowałaby wielomian stopnia 13 lub 14, punktów pomiarowych jest jednak zbyt mało, aby uwierzyć z przekonaniem w słuszność tej hipotezy. Oczywiście możemy mieć tutaj do czynienia z funkcją podwykładniczą, nie sposób jednak przeanalizować tutaj wszystkich możliwości. Dlatego ograniczę się tylko do próby aproksymacji powyższych wyników funkcją wykładniczą. Najlepszym dopasowaniem w sensie minimalizacji błędu średniokwadratowego jest w tym przypadku funkcja: w(m) 1.2258 m Niemniej jednak klasa C4 wydaje się być bardzo interesującą klasą wartą głębszego pochylenia się nad nią. Na koniec podrozdziału przedstawiam jeszcze wykres (również logarytmiczny), na którym znajduje się powyższa funkcja jako wynik aproksymacji wykładniczej oraz zaznaczone wyniki przeprowadzonego eksperymentu. 47

6.6. Długość reprezentacji wzorca a rozmiar automatu W tym podrozdziale uogólnimy B-notację wprowadzoną wcześniej, tak żeby można ją było wykorzystać dla dowolnego słowa nad dwuliterowym alfabetem. Definicja 6.6 Niech w będzie słowem nad alfabetem Σ = {a, b}. Oczywiście w jest postaci: w = a i 1 b i 2 a i 3... b i k, gdzie k 0, i 1, i k 0 oraz i 2, i 3,..., i k 1 > 0. Wówczas reprezentacją słowa w nazywamy: (i 1, i 2,..., i k ) jeśli i 1, i k > 0 (i 1, i 2,..., i k 1 ) jeśli i 1 > 0, i k = 0 (i 2, i 3,..., i k ) jeśli i 1 = 0, i k > 0 (i 2, i 3,..., i k 1 ) jeśli i 1 = 0 oraz i k = 0 Ponadto jeżeli reprezentacją słowa w jest (i 1, i 2,..., i k ) to k nazywamy długością reprezentacji. Trzeba zauważyć jednak, że słowa w 1 = a i 1 b i 2 a i 3... b i k oraz w 2 = b i 1 a i 2 b i 3... a i k dla i 1, i 2,... i k 1 > 0, i k 0 mają dokładnie tę samą reprezentację. Jednakże z naszego punktu widzenia słowa te są nierozróżnialne, gdyż automaty Boyera-Moore a dla słów w 1 oraz w 2 są izomorficzne. Dlatego też zastosowanie takiej reprezentacji jest w tym przypadku w pełni uzasadnione. Powyższą reprezentację możemy również zastosować do zapisu stanów automatu Boyera- Moore a dla dowolnego (niekoniecznie dwuliterowego) Σ. Pokażemy teraz jak to zrobić. Niech q = q[1]q[2]... q[n] będzie stanem automatu dla słowa w = w[1]w[2]... w[n]. Tak naprawdę q jest słowem nad alfabetem Σ {#}, jednakże zgodnie z definicją mamy następujący warunek: (q[i] #) (q[i] = w[i]) Dlatego przy założeniu, że znamy słowo w możemy stany reprezentować jako słowa nad dwuliterowym alfabetem {#, }, gdzie symbol na i-tej pozycji oznacza, że q[i] = w[i]. 48

Stosując takie podejście możemy skorzystać z wprowadzonej wyżej reprezentacji słów również dla stanów automatu Boyera-Moore a. W tym momencie naturalnym wydaje się być pytanie, czy znając długość reprezentacji słowa w możemy w jakiś sposób ograniczyć długość reprezentacji dowolnego stanu automatu Boyera-Moore a dla tego słowa. Okazuje się jednak, że nie jesteśmy w stanie podać żadnego nietrywialnego ograniczenia, co pokazuje poniższy kontrprzykład. Kontrprzykład 1 Rozważmy słowo w = b 2 m aa o reprezentacji (2 m, 2). Wczytajmy teraz następujący ciąg symboli: m liter b oraz jedną literę a. W kolejnych krokach znajdziemy się odpowiednio w stanach (obok zapisu stanu podaję również jego reprezentację): # 2 m+2, reprezentacja: () # 2 m 2 (#b)##, reprezentacja: (2 m 1, 1, 2) # 2 m 4 (#b) 2 ##, reprezentacja: (2 m 3, 1, 1, 1, 2) (#b) m ##, reprezentacja: (1, 1, 1,..., 1, 2) (2m jedynek i dwójka) (#b) m #a, reprezentacja: (1, 1, 1,..., 1) (2m + 2 jedynek) A zatem dla wzorca, którego długość reprezentacji jest równa 2 (czyli jest stała) możemy wskazać stany automatu, których długość reprezentacji jest liniowa względem długości wzorca (możemy nawet wskazać stan, którego długość reprezentacji jest dokładnie równa długości wzorca, co jest maksymalną możliwą wartością). Jednakże powyższy przykład był przykładem dość ogólnym. Można się zastanawiać, czy we wprowadzonych w poprzednich podrozdziałach klasach przypadkiem taka zależność nie występuje. Niestety tutaj odpowiedź też jest negatywna. Dla uproszczenia pokażę kontrprzykład z klasy B1, ale jest on dość łatwy do uogólnienia. Kontrprzykład 2 Rozważmy słowo w = b 4 m+1 aba. Wczytajmy teraz ciąg 2 m + 1 liter b. W kolejnych krokach znajdziemy się odpowiednio w stanach: # 4 m+4, reprezentacja: () # 4 m+1 #b#, reprezentacja: (4 m + 2, 1, 1) # 4 m 3 (##bb)###, reprezentacja: (4 m 1, 2, 3) # 4 m 3 (#bb#)#b#, reprezentacja: (4 m 2, 2, 2, 1, 1) # 4 m 7 (##bb) 2 ###, reprezentacja: (4 m 5, 2, 2, 2, 3) #(##bb) m ###, reprezentacja: (3, 2, 2, 2,..., 2, 2, 3) #(#bb#) m #b#, reprezentacja: (2, 2, 2, 2,..., 2, 2, 1, 1) A zatem w tym przypadku dla wzorca o stałej długości reprezentacji (równej cztery) dostajemy również stan o długości reprezentacji liniowej względem długości wzorca (stała jest równa 2 m+3 4m+4 > 1 2 ). 49

Utworzenie ze słowa w wzorca należącego na przykład do klasy B3 sprowadza się do doklejenia na początku podsłowa aba oraz zapewnieniu, że najdłuższe maksymalne podsłowo złożone z samych b będzie miało długość będącą liczbą pierwszą. Nie zmienia to powyższego rozumowania, wpływa jedynie na drobną zmianę stałej przy czynniku liniowym. 6.7. Średni rozmiar automatu Do tej pory zajmowaliśmy się tylko wzorcami, dla których automaty Boyera-Moore a posiadają największą ilość stanów w swojej klasie. W tym podrozdziale przyjrzymy się szerzej wszystkim wzorcom o zadanej długości. Oczywiście z powodów wydajnościowych eksperymentu nie możemy wykonać dla wzorców zbyt długich, dlatego rozważymy tutaj wzorce o długości m 22. Poniższa tabela przedstawia średni rozmiar automatu Boyera-Moore a dla wzorców nad dwuliterowym alfabetem o zadanej długości. Dla porównania zamieszczam tutaj również rozmiar maksymalnego automatu dla wzorców zadanej długości. m Średni rozmiar Q max 1 2.00 2 2 4.00 4 3 6.75 7 4 11.00 13 5 16.56 21 6 23.38 31 7 32.84 43 8 43.89 58 9 57.66 84 10 74.79 107 11 95.29 156 12 119.11 197 13 148.23 282 14 181.88 362 15 221.11 518 16 266.43 635 17 318.62 968 18 377.69 1 230 19 446.01 1 949 20 522.11 2 323 21 608.89 3 461 22 705.92 4 052 Analiza powyższych wyników pozwala stwierdzić, że wielomian który najlepiej aproksymuje ten ciąg (minimalizując błąd średniokwadratowy) ma stopień równy 3. Jest on w przybliżeniu równy: W (m) 0.0838 m 3 0.6618 m 2 + 6.2315 m 6.6855 Poniżej przedstawiam wykres powyższego wielomianu wraz z oznaczonymi na nim punktami będącymi wynikami eksperymentów. 50

Warto zauważyć, że wielomian ten bardzo dobrze oddaje asymptotykę tego ciągu punktów, jest więc bardzo prawdopodobne, że zależność ta będzie się zachowywała również dla dłuższych wzorców. Warto wspomnieć, że stała przy m 3 jest większa niż w przypadku rozważanej w rozdziale czwartym klasie wzorców a i 1 ba i 2. Jest to ciekawa obserwacja pokazująca, że wzorce należące do tej klasy są dalekie od maksymalnych. Na koniec tego rozdziału przedstawiam jeszcze wykres ilości automatów dla wzorców o zadanej długości jako funkcję ich rozmiaru (czyli histogram). Poniższy wykres obrazuje tę zależność dla wzorców o długości m = 20 nad dwuliterowym alfabetem. Widać zatem, iż wzorców dla których automaty Boyera-Moore a są największe jest bardzo mało, co pokazuje że znalezienie tych wzorców jest zadaniem zdecydowanie nietrywialnym. 51