Wykład 6. Wyszukiwanie wzorca w tekście

Podobne dokumenty
Temat: Algorytmy wyszukiwania wzorca w tekście

Algorytmy przeszukiwania wzorca

1 abbbaabaaabaa -wzorzec: aaba

Wstęp do Programowania potok funkcyjny

Algorytmy i struktury danych. wykład 8

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

ANALIZA PORÓWNAWCZA ALGORYTMÓW WYSZUKIWANIA WZORCA W TEKŚCIE

Analiza algorytmów zadania podstawowe

Egzamin, AISDI, I termin, 18 czerwca 2015 r.

Algorytmy i struktury danych. Drzewa: BST, kopce. Letnie Warsztaty Matematyczno-Informatyczne

Algorytmy tekstowe. Andrzej Jastrz bski. Akademia ETI

Analiza algorytmów zadania podstawowe

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Algorytm selekcji Hoare a. Łukasz Miemus

Zaawansowane algorytmy i struktury danych

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

Algorytmy i Struktury Danych, 2. ćwiczenia

Algorytmy i Struktury Danych.

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

1. Analiza algorytmów przypomnienie

Laboratorium nr 7 Sortowanie

1 TEMAT LEKCJI: 2 CELE LEKCJI: 3 METODY NAUCZANIA. Scenariusz lekcji. 2.1 Wiadomości: 2.2 Umiejętności: Scenariusz lekcji

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Zaawansowane algorytmy i struktury danych

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Wykład 5. Sortowanie w czasie liniowologarytmicznym

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Wstęp do informatyki Ćwiczenia. Piotr Fulmański

- - Ocena wykonaniu zad3. Brak zad3

Algorytmy i struktury danych. Wykład 6 Tablice rozproszone cz. 2

Wstęp do programowania

STRATEGIA PRZETWARZANIA DOKUMENTÓW TEKSTOWYCH OPARTA NA HEURYSTYCZNEJ ANALIZIE DANYCH

Informatyka A. Algorytmy

Algorytmy i struktury danych

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 15, Kryptografia: algorytmy asymetryczne (RSA)

Weryfikacja hipotez statystycznych

Sortowanie w czasie liniowym

Sortowanie przez wstawianie

Wstęp do programowania

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Strategia "dziel i zwyciężaj"

Kodowanie i kompresja Streszczenie Studia Licencjackie Wykład 14, Kryptografia: algorytmy asymetryczne (RSA)

