Vyhledávání řetězců. a b a c a a b. a b a c a b. a b a c a b

Podobné dokumenty
(Pattern Matching) a b a c a a b. a b a c a b. a b a c a b

Metodický koncept k efektivní podpoře klíčových odborných kompetencí s využitím cizího jazyka ATCZ62 - CLIL jako výuková strategie na vysoké škole

Základy algoritmizace. Pattern matching

Vyhledávání v textu. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Hledání v textu algoritmem Boyer Moore

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Suffixové stromy. Osnova:

Regulární výrazy. Vzory

Úvod do programování - Java. Cvičení č.4

ZADÁNÍ BAKALÁŘSKÉ PRÁCE

5 Rekurze a zásobník. Rekurzivní volání metody

Datové struktury. alg12 1

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

: Teoretická informatika(ti)

Základy algoritmizace. Hašování

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Bakalářská práce Algoritmy vyhledávání v řetězcích pro DNA aplikace

Katedra počítačů FEL

Soubor jako posloupnost bytů

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Datové struktury 2: Rozptylovací tabulky

Základy algoritmizace a programování

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Bakalářská práce Výukový program pro předmět KIV/PT Programovací techniky

Binární soubory (datové, typované)

Řídicí struktury. alg3 1

Elegantní algoritmus pro konstrukci sufixových polí

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Návrh Designu: Radek Mařík

Konstruktory překladačů

1. Téma 12 - Textové soubory a výjimky

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Výpočetní modely pro rozpoznávání bezkontextových jazyků zásobníkové automaty LL(k) a LR(k) analyzátory

1. Pojmy a definice. 2. Naivní algoritmus. 3. Boyer Moore

Úvod do programovacích jazyků (Java)

LinuxDays 2017 Ondřej Guth GNU grep LD 17 1 / 14

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Poslední nenulová číslice faktoriálu

Tato tematika je zpracována v Záznamy přednášek: str

Rozklad problému na podproblémy

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

V kompletním grafu nenastává problém. Každý uzel je soused se zbytkem vrcholů a může s nimi kdykoliv komunikovat.

1. D Y N A M I C K É DAT O V É STRUKTUR Y

R zné algoritmy mají r znou složitost

Algoritmy komprese dat

Algoritmy II. Otázky k průběžnému testu znalostí

Standardní algoritmy vyhledávací.

ALG 09. Radix sort (přihrádkové řazení) Counting sort. Přehled asymptotických rychlostí jednotlivých řazení. Ilustrační experiment řazení

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Textové soubory. alg9 1

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Dynamické programování. Optimální binární vyhledávací strom

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Hledání k-tého nejmenšího prvku

Automatická segmentace slov s pomocí nástroje Affisix. Michal@Hrusecky.net, Hlavacova@ufal.mff.cuni.cz

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

63. ročník Matematické olympiády 2013/2014

3 KTE / ZPE Informační technologie

Testování prvočíselnosti

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Vytváření a použití knihoven tříd

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

Distribuované systémy a výpočty

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Dynamické programování

Třídění a vyhledávání Searching and sorting

Algoritmy a datové struktury

Principy objektově orientovaného programování

5. přednáška - Rozklad problému na podproblémy

KTE / ZPE Informační technologie

Sada 1 - Základy programování

Formální jazyky. Z. Sawa (VŠB-TUO) Úvod do teoretické informatiky 2. března / 32

A4B33ALG 2010/05 ALG 07. Selection sort (Select sort) Insertion sort (Insert sort) Bubble sort deprecated. Quicksort.

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

Spojové struktury. Spojová struktura (linked structure):

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

Úvod do programovacích jazyků (Java)

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Implementace LL(1) překladů

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Množinu všech slov nad abecedou Σ značíme Σ * Množinu všech neprázdných slov Σ + Jazyk nad abecedou Σ je libovolná množina slov nad Σ

OOPR_05. Případové studie

PREPROCESOR POKRAČOVÁNÍ

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

DYNAMICKÉ PROGRAMOVÁNÍ A PROBLÉM BATOHU

Algoritmy I, složitost

Abstraktní datové typy: zásobník

7. Datové typy v Javě

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Transkript:

Vyhledávání řetězců (Pattern Matching) T: P: a b a c a a b a b a c a b 4 1 3 2 a b a c a b

Přehled 1. Co je vyhledávání řetězců 2. Algoritmus hrubé síly (Brute force) 3. Algoritmus Boyer Moore 4. Knuth Morris Pratt algoritmus 5. Rabin Karp algoritmus

