• Nie Znaleziono Wyników

AnalizaautomatówBoyera-Moore’a WydziałMatematyki,InformatykiiMechaniki UniwersytetWarszawski

N/A
N/A
Protected

Academic year: 2021

Share "AnalizaautomatówBoyera-Moore’a WydziałMatematyki,InformatykiiMechaniki UniwersytetWarszawski"

Copied!
57
0
0

Pełen tekst

(1)

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

(2)

Oświadczenie kierującego pracą

Potwierdzam, że niniejsza praca została przygotowana pod moim kierunkiem i kwa- lifikuje 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 pro- cedur 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

(3)

Streszczenie

Tematem niniejszej pracy magisterskiej jest analiza automatów Boyera-Moore’a. Zaprezen- towany został w niej pełny i formalny dowód dolnego ograniczenia na maksymalną ilość stanów rzędu Θ(m3). 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 za- implementowane 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 ni- niejszej 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

Dziedzina pracy (kody wg programu Socrates-Erasmus) 11.3 Informatyka

Klasyfikacja tematyczna F. Theory of Computation

F.2 Analysis of Algorithms and Problem Complexity

F.2.2. Nonnumerical Algorithms and Problems - Pattern matching

Tytuł pracy w języku angielskim Boyer-Moore automata analysis

(4)
(5)

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 Θ(m3) . . . 23

4.2. Automaty o rozmiarze Ω(m5) . . . 26

5. Struktura automatów dla wzorców postaci ai1bai2 . . . 29

5.1. Struktura stanów na przykładzie wzorca a3ba6 . . . 29

5.2. Struktura funkcji przejścia na przykładzie wzorca a3ba6 . . . 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

(6)

Bibliografia . . . . 55

(7)

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 Vo- ughana 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śniej- szych 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 2m, 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ład- niczo wiele.

Niniejsza praca magisterska służy przynajmniej częściowej odpowiedzi na te pytania. Mi- mo 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 ana- liza 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 eksperymen- tó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ą Θ(m3) stanów oraz przedstawiam dowód tego faktu. Druga część zawiera wynik eksperymen- tu, który empirycznie dowodzi dolnego ograniczenia postaci Ω(m5).

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

(8)

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

(9)

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ą zdefi- niujemy automat Boyera-Moore’a.