Generowanie liczb o zadanym rozkładzie. ln(1 F (y) λ

Informatyka 1. Złożoność obliczeniowa

Jeśli czas działania algorytmu zależy nie tylko od rozmiaru danych wejściowych i przyjmuje różne wartości dla różnych danych o tym samym rozmiarze,

Struktury danych i złozoność obliczeniowa. Prof. dr hab. inż. Jan Magott

1. Podstawowe pojęcia dotyczące przetwarzania tekstów 2. Podstawowe operacje na łańcuchach znakowych 3. Naiwne wyszukiwanie wzorca w tekście 4.

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Zaliczenie. Egzamin. lub. Wykład. Zaliczenie. Ćwiczenie. 3 zadania. Projekty. Ocena. Na ocenę

Informatyka 1. Przetwarzanie tekstów

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI STYCZEŃ Arkusz I. Czas pracy: 60 minut Liczba punktów do uzyskania: 15

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Zadanie analizy leksykalnej

Matematyczne Podstawy Informatyki

Algorytmy tekstowe na przykładzie KMP

Wstęp do programowania

Wykład 4. Tablice z haszowaniem

METODY INŻYNIERII WIEDZY

Algorytmy i struktury danych

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

METODY INŻYNIERII WIEDZY

Metody Metody, parametry, zwracanie wartości

Haszowanie. dr inż. Urszula Gałązka

Załącznik Nr 5 do Zarz. Nr 33/11/ Kod przedmiotu:aisd2

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Wstęp do sieci neuronowych, wykład 11 Łańcuchy Markova

Algorytmy i struktury danych.

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Programowanie Proceduralne

9. Schematy aproksymacyjne

Wstęp do Informatyki

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Kontrola przebiegu programu

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

wstęp do informatyki i programowania część testowa (25 pyt. / 60 min.)

Metody probabilistyczne klasyfikatory bayesowskie

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Drzewa poszukiwań binarnych

7. Pętle for. Przykłady

Modulacja i kodowanie. Labolatorium. Kodowanie źródłowe Kod Huffman a

Kompresja danych Streszczenie Studia Dzienne Wykład 10,

Algorytmy i Struktury Danych.

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Wykład 8. Drzewo rozpinające (minimum spanning tree)

Wskaźniki. Programowanie Proceduralne 1

Reprezentacja symboli w komputerze. Znaki alfabetu i łańcuchy znakowe. Programowanie Proceduralne 1

Programowanie w VB Proste algorytmy sortowania

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Równoległy algorytm wyznaczania bloków dla cyklicznego problemu przepływowego z przezbrojeniami

Algorytmy sortujące. sortowanie kubełkowe, sortowanie grzebieniowe

Algorytmy i Struktury Danych.

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Algorytmy i Struktury Danych. Anna Paszyńska

Transkrypt:

Wykład 6 Wyszukiwanie wzorca w tekście 1

Wyszukiwanie wzorca (przegląd) Porównywanie łańcuchów Algorytm podstawowy siłowy (naive algorithm) Jak go zrealizować? Algorytm Rabina-Karpa Inteligentne wykorzystanie własności liczb pierwszych i teorii liczb Algorytm Knutha-Morrisa-Pratta Wykorzystuje deterministyczny automat skończony Optymalny Algorytm Boyera-Moore a Niezgodne (niepasujące) znaki pozwalają na przeskakiwanie fragmentów tekstu W praktyce (średnio) okazuje się nawet lepszy od KMP Literatura Cormen, Leiserson, Rivest, Wprowadzenie do algorytmów, WNT, 1999 rozdział 34 2

Porównywanie łańcuchów Wejście tekst T o długości n ze skończonego alfabetu Σ: T[1] m a n a m a n a p a t i p i t i p T[n] i wzorzec P o długości m ze skończonego Σ: P[1] P[m] p a t i Wyjście Wszystkie wystąpienia P w T T[s+1..s+m] = P[1..m] m a n a m a n a p a t i p i t i p i Przesunięcie s p a t i 3

Algorytm siłowy Naive-String-Matcher(T,P) 1. n length(t) 2. m length(p) 3. for s 0 to n-m do 4. if P[1..m] = T[s+1.. s+m] then 5. return Wzorzec występuje z przesunięciem s uwagi: czas wykonania tego algorytmu (w pesymistycznym przypadku) wynosi O((n-m+1) m) dla n = 2m daje to O(n 2 ) Algorytm ten nie jest optymalny zadanie to można rozwiązać w czasie O(m + n) 4

Algorytm Rabina-Karpa Pomysł: policzyć Sumę kontrolną dla wzorca P oraz Sumę kontrolną dla każdego podłańcuch w T o długości m m a n a m a n a p a t i p i t i p i sumy kontrolne 4 2 3 1 4 2 3 1 3 1 2 3 1 0 1 suma kontrolna 3 nieudane trafienie trafienie p a t i 5

Algorytm Rabina-Karpa Obliczanie sumy kontrolnej: Wybieramy liczbę pierwszą q niech d = Σ Przykład: Σ={0,1,2,3,4,5,6,7,8,9} wtedy d = 10, q = 13 niech P = 0815 S 4 (0815) = (0 1000 + 8 100 + 1 10 + 5 1) mod 13 = 815 mod 13 = 9 6

Metoda szybkiego obliczania sumy kontrolnej (schemat Hornera) obliczamy wykorzystując przykład: Σ={0,1,2,3,4,5,6,7,8,9} wtedy d = 10, q = 13 niech P = 0815 S 4 (0815) = ((((0 10+8) 10)+1) 10)+5 mod 13 = ((((8 10)+1) 10)+5 mod 13 = (3 10)+5 mod 13 = 9 7

Jak szybko obliczać sumy kontrolne dla kolejnych podłańcuchów? Zaczynamy od S m (T[1..m]) m a n a m a n a p a t i p i t i p i Sumy kontrolne S m (T[1..m]) S m (T[2..m+1]) 8

Algorytm Rabina-Karpa Rabin-Karp-Matcher(T,P,d,q) 1. n length(t) 2. m length(p) 3. h d m-1 mod q 4. p 0 5. t 0 0 6. for i 1 to m do 7. p (d p + P[i]) mod q 8. t 0 (d t 0 + T[i]) mod q 9. for s 0 to n-m do 10. if p = t s then Suma kontrolna dla wzorca P Suma kontrolna dla T[1..m] Jeśli sumy kontrolne są zgodne, przeprowadzamy porównywanie łańcuchów 11. if P[1..m] = T[s+1..s+m] then return wzorzec występuje z p. s 12. if s < n-m then 13. t s+1 (d(t s -T[s+1]h) + T[s+m+1]) mod q Uaktualnianie sumy kontrolnej dla T[s+1..s+m] z wykorzystaniem T[s..s+m-1] 9

Złożoność obliczeniowa algorytmu Rabina-Karpa W pesymistycznym przypadku O(m (n-m+1)) Analiza probabilistyczna Prawdopodobieństwo nieudanego trafienia dla losowego wejścia wynosi 1/q Oczekiwana ilość nieudanych trafień wynosi zatem O(n/q) Stąd oczekiwany czas wykonania algorytmu Rabina-Karpa to O(n + m (v+n/q)) gdzie v jest ilością wystąpień wzorca (trafień) Jeśli wybierzemy q m i mamy stałą ilość wystąpień wzorca to czas wykonania algorytmu Rabina-Karpa wyniesie O(n +m). Jednak jeśli v i m są duże wtedy czas wykonania dla tego algorytmu może wynieść O(n 2 ) 10

Metoda Knutha-Morrisa-Pratta (KMP) Niech t i i p j+1 będą porównywanymi znakami: t 1 t 2...... t i...... = = = = p 1... p j p j+1... p m Jeśli pierwsza niezgodność nastąpiła dla znaków t i i p j+1, to: Ostatnie j znaków porównywanych w T jest zgodne z pierwszymi j znakami w P. t i p j+1 11

Metoda Knutha-Morrisa-Pratta (KMP) Pomysł: określamy j = next[j] < j takie, że t i może być porównywane z p j +1 czyli: j < j takie, że P 1...j = P j-j +1...j. inaczej szukamy najdłuższego prefiksu P, który jest jednocześnie sufiksem P 1... j. t 1 t 2...... t i...... = = = = p 1... p j p j+1... p m 12

Metoda Knutha-Morrisa-Pratta (KMP) Przykład wyznaczania next[j]: t 1 t 2... 01011 01011 0... 01011 01011 1 01011 01011 1 next[j] = długość najdłuższego prefiksu P, będącego sufiksem P 1...j. 13

14 Metoda Knutha-Morrisa-Pratta (KMP) dla P = 0101101011, next = [0,0,1,2,0,1,2,3,4,5] : 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 0 1 1 0 1 0 10 9 8 7 6 5 4 3 2 1

Metoda Knutha-Morrisa-Pratta (KMP) KMP := proc (T : : string, P : : string) # Input: text T and pattern P # Output: list L of shifts i at which P occurs in T n := length (T); m := length(p); L := [ ]; next := KMPnext(P); j := 0; for i from 1 to n do while j>0 and T[i] <> P[j+1] do j := next [j] od; if T[i] = P[j+1] then j := j+1 fi; if j = m then L := [L[ ], i-m] ; j := next [j] fi; od; RETURN (L); end; 15

Metoda Knutha-Morrisa-Pratta (KMP) Wzorzec: abracadabra, next = [0,0,0,1,0,1,0,1,2,3,4] a b r a c a d a b r a b r a b a b r a c... a b r a c a d a b r a next[11] = 4 a b r a c a d a b r a b r a b a b r a c... - - - - a b r a c next[4] = 1 16

Metoda Knutha-Morrisa-Pratta (KMP) a b r a c a d a b r a b r a b a b r a c... a b r a c next [4] = 1 a b r a c a d a b r a b r a b a b r a c... a b r a c next [2] = 0 a b r a c a d a b r a b r a b a b r a c... a b r a c 17

Metoda Knutha-Morrisa-Pratta (KMP) Poprawność: t 1 t 2...... t i...... Przed pętlą for mamy: P 1...j = T i-j...i-1 oraz j m = = = = p 1... p j p j+1... p m Jeśli j = 0: jesteśmy przy pierwszym znaku w P Jeśli j 0: P może zostać przesuwane dopóki j > 0 i t i p j+1 18

Metoda Knutha-Morrisa-Pratta (KMP) Jeśli T[i] = P[j+1], j oraz i mogą być zwiększone (na końcu pętli). Jeśli porównywanie P zakończyło się (j = m), odnaleźliśmy wystąpienie wzorca, i możemy wykonać przesunięcie. 19

Metoda Knutha-Morrisa-Pratta (KMP) Złożoność czasowa: Wskaźnik i nigdy nie jest resetowany Wskaźniki i oraz j są zawsze zwiększane razem Zawsze: next[j] < j; j może zostać zmniejszone tylko tyle razy ile razy zostało zwiększone. Stąd algorytm KMP można wykonać w czasie O(n), jeśli znamy tablicę next. 20

Obliczanie tablicy next next[i] = długość najdłuższego prefiksu P, będącego jednocześnie sufiksem P 1... i. next[1] = 0 Niech next[i-1] = j: p 1 p 2...... p i...... = = = = p 1... p j p j+1... p m 21

Obliczanie tablicy next Rozważmy dwa przypadki: 1) p i = p j+1 next[i] = j + 1 2) p i p j+1 zastępujemy j przez next[ j ], aż p i = p j+1 lub j = 0. jeśli p i = p j+1, to możemy przypisać next[i] = j + 1, w przeciwnym raze next[i] = 0. 22

