Wstęp do Programowania potok funkcyjny

Podobne dokumenty
Wstęp do Programowania potok funkcyjny

Wykład 6. Wyszukiwanie wzorca w tekście

Temat: Algorytmy wyszukiwania wzorca w tekście

Programowanie Funkcyjne. Marcin Kubica Świder,

Wstęp do Programowania potok funkcyjny

1 abbbaabaaabaa -wzorzec: aaba

Analiza algorytmów zadania podstawowe

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

Algorytmy i struktury danych. wykład 8

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Wstęp do Programowania potok funkcyjny

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

Wstęp do Programowania potok funkcyjny

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

Wstęp do Programowania potok funkcyjny

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

Wstęp do Programowania potok funkcyjny

Programowanie dynamiczne

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania potok funkcyjny

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

Algorytmy i Struktury Danych.

Algorytmy tekstowe na przykładzie KMP

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

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

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

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Algorytm i złożoność obliczeniowa algorytmu

Wstęp do programowania. Listy. Piotr Chrząstowski-Wachtel

Wstęp do programowania. Procedury i funkcje. Piotr Chrząstowski-Wachtel

Informatyka A. Algorytmy

Zaawansowane algorytmy i struktury danych

Wstęp do programowania

Wstęp do Programowania potok funkcyjny

Składnia funkcji i Rekurencja w języku Haskell

Wstęp do Programowania potok funkcyjny

Przeszukiwanie z nawrotami. Wykład 8. Przeszukiwanie z nawrotami. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 238 / 279

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Wstęp do informatyki. stęp do informatyki Polecenia (cz.2)