1. Co je vyhledávání á řetězců? Definice: Pro daný textový řetězec T and a vzorový řetězec P, hledáme vzor P uvnitř textu T: the rain in spain stays mainly on the plain li P: n th Aplikace: textové editory, webové vyhledávače (např. Google), y, y ( p g ), analýza obrazů, strukturní rozpoznávání

Základní terminologie i Předpokládejme, že S řetězec velikosti m. podřetězec S[i.. j] S je část řetězce mezi indexy i a j. prefix (předpona) S je podřetězec S[0.. i] suffix (přípona) S jepodřetězec S[i.. m 1] i libovolný index mezi 0 am 1

Příklad S a n d r e w Podřetězec S[1..3] == "ndr" 0 5 Všechny možné prefixy S: "andrew", "andre", "andr", "and", "an, "a" Všechny možné suffixy S: "andrew", " "ndrew", " "drew"," "rew"," "ew", " "w" "

2. Algoritmus hrubé síly (Brute Force Algorithm) Pro každou pozici v textu T kontrolujeme zda v ní nezačíná vzor P. T: a n d r e w T: a n d r e w P: r e w P: r e w P se posouvá po 1 znaku přes T....

Vrací pozici, ve které začíná vzor, nebo -1 Brute Force v Javě p, public static int bfmatching(string text,string template,int i){ int j, int ret_val=-1; int n=text.length(); t th() boolean find=false; m=template.length(); while (i<=n-m &&!find) { j=0; while ((j<m) && (text.charat(i+j)==template.charat(j))) { j=j+1; } if (j==m) { ret_val=i; find=true; } i=i+1; } } return(ret_val);

Použití public static void main(string[] args) { String text="pokus pohled pohoda podpora"; String tmpl="po"; int i; boolean nalezen=true; i=0; do { i=bfmatching(text,tmpl,i); if (i>=0) System.out.println("Nalezen v pozici i="+i); else nalezen=false; i=i+1; } while (nalezen); }

Analýza Časová složitost Brute force algoritmu je O(mn) nejhorší případ Většina vyhledáávání v běžném textu má složitost O(m+n). continued

Brute force algoritmus je rychlý, pokud je abeceda textu velká např. A..Z, a..z, 1..9, atd. Algoritmus je pomalý pro malou abecedu tj. 0, 1 (binární soubory, obrázkové soubory, atd.)

Příklad nejhorší případ: T: "aaaaaaaaaaaaaaaaaaaaaaaaaah" P: "aaah"

3. Boyer Moore Algoritmus Boyer Moore algoritmus vyhledávání á je založen na 1. Zrcadlovém přístupu k vyhledávání hledáme P vttak, že začínáme na konci P a postupujeme zpět k začátku

2. Přeskočením skupiny znaků, které se neshodují (pokud takové znaky existují) Tento případ se řeší v okamžiku kdy P[j] T[i] mohou nastat celkem 3 případy. T x a i P b a j

Případ 1 Pokud P obsahuje x, pak zkusíme posunout P doprava tak, aby se poslední výskyt x dostal proti x obsaženému v T[i]. T x a i T x a?? i new P x c b a j a posunout i a j doprava, P x c b a j new

Případ 2 P obsahuje x, ale posun doprava na poslední výskyt x není možný, pak posuneme P doprava o jeden znak k T[i+1]. T P x i c w a x a x a posuneme i a j doprava, j na konec P T P x a x? c w a x i new j x je za pozicí j j new

Případ 3 Pokud není možné požít případ 1 a 2, pak posuneme P tak aby bylo P[0] zarovnáno s T[i+1]. T P d c x není v P x a i b a j T a posuneme i a j doprava, j na konec P x a P??? i new d c 0 b a j new

Boyer Moore příklad (1) T: a p a t t e r n m a t c h i n g a l g o r i t h m 1 3 5 11 10 9 8 7 r i t h m r i t h m r i t h m r i t h m P: 2 4 6 r i t h m r i t h m r i t h m

Funkce Last() Boyer Moore algoritmus předzpracovává vzor P a pro danou abecedu A definuje funkci Last(). Last() zobrazuje všechny znaky abecedy A do množiny celých číslel Last(x) ()je definována jako : // x je znak va Největší index i pro který platí, že P[i] == x, nebo 1 pokud žádný takový index v P neexistuje

Příklad funkce Last() A = {a, b, c, d} P: "abacab" P a b a c a b 0 1 2 3 4 5 x a b c d Last(x) 4 5 3-1