Obliczanie tablicy next KMPnext := proc (P : : string) #Input : pattern P #Output : next-array for P m := length (P); next := array (1..m); next [1] := 0; j := 0; for i from 2 to m do while j > 0 and P[i] <> P[j+1] do j := next [j] od; if P[i] = P[j+1] then j := j+1 fi; next [i] := j od; RETURN (next); end; 23

Czas wykonania KMP Czas obliczenia tablicy next wynosi O(m), stąd całkowity czas dla KMP to O(n + m). Czy można to zrobić lepiej? 24

Metoda Boyera-Moore a (BM) Pomysł: przykładamy wzorzec od lewej do prawej strony, ale porównujemy od prawej do lewej. Przykład: a b c a d f e a b r a k a d a b r a a b e r a b e r a b c a d f e a b r a k a d a b r a a b e r a b e r 25

Metoda Boyera-Moore a (BM) a b c a d f e a b r a k a d a b r a a b e r a b e r a b c a d f e a b r a k a d a b r a a b e r a b e r a b c a d f e a b r a k a d a b r a a b e r a b e r 26

Metoda Boyera-Moore a (BM) a b c a d f e a b r a k a d a b r a a b e r a b e r a b c a d f e a b r a k a d a b r a a b e r a b e r a b c a d f e a b r a k a d a b r a a b e r a b e r Duże przeskoki: mało porównań Oczekiwany czas działania: O(m + n /m) 27