Podstawy Informatyki. Inżynieria Ciepła, I rok. Iteracja warunkowadopóki(while) Blok instrukcji. Pascal: begin instrukcja1; C: { end;

Podstawy Informatyki. Sprawność algorytmów

Programowanie w Logice Przykłady programów. Przemysław Kobylański

Wstęp do programowania

Informatyka 1. Przetwarzanie tekstów

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

System operacyjny Linux

struktury danych dla operacji słownikowych

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Kontrola przebiegu programu

Wykład 7 Porównanie programowania funkcyjnego i imperatywnego

Programowanie równoległe

Wstęp do programowania

POPULARNE POLECENIA SKRYPTY. Pracownia Informatyczna 2

Wstęp do programowania

Zaawansowane algorytmy i struktury danych

Algorytmy i Struktury Danych, 2. ćwiczenia

Informatyka 1. Procedury i funkcje, struktura programu w Pascalu

Wstęp do programowania

INSTRUKCJA PUSTA. Nie składa się z żadnych znaków i symboli, niczego nie robi. for i := 1 to 10 do {tu nic nie ma};

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

Instrukcje iteracyjne (pętle)

Analiza algorytmów zadania podstawowe

Programowanie funkcyjne. Wykªad 13

Sortowanie przez scalanie

Algorytmy tekstowe. Andrzej Jastrz bski. Akademia ETI

Wstęp do Programowania potok funkcyjny

Podstawy programowania funkcjonalnego

Podstawy programowania

Podstawy programowania. Podstawy C# Przykłady algorytmów

Techniki konstruowania algorytmów. Metoda dziel i zwyciężaj

Drzewa binarne. Drzewo binarne to dowolny obiekt powstały zgodnie z regułami: jest drzewem binarnym Jeśli T 0. jest drzewem binarnym Np.

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

PROGRAMOWANIE W PYTHONIE ALGORYTMY TABLICOWE A LISTY

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

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

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

Wstęp do Informatyki dla bioinformatyków

Technologie informacyjne Wykład VII-IX

FFT i dyskretny splot. Aplikacje w DSP

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

ZŁOŻONOŚĆ OBLICZENIOWA ALGORYTMÓW

Przykładowe B+ drzewo

Wstęp do Programowania potok funkcyjny

- - Ocena wykonaniu zad3. Brak zad3

Algorytmy i Struktury Danych.

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Wstęp do programowania

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

Wstęp do programowania. Drzewa. Piotr Chrząstowski-Wachtel

System operacyjny Linux

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

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

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Algorytmy od problemu do wyniku

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

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

Optymalizacja. Przeszukiwanie lokalne

J ezyk AWK Kurs systemu UNIX

Znajdowanie największego i najmniejszego elementu w zbiorze n liczb całkowitych

Transkrypt:

Wstęp do Programowania potok funkcyjny Marcin Kubica 2010/2011

Outline Wyszukiwanie wzorców w tekście 1 Wyszukiwanie wzorców w tekście

Problem wyszukiwania wzorca w tekście Na tym wykładzie zajmiemy się następującym problemem: Definition (Problem wyszukiwania wzorca w tekście) Dane: dwa napisy, wzorzec w (długości m) i tekst t (długości n), n m. Zakładamy, że napis to lista symboli lub liczb całkowitych z ustalonego ograniczonego zakresu. Szukamy wystąpień wzorca w tekście (oznaczenie: jest ich k). Wynik: lista pozycji wszystkich wystąpień wzorca w tekście.

Example Algorytm naiwny dla każdej możliwej pozycji w tekście sprawdza czy występuje na niej wzorzec. let rec prefix w t = match w with [] -> true hw::tw -> match t with [] -> false ht::tt -> (hw = ht) && prefix tw tt;;

Example let pattern_match w t = let rec iter t n acc = let a = if prefix w t then n::acc else acc in match t with [] -> rev a _::tail -> iter tail (n+1) a in iter t 1 [];; Złożoność czasowa: T (n + k) = Θ(n k) = Θ(n 2 ). Można lepiej.

Idea algorytmu: Obliczamy odcisk palca szukanego wzorca. Dla kolejnych fragmentów tekstu długości takiej jak wzorzec sprawdzamy ich odciski palca. Inny odcisk oznacza brak wystąpienia. Jeśli odciski palca się zgadzają, to sprawdzamy, czy faktycznie występuje tam wzorzec. Ograniczenie: obliczenie odcisku palca dla kolejnego fragmentu tekstu w czasie stałym.

Odcisk palca: Symbole utożsamiamy z liczbami całkowitymi z przedziału od 0 do m 1. Odcisk palca to: f (w) = = ( w.(m 1) + w.(m 2) p + + w.(0) p m 1) mod q = = (w.(m 1) + p (w.(m 2) + p ( + p w.(0)))) mod q f (t.(i..i + m 1)) = = ( t.(i + m 1) + t.(i + m 2) p + + t.(i) p m 1) mod q = = (t.(i + m 1) + p (t.(i + m 2) + p ( + p t.(i)))) mod q dla odpowiednio dobranych stałych p i q.

Odcisk palca, c.d.: p powinno być liczbą pierwszą, p m. q powinno być dużą liczbą pierwszą, taką żeby q p mieściło się jeszcze w zakresie arytmetyki liczb całkowitych, q > n. Kolejny odcisk palca można obliczyć na podstawie poprzedniego: f (t.(i + 1..i + m)) = = (f (t.(i..i + m 1)) p + t.(i + m) t.(i) p m ) mod q = = ((f (t.(i..i + m 1)) p) mod q + t.(i + m) t.(i) (p m mod q)) mod q

Obliczanie odcisku palca let p = 257 and q = 4177969;; let fingerprint str = let rec sumuj acc pow pos = if pos < 0 then acc else sumuj ((acc + pow * code str.(pos)) mod q) ((pow * p) mod q) (pos -1) in sumuj 0 1 (length str - 1);; let shift fi pot x y = let res = (((fi * p) mod q + y - x * pot) mod q) in if res < 0 then (res + p * q) mod q else res;;

Potęgowanie mod q let exp_mod b k = let rec iter k a = if k = 0 then a else iter (k - 1) ((a * b) mod q) in iter k 1;; Sprawdzenie wystąpienia let occurrence w t i = let rec check j = if j < 0 then true else if w.(j) = t.(i+j) then check (j-1) else false in check (Array.length w - 1);;

Główna procedura let pattern_match w t = let n = Array.length t and m = Array.length w in let f = fingerprint w m and pot = exp_mod p m in let rec iter acc i fi = let a = if (fi = f) && (occurrence w t i) then i::acc else acc in if i = n-m then List.rev a else iter a (i+1) (shift fi pot (code t.(i)) (code t.(i + m))) in iter [] 0 (fingerprint t m);;

Oczekiwana liczba dopasowań odcisków palca: k + n k q. Oczekiwana złożoność czasowa: T (n + m) = Θ(n + m (k + n m k+1 q )) = Θ(n + m k). Pesymistyczna złożoność czasowa: T (n + m) = Θ(n m). Złożoność pamięciowa: Θ(k). Można lepiej...

Pozwala wyznaczyć wszystkie wystąpienia wzorca w tekście w czasie liniowym. Ma jednak więcej zastosowań. Dla zadanego tekstu t = [ t 1 ; t 2 ;... ; t n ] obliczamy wartości tzw. funkcji prefiksowej P. P(i) to największe takie j, że: 0 j < i, [ t 1 ;... ; t j ] = [ t i j+1 ;... ; t i ]. P(i) to długość najdłuższego właściwego prefiksu [ t 1 ; t 2 ;... ; t i ], który jest równocześnie sufiksem tego napisu.

Własności funkcji prefiksowej Oznaczmy przez G(i) zbiór długości wszystkich właściwych prefiksów [ t 1 ; t 2 ;... ; t i ], które są równocześnie sufiksami tego napisu: G(i) = {0 j < i : [ t 1 ;... ; t j ] = [ t i j+1 ;... ; t i ]} Przyjmujemy G(0) =, P(0) = 0. P(i) = max G(i), P(1) = 0, P(i) 0, P(i) < i (dla i > 0), i > P(i) > P(P(i)) > > P k (i) = 0, dla pewnego k N, G(i + 1) = {0} {j + 1 : j G(i) t i+1 = t j+1 },

Własności funkcji prefiksowej G(i) = {P(i)} G(P(i)) P(i) to największy element w G(i). Mniejsze elementy G(i) to długości prefiksów [ t 1 ; t 2 ;... ; t P(i) ], które są jego sufiksami. G(i) G(P(i)) G(P(P(i))) P(P(P(i))) P(P(i)) P(i) i

Własności funkcji prefiksowej G(i) = {P j (i) : 1 j k} G(i + 1) = {0} {P j (i) + 1 : 1 j k t i+1 = t P j (i)+1} P(i +1) = max({0} {P j (i)+1 : 1 j k t i+1 = t P j (i)+1}) Dla i > 0 mamy: P j (i) + 1 ; gdzie j jest najmniejsze takie, że P(i+1) = 1 j k t i+1 = t P j (i)+1 0 ; wpp.

Algorytm obliczania funkcji prefiksowej Algorytm obliczania funkcji prefiksowej let pref t = let p = make (length(t) + 1) 0 and pj = ref 0 in begin for i = 2 to length t do while (!pj > 0) && (t.(!pj) <> t.(i - 1)) do pj := p.(!pj) done; if t.(!pj) = t.(i - 1) then pj :=!pj + 1; p.(i) <-!pj done; p end;;

Zastosowanie tablicy prefiksowej do wyszukiwania wzorców Obliczamy tablicę prefiksową dla szukanego wzorca. Unikamy wielokrotnego przeglądania tych samych fragmentów tekstu. Po dopasowaniu i pierwszych znaków wzorca mamy również dopasowane P(i) znaków wzorca. Uzyskujemy złożność czasową Θ(n + m) i pamięciową Θ(m + k).

Zastosowanie tablicy prefiksowej do wyszukiwania wzorców Algorytm wyszukiwania wzorców let find x y = let i = ref 0 and j = ref 0 and w = ref [] and p = pref x in while!i <= length y - length x do j := p.(!j); while (!j < length x) && (x.(!j) = y.(!i +!j)) do j :=!j + 1 done; if!j = length x then w :=!i::!w; i :=!i + if!j > 0 then!j - p.(!j) else 1 done; rev!w;;