Definicja 1.1 Automatem nazywamy piątkę uporządkowaną A = (Q, Σ, δ, q0, 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

• q0 - stan początkowy (q0∈ 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, Σ, δ, q0, 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

(10)

• δ - funkcja przejścia δ : Q × Σ → Q zdefiniowana w następujący sposób:

Niech q ∈ Q, a ∈ Σ i niech i = P (q). Wówczas: q = q1q[i]q2, gdzie q[i] = # natomiast q1, q2 ∈ (Σ ∪ {#}). Niech r = q1w[i]q2.

Jeżeli a = w[i] to δ(q, a) = r. W przeciwnym przypadku niech:

s = min{j : ∀k∈{j+1,···,m} (r[k] 6= # ⇒ r[k] = w[k − j])}

Wówczas δ(q, a) = q0, gdzie q0 spełnia warunki:

1. ∀1¬k¬m−s q0[k] = r[k + s]

2. ∀m−s<k¬m q0[k] = #

Operację utworzenia stanu q0 ze stanu q nazywamy przesunięciem, zaś wartość s wiel- kością tego przesunięcia.

• stanem początkowym q0 jest słowo #m

• jedynym stanem akceptującym qA 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 q0 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 qA (któremu odpowiada słowo w) jest stanem pochłaniającym (czyli ∀a∈Σ δ(qA, a) = qA) oraz będziemy rozważać tylko sta- ny automatu osiągalne ze stanu początkowego (a zatem od teraz przez zbiór Q rozumiemy zbiór {q ∈ Q : ∃a1,...,anq1,...,qni={1,...,n}qi = δ(qi−1, ai) oraz qn= q}

Po wprowadzeniu formalnej definicji warto zilustrować ją na przykładzie. W tym celu poniżej prezentuję automat dla słowa w = aba.

(11)

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 alfa- betem Σ ∪ {#}. 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:

#i0w1#i1· · · wk−1#ik−1wk (1.1) gdzie k > 0, i0 ­ 0, ∀1¬s¬k−1 is> 0, w1, . . . wk−1∈ Σ+ oraz wk∈ Σ.

Dowód:

Skorzystamy z zasady indukcji matematycznej względem długości najkrótszej ścieżki od sta- nu początkowego q0 do rozważanego stanu q. Podstawa indukcji (czyli uzasadnienie faktu dla stanu początkowego q0 = #m) jest oczywista. Przejdźmy zatem od razu do kroku indukcyj- nego.

Na początek zauważmy, że jeżeli mamy słowo q postaci 1.1, to również dowolne jego prze- sunięcie (w sensie operacji wprowadzonej przy okazji definicji automatu Boyera-Moore’a) jest również takiej postaci. Istotnie, załóżmy bowiem że q = #i0w1#i1· · · wk−1#ik−1wk. 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 wk 6=  oraz s ­ m − ik−1 gdy wk = 

• #j0z1#j1· · · zr−1#jr−1zr#jr, j0> 0

Tutaj musimy rozważyć dwa przypadki. Jeżeli wk 6=  to r ¬ k, zs = wk−r+s dla

(12)

s = 1, . . . , r, j0 ¬ ik−r, js = ik−r+s dla s = 1, . . . , r − 1, zaś jr jest równe wielkości przesunięcia. Jeżeli natomiast wk=  to mamy r < k, zs= wk−1−r+s dla s = 1, . . . , r, j0 ¬ ik−1−r, js = ik−1−r+s dla s = 1, . . . , r − 1 oraz jr = ik−1+ t, gdzie t > 0 i t jest wielkością przesunięcia w tym przypadku.

• z1#j1· · · zr−1#jr−1zr#jr

Tutaj również mamy analogiczne przypadki. Jeżeli wk 6=  to r ¬ k, zs = wk−r+s dla s = 2, . . . , r, z1 = sk−r+1, gdzie wk−r+1 = xsk−r+1 dla x ∈ Σ (sk−r+1 jest sufixem, niekoniecznie właściwym, słowa wk−r+1), js = ik−r+s dla s = 1, . . . , r − 1 zaś jr jest równe wielkości przesunięcia. Natomiast gdy wk =  mamy r < k, zs = wk−1−r+s dla s = 2, . . . , r, z1 = sk−r, gdzie wk−r= xsk−rdla x ∈ Σ, js= ik−1−r+sdla s = 1, . . . , r−1 oraz jr = ik−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 ik−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 i0 > 0. A zatem stan q jest równy albo #m i wtedy δ(q, a) jest równy #m−1z1 dla z1 = a, albo q = #i0w1 (i0 < m) i wówczas q0 jest równe #j0z1, gdzie j0 = i0− 1 oraz z1 = aw1. W dalszej części rozumowania będę zakładał, że k > 1.

2. wk6= 

Jeżeli ik−1 = 1, to stan q0 = δ(q, a) jest równy #j0z1#j1· · · zk−1, gdzie zs = ws dla s = 1, . . . , k − 2, zk−1 = wk−1awk oraz js = is dla s = 0, . . . , k − 2. W przeciwnym przypadku (ik−1 > 1) stan q0 jest równy #j0z1#j1· · · zk−1#jk−1zk, gdzie zs = ws dla s = 1, . . . , k − 1, zk= awk, js = is dla s = 0, . . . , k − 2 oraz jk−1= ik−1− 1.

3. wk= 

Tym razem jeżeli ik−1 = 1, to stan q0 = δ(q, a) jest równy #j0z1#j1· · · zk−1, gdzie zs = ws dla s = 1, . . . , k − 2 oraz zk−1 = wk−1a i js = is dla s = 0, . . . , k − 2.

Jeśli zaś ik−1 > 1 to stan q0 jest równy #j0z1#j1· · · zk−1#jk−1zk, gdzie zs = ws dla s = 1, . . . , k − 1, zk= a, js= is dla s = 0, . . . , k − 2 oraz jk−1 = ik−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 = #i0w1#i1· · · wk−1#ik−1wkjest stanem automatu Boyera-Moore’a to prawdziwe są stwierdzenia:

1. ∀2¬s¬k−1 istnieje dokładnie jedno ls takie, że 1 ¬ ls¬ |ws|, dla którego

ws[ls] 6= w[m − |ws| + ls] (czyli ws są niezgodne z sufixem w długości |ws| na dokładnie jednej pozycji).

(13)

2. jeżeli i0 > 0 i k > 1, powyższą własność ma również w1

3. jeżeli i0 = 0 i k > 1, w1 jest niezgodne z sufixem w długości |w1| 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 q0 o nie więcej niż d − 1 i niech q będzie stanem odległymo d od stanu początkowego. Niech q0 będzie poprzednikiem q na najkrótszej ścieżce z #m do q. Ponadto niech q = δ(q0, a) oraz niech q0 = #i0w1#i1· · · wk−1#ik−1wk. Oczywiście zakładamy też, że q0 nie jest stanem akceptującym, a zatem ik−1 > 0. Wówczas musimy rozważyć dwa przypadki:

1. a = w[P (q0)] (po wczytaniu a nie następuje przesunięcie) Musimy rozważyć tutaj trzy podprzypadki, a mianowicie:

• k = 1

Z założenia, że q0 nie jest akceptujący i0> 0. A zatem stan q0 jest równy albo #m i wtedy q jest równy #m−1z1 dla z1 = a, albo q0 = #i0w1 (i0 < m) i wówczas q jest równe #j0z1, gdzie j0 = i0 − 1 oraz z1 = aw1. Teza jest zatem spełniona w sposób trywialny. W dalszej części dowodu zakładam, że k > 1.

• wk6= 

Jeżeli ik−1 = 1, to stan q = δ(q0, a) jest równy #j0z1#j1· · · zk−1, gdzie zs= ws dla s = 1, . . . , k − 2, zk−1= wk−1awk oraz js= is dla s = 0, . . . , k − 2. W przeciwnym przypadku (ik−1 > 1) stan q0 jest równy #j0z1#j1· · · zk−1#jk−1zk, gdzie zs = ws dla s = 1, . . . , k − 1, zk = awk, js= is dla s = 0, . . . , k − 2 oraz jk−1 = ik−1− 1. W obu sytuacjach teza jest spełniona na mocy prawdziwości założenia indukcyjnego.

• wk= 

Tym razem jeżeli ik−1= 1, to stan q = δ(q0, a) jest równy #j0z1#j1· · · zk−1, gdzie zs = ws dla s = 1, . . . , k − 2, zk−1 = wk−1a oraz js = is dla s = 0, . . . , k − 2.

Jeśli zaś ik−1 > 1 to stan q0 jest równy #j0z1#j1· · · zk−1#jk−1zk, gdzie zs = ws dla s = 1, . . . , k − 1, zk= a, js= is dla s = 0, . . . , k − 2 oraz jk−1= ik−1− 1. Jak wyżej teza wynika w sposób oczywisty z założenia indukcyjnego.

2. a 6= w[P (q0)] (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: #j0z1#j1· · · zk−1#jk−1zk, gdzie k > 0, j0 ­ 0, js> 0 dla s = 1, . . . , k − 1 oraz zs∈ Σ+ dla s = 1, . . . , k. Wiemy również, że:

• z1, . . . , zk−1 spełniają tezę twierdzenia

• zk jest niezgodne z sufixem w długości |zk| na dokładnie jednej pozycji (jest o pozycja wczytanego właśnie symbolu a). Gdyby zk było zgodne z odpowiednim sufixem nie następowałoby bowiem przesunięcie.

Oznaczmy powyższę uwagę przez (∗).

(14)

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.

• #l0v1#l1· · · vr−1#lr−1vr#lr, l0 > 0

W tym przypadku r ¬ k, vs = zk−r+s dla s = 1, . . . , r oraz ls = jk−r+s dla s = 1, . . . , r − 1 oraz l0 ¬ jk−r. Ponadto lr jest równe wielkości przesunięcia. Na mocy uwagi (∗) wiemy, że vsjest niezgodne z sufixem w długości |vs| na dokładnie jednej pozycji dla s = 2, . . . , r. Ponadto jeżeli v1 = ze dla e > 1 to na mocy tej samej uwagi v1 jest niezgodne z odpowiednim sufixem w na dokładniej jednej pozycji. Jeżeli zaś v1 = z1, to korzystając z faktu, że wielkość przesunięcia musi być liczbą dodatnią dostajemy j0 > 0, co na mocy uwagi (∗) daje nam również niezgodność v1 z sufixem w długości v1 na dokładnie jednej pozycji. To kończy dowód tego przypadku.

• v1#l1· · · vr−1#lr−1vr#lr, Teraz r ¬ k, vs = zk−r+s dla s = 2, . . . , r, v1 = sk−r+1, gdzie zk−r+1 = xsk−r+1 dla x ∈ Σ (sk−r+1 jest sufixem, niekoniecznie właści- wym, słowa zk−r+1), ls = jk−r+s dla s = 1, . . . , r − 1, zaś jr jest równe wielkości przesunięcia. Na mocy uwagi (∗) dostajemy prawdziwość pierwszego punktu tezy.

Pozostaje pokazać jeszcze punkt trzeci. Ale v1 jest sufixem zk−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 v1 jest niezgodne z sufixem w długości |v1| 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. ♦

(15)

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ż roz- waż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 = q1q[i]q2 (q[i] = #, q1, q2 ∈ (Σ + #)) oraz r = q1w[i]q2.

• Jeżeli w[i] = a to następnikiem q0 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 q0.

• Jeżeli stan q0 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| · |Σ| · (m2+ m log |Q|)) (znalezienie przesuniecia s kosztuje bowiem O(m2) 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|).

(16)

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 ∈ Shif t(q) ⇐⇒ 1 ¬ s ¬ m oraz ∀k∈{s+1,···,m} (q[k] 6= # ⇒ q[k] = w[k − s]) Wówczas w przypadku niezgodności wczytanego symbolu a z wzorcem (a 6= w[i]) musimy (zgodnie z definicją) znaleźć wartość s:

s = min{j : ∀k∈{j+1,···,m} (r[k] 6= # ⇒ 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 ∈ Shif t(q) sprowadza się tylko do wykonania pojedynczego testu: (s ­ i lub a = w[i − s]), gdyż zgod- ność 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 wykonu- jemy 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 q0 stanu q w czasie O(m). Musimy jednak pokazać jeszcze, że umiemy również w czasie O(m) obliczać kolejkę Shif t(q0) dla następnika stanu q.

Niech Shif t0 będzie kolejką związaną ze stanem q0. 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 Shif t0 uzyskujemy z listy Shif t biorąc elemety zgodne z wczytanym symbolem a.

w h i l e ( NotEmpty ( S h i f t ) ) do { s = DeQueue ( S h i f t )

i f ( s >= i o r a = w [ i − s ] ) Enqueue ( s , S h i f t ’ ) ;

}

2. a 6= w[i]: niech min będzie najmniejszym elementem kolejki Shif t zgodnym z wczyta- nym symbolem a (min ­ i lub a = w[i − min]). Ponieważ, zgodnie z definicją, kolejka Shif t jest posortowana, podzielmy kolejkę Shif t0 na trzy „podkolejki”:

• Shif t10 = {s ∈ Shif t0: 1 ¬ s < i − min}

• Shif t20 = {s ∈ Shif t0: i − min ¬ s < m − min}

• Shif t30 = {s ∈ Shif t0: m − min ¬ s ¬ m}

Teraz pokażemy jak skonstruować wyżej zdefiniowane „podkolejki”.

• Element s (1 ¬ s < i − min) należy do Shif t10 ⇐⇒ a = w[i − s − min] oraz s + min ∈ Shif t

(17)

• Element s (i − min ¬ s < m − min) należy do Shif t20 ⇐⇒ s + min ∈ Shif t

• Element s należy do Shif t30 ⇐⇒ m − min ¬ s ¬ m

Prowadzi to zatem do następującego pseudokodu generującego kolejkę Shif t0 w tym przypadku.

r e p e a t

min = DeQueue ( S h i f t )

u n t i l ( min >= i o r a = w [ i − min ] ) i f ( NotEmpty ( S h i f t ) ) {

s = DeQueue ( S h i f t ) w h i l e ( 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 ’ w h i l e ( 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 w h i l e ( 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 Shif t jest pusta, gdyż zawsze m ∈ Shif t.

W obu powyższych przypadkach generowanie kolejki Shif t0 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ę czynni- ka 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 spraw- dzić czy stan ten został już wcześniej wygenerowany, a koszt takiego sprawdzenia w przy- padku 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).

(18)

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 Shif t 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 Shif t 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ę Shif t dla niego w czasie O(m) (zgodnie z podrozdziałem 2.2). Oznaczmy go przez q0.

• Sprawdzamy czy stan q0został już wcześniej wygenerowany w czasie O(m) (zgodnie z podrozdziałem 2.3).

• Jeżeli stan q0 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.

(19)

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 udo- wodnione 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 zaprezento- wane 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 Aw

będzie rozszerzonym automatem Boyera-Moore’a dla tego słowa. Wówczas dla każdego alfabetu Σ takiego, że |Σ| ­ 2 istnieją słowo w0 nad alfabetem Σ i rozszerzony automat Boyera-Moore’a Aw0 odpowiadający słowu w0 takie, że |w| = |w0| oraz |Aw| ¬ |Aw0|.

Dowód:

Wystarczy wziąć dowolną funkcję różnowartościową f : {a, b} → Σ oraz w0 = f (w). Wówczas

(20)

rozszerzony automat Boyera-Moore’a dla w0 konstruujemy z Aw 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 Aw0 posiada co najmniej te same stany co Aw. ♦

3.3. Twierdzenie 2

Przedstawimy teraz główne twierdzenie tego rozdziału (wspomniane we wstępie), które „od- wraca” sytuację z poprzedniego twierdzenia.

Twierdzenie 3.2 Niech w będzie słowem nad alfabetem Σ (|Σ| ­ 2) i niech c = |Σ|. Niech Aw będzie rozszerzonym automatem Boyera-Moore’a skojarzonym ze słowem w. Wówczas ist- nieją: słowo w0 nad dwuliterowym alfabetem {a, b} oraz rozszerzony automat Boyera-Moore’a Aw0 dla słowa w0 takie, że w0 = (c + 3)|w| oraz |Aw| ¬ |Aw0|.

Dowód:

Rozpocznijmy od pokazania jak dla danego słowa w zdefiniować odpowiednie słowo w0 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 w0.

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 = {bbaibaja | 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 ai i aj 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 w0 z treści twierdzenia jest w0 = φ(w).

Pokażemy teraz jak dla uzyskanego przez nas słowa w0 zbudować rozszerzony automat Boyera-Moore’a tak, aby posiadał wymaganą w treści twierdzenia własność.

Niech Aw = (Q, Σ, δ, q0, 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 Aw. Definiujemy teraz nowy rozszerzony automat Boyera-Moore’a Aw0 = (Q0, {a, b}, δ0, q00, F0) wraz z funkcją P0. Pokażemy w jaki sposób możemy „zakodować” w tym automacie automat Aw.

Rozpocznijmy od pokazania jak skonstruować włożenie z Q w Q0. 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

(21)

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 Aw0 bazując na konstrukcji auto- matu Aw i w sposób indukcyjny pokazać, że rodzina stanów {φ(q)|q ∈ Q} jest podzbiorem Q0.

Baza indukcji jest oczywista - stan q00 = φ(q0) = #|q0|·l jest oczywiście stanem początko- wym automatu Aw0.

Krok indukcyjny jest już znacznie trudniejszy do pokazania. Naszym celem jest udo- wodnienie, że jeżeli stan φ(q) ∈ Q0 to wówczas ∀σ∈Σ φ(δ(q, σ)) ∈ Q0 (czyli wszystkie stany będące następnikami q w automacie Aw mają swoje odpowiedniki w automacie Aw0). Oznacz- my: k = P (q) oraz ρ = wk (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 Aw wczytujemy symbol ρ. Zatem w auto- macie Aw0 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 P0 możemy dowolnie zdefiniować kolejność wczytywania symboli znajdujących się na tych pozycjach. Niech φ(ρ) = bbaibac−i−1a. Wówczas funkcję P0 dla kolejnych stanów defi- niujemy 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, dla- tego 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 bbacb dochodzimy do stanu φ(δ(q, ρ)).

• σ 6= ρ (następuje przesunięcie)

W tym przypadku w wyjściowym automacie Aw wczytujemy symbol σ. W naszym automacie Aw0 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.

(22)

Funkcja przejść w automacie Aw0 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, σ) = u0σv#s, gdzie u0 - sufix u

– δ(q, σ) = v0#s, gdzie v0 - 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 φ(σ) = bbai0baj0b. Podczas wczytywania symboli słowa φ(σ) (w kolejności zdefiniowanej w poprzednim przypadku), pierwsza niezgodność wy- stą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| = i0 oraz |y| = j0. Ponieważ w tle mamy ciągle nasz wyściowy automat Awoczywiste jest, że poprawnym przesunięciem jest przesunięcie s00 = l · s. Zatem szukane przez nas przesunięcie w automacie Aw0 w stanie p jest równe s0 ¬ l ·s (przesunięcie przy przejściu δ0(p, b)). Pokażemy, że jest ono równe dokładnie l · s.

Załóżmy nie wprost, że s0 < l · s. Oczywiście stan r możemy zapisać w postaci:

r = z1 #i1 z2 #i2. . . zα#iα bbxbya #iα+1 zα+1 #α+2. . . #iβ zβ #s0

gdzie β ­ 0, z1, zβ ∈ {a, b}, z2, z3, . . . zβ−1 ∈ {a, b}+, i1, . . . 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 s0 oraz wyko- rzystując założenie indukcyjne możemy napisać, że

z1∈ S(X), z2, . . . 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ć:

z1 ∈ P (X), z2, . . . zβ ∈ F (X), bbxbya ∈ (F (X) ∪ {#}) (3.2)

(23)

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 z1 ∈ S(X) ∩ P (X) oraz wiedząc, że X jest (1,1)-ograniczony, dostajemy że z1∈ 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 zi dla 2 ¬ i ¬ β. Ponieważ zi ∈ F (X) to możemy napisać, że zi = sixipi, gdzie si ∈ S(X)\X, xi ∈ X oraz pi ∈ P (X)\X. Ale na mocy 3.1 wiemy też, że zi ∈ X. Jeżeli teraz xi =  to sipi ∈ X i z postaci słów-kodów dostajemy od razu si = pi = . Jeżeli zaś xi 6=  to z bezprzecinkowości kodowania X dostajemy, że pi = si =  czyli zi = xi. 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:

φ(w) = φ(σ1)φ(σ2) . . . φ(σm) to każde zi zapisuje się jako:

zi= φ(σji)φ(σji+1) . . . φ(σji+li)

oraz bbxbya pojawia się dokładnie w miejscu φ(σ). Pokazaliśmy zatem, że s0 musi byc zgodne z dekompozycją na słowa ze zbioru X ∪ {#}l - a zatem jest s0 = l · s000, czyli s000 < s.

Wracając spowrotem do wyjściowego automatu Aw oznacza to, że przesunięcie s nie jest najmniejszym możliwym przejściem - możliwe jest przejście s000. Oczywiście jest to sprzeczność, a zatem nasze założenie, że s0 < l · s było nieprawdziwe. Zachodzi zatem s0 = l · s.

Odpowiednia definicja funkcji P0w „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) 6= φ(q), co wynika wprost z definicji kodowania.

A zatem na mocy zasady indukcji matematycznej automat Aw0 posiada „zakodowany” w sobie automat Aw, a tym samym |Aw| ¬ Aw0. ♦

(24)
(25)

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| ¬ 2m

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 Ω(m3) 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 = ai1bai2 a, b ∈ Σ, i2 > i1 > 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: #+aj (1 ¬ j ¬ i2)

Jeżeli j < i2 to po wczytaniu a zostajemy w tej grupie, po wczytaniu b przechodzimy do grupy 3. Jeżeli zaś j = i2 to po wczytaniu a przechodzimy do stanu z grupy 4 (z j = i1), zaś po wczytaniu b do grupy 3.

3. stany: #+baj#i2−j (0 ¬ j ¬ i2)

Jeżeli j < i2to po wczytaniu a przechodzimy do grupy 5 lub (dla j = i2−1) pozostajemy w grupie 3, po wczytaniu b przechodzimy do grupy 7 (j ­ i2− i1) lub pozostajemy w grupie w 3 z j = 0 (o ile j < i2− i1). W przeciwnym przypadku (j = i2) po wczytaniu a przechodzimy do grupy 6, zaś po wczytaniu b przechodzimy do stanu z grupy 4.

4. stan: aj#+ (min(i1, i2− i1) ¬ j ¬ i1)

Po wczytaniu a przechodzimy do grupy 9, zaś po wczytaniu b przechodzimy do grupy 3 (z j = 0).

Cytaty

Powiązane dokumenty

Ale wtedy język −L jest w

Dwugªowicowy (niedeterministyczny) automat sko«czony ma sko«czony zbiór stanów i dwie gªowice czytaj¡ce sªowo wej±ciowe.. Uzasadni¢ (pomijaj¡c szczegóªy)

[r]

Zestaw zadań 4: Grupy permutacji.. (14) Wyznaczyć

Zbiór funkcji nieparzystych oznaczymy literą N, natomiast zbiór funkcji parzystych - literą P..

Zaimplementuj algorytm sortowania leksykograficznego dla ciągów znakowych o różnej długości. Słowa są zbudowane nad alfabetem

23. Dana jest liczba rzeczywista a. Niech P będzie dowolnym punktem wewnątrz czworokąta wypukłego ABCD. Udowod- nij, że środki ciężkości trójkątów 4P AB, 4P BC, 4P CD, 4P

Dokładnie opisana została postać BWT słów Fibonacciego, słów Thuego-Morse’a, słów bezkwadratowych Thuego-Morse’a, słów Cantora oraz słów Paper Folding. Co ciekawe,