Metoda Boyera-Moore a (BM) Dla c Σ i wzorca P określamy δ (c) := indeks pierwszego wystąpienia znaku c we wzorcu P od prawej strony: = max {j p j = c} = 0 j dla c = p j dla c P i c p, gdzie j < k m 28

Metoda Boyera-Moore a (BM) Jaki jest koszt obliczenia wartości δ? przyjmijmy Σ =l : c = niezgodny znak j = aktualna pozycja we wzorcu (c p j ) 29

Metoda Boyera-Moore a (BM) Obliczanie przesunięcia Przypadek 1 c nie występuje we wzorcu P. (δ(c) = 0) Przesuwamy wzorzec o j znaków tekst wzorzec i + 1 i + j i + m c p j p m ( i ) = j 30

Metoda Boyera-Moore a (BM) Przypadek 2: c występuje we wzorcu. (δ(c) 0) Przesuwamy wzorzec w prawo, aż do pierwszego z prawej strony wystąpienia znaku c we wzorcu tekst wzorzec i + 1 k i + j i + m c j - k c p j c p m 31

Metoda Boyera-Moore a (BM) Przypadek 2 (a): jeśli δ(c) > j tekst wzorzec c c p j 144424444 3 δ (c) c tu nie ma c Przesuwamy o: ( i) = m δ( c) + 1 32