Poznámka Last() se počítá pro každý vzor P před začátkem vyhledávání. Last() s obvykle uchovává ájk jako pole (tabulka)

Boyer Moore příklad (2) T: P: a b a c a a b a d c a b a c a b a a b b a b a c a b 1 4 3 2 13 12 11 10 9 8 a b a c a b a b a c a b a b a c a b 5 7 6 a b a c a b a b a c a b x a b c d L(x) 4 5 3 1

Vrací index ve kterém Boyer Moore in Javě začíná vzor nebo -1 public static int bmmatch(string text, String pattern) { int last[] = buildlast(pattern); int n = text.length(); int m = pattern.length(); int i = m-1; if (i > n-1) return -1; // není shoda vzor je // delší než text

int j = m-1; 1 do { if (pattern.charat(j) == text.charat(i)) if (j == 0) return i; // match else { // zpětný průchod i--; j--; } else { // přeskočení znaků int lo = last[text.charat(i)]; //last occ i = i + m - Math.min(j, 1+lo); j = m - 1; } } while (i <= n-1); return -1; // není shoda ; // } // konec algoritmu

public static ti int[] buildlast(string i pattern) /* vrací pole indexů posledního výskytu každého znaku ve vzoru */ { int last[] = new int[128]; // ASCII znaky for(int i=0; i < 128; i++) last[i] = -1; // initializace for (int i = 0; i < pattern.length(); i++) last[pattern.charat(i)] = i; return last; } // end of buildlast()

Použití public static void main(string args[]) { if (args.length!= 2) { System.out.println("Usage: java BmSearch <text> <pattern>"); System.exit(0); exit(0); } System.out.println("Text: " + args[0]); System.out.println("Pattern: " + args[1]); } int posn = bmmatch(args[0], args[1]); if (posn == -1) System.out.println("Pattern not found"); else System.out.println("Pattern starts at posn " + posn);

Analýza Časová složitost Boyer Moore Moorealgoritmu jev nejhorším případě O(nm + A) Boyer Moorejerychlejšípokud rychlejší jeabeceda (A) velká, pomalý pro malou abecedu tj. algoritmus je vhodný pro text, špatný pro binární vstupy Boyer Moore rychlejší než brute force v případě vyhledávání v textu.

Příklad nejhoršího případu T: "aaaaa a" P: "baaaaa" T: P: a a a a a a a a a 6 5 4 3 2 1 b a a a a a 12 11 10 9 8 7 b a a a a a 18 17 16 15 14 13 b a a a a a 24 23 22 21 20 19 b a a a a a

4. KMP Algoritmus Knuth Morris Pratt (KMP) algoritmus vyhledává vzor v textu zleva do prava (jako brute force algoritmus). Posun vzoru je řešen mnohem inteligentněji než v brute force algoritmu.

Pokud se vyskytne neshoda mezi textem and vzorem P v P[j], jaký je největší možný posun vzoru abychom se vyhnuly zbytečnému porovnávání? Odpověď: největší prefix P[0.. j 1], který je suffixem P[1.. j 1]

Příklad T: P: j = 5 j new = 2

Příklad j == 5 Nalezneme největší prefix (start) : "a b a a b" ( P[0..j 1] ) jehož suffix (end) : "b a a b" ( p[1.. j 1] ) Odpověď: "a b" Nastavíme j = 2 // nová hodnota j

KMP chybová funkce KMP předzpracovává vzor, abychom nalezli shodu prefixů vzoru se sebou samým. k = pozice před neshodou (j 1). Chybová funkce (failure function) F(k) definována jako nejdelší prefix P[0..k] který je také suffixem P[1..k].

Příklad chybové funkce (k == j-1) P: "abaaba" 0 1 2 3 4 5 jk F(k) F(j) 0 0 1 1 2 3 F(k) velikost největšího prefixu, který je zároveň sufixem V programu je F() implementována,jako pole (popř. tabulka.)

Použití chybové funkce Knuth Morris Pratt algoritmus modifikuje brute force algoritmus. Pokud se vyskytne y neshoda v P[j] (i.e. P[j]!= T[i]), pak k = j 1; j = F(k); // získání nové hodnoty j

KMP v Javě public static int kmpmatch(string text, String pattern) { int n = text.length(); int m = pattern.length(); int fail[] = computefail(pattern); int i=0; int j=0; :

while (i < n) { if (pattern.charat(j) == text.charat(i)) { if (j == m - 1) return i - m + 1; ; // match i++; j++; } else if (j > 0) j = fail[j-1]; else i++; } return -1; // no match } // end of kmpmatch()

public static int[] computefail( String pattern) { int fail[] = new int[pattern.length()]; fail[0] = 0; int m = pattern.length(); int j = 0; int i = 1; :

while (i < m) { if (pattern.charat(j) == pattern.charat(i)) { //j+1 chars match fail[i] = j + 1; i++; j++; } else if (j > 0) // j follows matching prefix j = fail[j-1]; else { // no match fail[i] = 0; i++; } } return fail; } // end of computefail()

Použití public static void main(string args[]) { if (args.length!= 2) { System.out.println("Usage: java KmpSearch <text> <pattern>"); System.exit(0); exit(0); } System.out.println("Text: " + args[0]); System.out.println("Pattern: " + args[1]); } int posn = kmpmatch(args[0], args[1]); if (posn == -1) System.out.println("Pattern not found"); else System.out.println("Pattern starts at posn " + posn);

Příklad T: P: a b a c a a b a c c a b a c a b a a b b 1 2 3 4 5 6 a b a c a b 7 a b a c a b 8 9 k 0 1 2 3 4 5 P[k] a b a c a b F(k) 0 0 1 0 1 2 10 11 12 a b a c a b 13 a b a c a b 14 15 16 17 18 19 a b a c a b

KMP výhody KMP běží v optimálním čase: O(m+n) Algoritmus se nikdy neposouvá zpět ve vstupním textu T To činí algoritmus obzvlášť výhodný zpracování velkých souborů

5. Rabin Karp Algoritmus Základní myšlenka: Vypočítat kontrolní součet pro vzor P (délky m) a kontrolní součet pro každý podřetězec řetězce Tdélky m procházet řetězcem T a porovnat kontrolní součet každého podřetězce s kontrolním součtem vzoru. Pokud dojde ke shodě vzoru provést test znak po znaku. m a n a m a n a p a t i p i t i p i Kontrolní součet 4 2 3 1 4 2 3 1 3 1 2 3 1 0 1 Kontrolní součet 3 shoda Falešná shoda p a t i

Rabin Karp Algoritmus Výpočet kontrolního součtu: Zvolíme prvočíslo q ZvolímeZ d = Σ tj. počet č všech možných znaků v použité abecedě Příklad: Σ = {0, 1, 2,3, 4, 5, 6, 7, 8, 9} Pak d = 10, q = 13 Nechť P = 0815 S 4 (0815) = (0 1000 + 8 100 + 1 10 + 5 1) mod 13 = 815 mod 13 = 9

Jak vypočítat kontrolní součet : Hornerovo schéma Máme vypočítat Použitím Příklad: Σ = {0,1,2,3,4,5,6,7,8,9} Pak d = 10, q = 13 Nechť P = 0815 S 4 (0815) = ((((0 10+8) 10)+1) 10)+5 mod 13 = ((((8 10)+1) 10)+5 1) 5 mod 13 = (3 10)+5 mod 13 = 9

Jak vypočítat kontrolní součet pro text Začneme s S m (T[1..m]) m a n a m a n a p a t i p i t i p i Kontrolní součet S m (T[1..m]) S m (T[2..m+1]) S m m 1 ( T [ 2.. m + 1 ] ) d ( S ( T [ 1.. m ] ) d T [ 1 ] ) + T [ m + 1 ] ) mod q m

Rabin Karp Algoritmus Rabin Karp Matcher(TPdq) 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. od t 0 (d t 0 + T[i]) mod q 9. for s 0 to n m do 10. if p = t s then Kontrolní součet vzoru P Kontrolní součet textu T[1..m] Kontrolní součty se shodují provádí se test shody řetězců 11. if P[1..m] = T[s+1..s+m] then return Pattern occurs with shift s fi 12. if s < n m then 13. t s+1 (d(t s T[s+1]h) + T[s+m+1]) mod q fi od výpočet kontrolního součtu pro T[s+1..s+m] s+m] s využitím kontrolního součtu T[s..s+m-1]

Vlastnosti Rabin Karp algoritmu čas běhu Rabin Karp algoritmu je v nejhorším případě O(m (n m+1)) Pravděpodobnostní analýza Pravděpodobnost falešné shody je pro náhodný vstup 1/q Předpokládaný počet falešných shod O(n/q) Předpokládaný čas běhu Rabin Karp algoritmu je O(n + m (v+n/q)) kde v je počet správných posuvů Pokud zvolíme q m a očekávaný počet posuvů je malý je předpokládaná ř ádoba běhu Rbi Rabin Karp algoritmu O(n +m).