Metoda Boyera-Moore a (BM) Przypadek 2 (b): δ(c) < j tekst wzorzec c c p j 1424314243 δ (c) j δ ( c) Przesuwamy o: ( i) = j δ( c) 33

Algorytm BM (1 wersja) Input: Text T and pattern P 1 n := length(t); m := length(p) 2 compute δ 3 i := 0 4 while i n m do 5 j := m 6 while j > 0 and P[j] = T[i + j] do 7 j := j 1 8 end while; 9 if j = 0 10 then output shift i 11 i := i + 1 12 else if δ(t[i + j]) > j 13 then i := i + m + 1 - δ[t[i + j]] 14 else i := i + j - δ[t[i + j]] 15 end while; 34

Algorytm BM (1 wersja) Analiza: oczekiwany czas działania: O(m + n/m) najgorszy czas działania: Ω(n m) 0 0... 0 0... 0... 0... i 1 0... 0... 0 35

Obliczanie najlepszego przesunięcia Korzystamy z informacji zebranych przed wystąpieniem niezgodności p j t i + j t 1 t 2... t i+1... t i+j... t i+m i = = = p 1... p j... p m wrw[j] = pozycja końca ostatniego wystąpienia sufiksu P j+1... m od prawej strony P j. Możliwe przesunięcie: γ[j] = m wrw[j] 36

Przykład wrw[j] = pozycja końca ostatniego wystąpienia sufiksu P j+1... m od prawej strony P j. Wzorzec: banana wrw[j] Sprawdzany suffix Błędny znak Następne wystąpienie Pozycja wrw[5] a n banana 2 wrw[4] na a *** bana na 0 wrw[3] ana n banana 4 wrw[2] nana a banana 0 wrw[1] anana b banana 0 wrw[0] banana ε banana 0 37

Przykład wrw (banana) = [0,0,0,4,0,2] a b a a b a b a n a n a n a n a = = = b a n a n a b a n a n a 38

Algorytm BM (2 wersja) Input: Text T and pattern P 1 n := length(t); m := length(p) 2 compute δ and γ 3 i := 0 4 while i n m do 5 j := m 6 while j > 0 and P[j] = T[i + j] do 7 j := j 1 8 end while; 9 if j = 0 10 then output shift i 11 i := i + γ[0] 12 else i := i + max(γ[j], j - δ[t[i + j]]) 13 end while; 39