Tekstalgoritmer. Søk etter delstrenger i array

Like dokumenter
Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

Turingmaskiner.

INF 4130 / / Dagens foiler hovedsakelig laget av Petter Kristiansen Foreleser Stein Krogdahl Obliger:

Pattern matching algorithms. INF Algoritmer og datastrukturer. Lokalisering av Substrenger. Brute force

INF Algoritmer og datastrukturer

Stein Krogdahl, Dino Karabeg, Petter Kristiansen. Kenneth A. Berman and Jerome L. Paul.

Dynamic Programming Longest Common Subsequence. Class 27

Slope-Intercept Formula

Neural Network. Sensors Sorter

INF2820 Datalingvistikk V2011. Jan Tore Lønning & Stephan Oepen

Øvingsforelesning 3 Python (TDT4110)

3/1/2011. I dag. Recursive descent parser. Problem for RD-parser: Top Down Space. Jan Tore Lønning & Stephan Oepen

7) Radix-sortering sekvensielt kode og effekten av cache

UNIVERSITETET I OSLO

Om Kurset og Analyse av Algoritmer

stjerneponcho for voksne star poncho for grown ups

UNIVERSITETET I OSLO

MAT1030 Plenumsregning 3

Unit Relational Algebra 1 1. Relational Algebra 1. Unit 3.3

Kap 2: Løkker og lister

UNIVERSITETET I OSLO

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

IN2010: Algoritmer og Datastrukturer Series 2

UNIVERSITETET I OSLO

MAT1030 Diskret matematikk

Løsningsforslag Kontinuasjonseksamen i TDT4110 Informasjonsteknologi - grunnkurs

SAS FANS NYTT & NYTTIG FRA VERKTØYKASSA TIL SAS 4. MARS 2014, MIKKEL SØRHEIM

IN1140, H2018 gruppetime oppgaver Introduksjon til Tekst i Python

Lynkurs i shellprogrammering under Linux

Information search for the research protocol in IIC/IID

INF2820 Datalingvistikk V2015. Jan Tore Lønning

INF2820 Datalingvistikk V2016. Jan Tore Lønning

INF2820 Datalingvistikk V2016. Jan Tore Lønning

Hvor mye teoretisk kunnskap har du tilegnet deg på dette emnet? (1 = ingen, 5 = mye)

Databases 1. Extended Relational Algebra

MAT1030 Diskret matematikk

MA2501 Numerical methods

Den som gjør godt, er av Gud (Multilingual Edition)

Object [] element. array. int [] tall

Norsk (English below): Guide til anbefalt måte å printe gjennom plotter (Akropolis)

Bildebehandling med Python og EzGraphics

UNIVERSITY OF OSLO DEPARTMENT OF ECONOMICS

Øvingsforelesning 1 Python (TDT4110)

INF2820 Datalingvistikk V2017 Forelesning 1.2 Jan Tore Lønning

UNIVERSITETET I OSLO

Linux-programmer som bruker regulæruttrykk: grep, sed, awk

Moving Objects. We need to move our objects in 3D space.

Hvordan føre reiseregninger i Unit4 Business World Forfatter:

1 User guide for the uioletter package

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

Ikke lineære likninger

UNIVERSITETET I OSLO ØKONOMISK INSTITUTT

EMPIC MEDICAL. Etterutdanningskurs flyleger 21. april Lars (Lasse) Holm Prosjektleder Telefon: E-post:

Syntax/semantics - I INF 3110/ /29/2005 1

Programmeringsspråket C Del 2. Hans Petter Taugbøl Kragset

KROPPEN LEDER STRØM. Sett en finger på hvert av kontaktpunktene på modellen. Da får du et lydsignal.

IN uke 1. Komme i gang med programmering

MAT1030 Diskret Matematikk

TMA4329 Intro til vitensk. beregn. V2017

LØSNINGSFORSLAG, EKSAMEN I ALGORITMER OG DATASTRUKTURER (IT1105)

Kondisjonstest. Algoritmer og datastrukturer. Python-oppgaver - LF. Onsdag 6. oktober Her er noen repetisjonsoppgaver i Python.

Velkommen til plenumsregning for MAT1030. MAT1030 Diskret matematikk. Repetisjon: Algoritmer og pseudokode. Eksempel fra boka. Eksempel

Forelesning inf Java 5

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Forelesning inf Java 5

INF2820 Datalingvistikk V2012. Jan Tore Lønning

TUSEN TAKK! BUTIKKEN MIN! ...alt jeg ber om er.. Maren Finn dette og mer i. ... finn meg på nett! Grafiske lisenser.

Øvingsforelesning 5 Python (TDT4110)

Høgskoleni østfold EKSAMEN

Trigonometric Substitution

Oppgave 1a Definer følgende begreper: Nøkkel, supernøkkel og funksjonell avhengighet.

Level Set methods. Sandra Allaart-Bruin. Level Set methods p.1/24

MAT1030 Plenumsregning 1

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

TUSEN TAKK! BUTIKKEN MIN! ...alt jeg ber om er.. Maren Finn dette og mer i. ... finn meg på nett! Grafiske lisenser.

Endelig ikke-røyker for Kvinner! (Norwegian Edition)

Øvingsforelesning 5 Python (TDT4110)

EKSAMEN. Les gjennom alle oppgavene før du begynner. Husk at det ikke er gitt at oppgavene står sortert etter økende vanskelighetsgrad.

Betinget eksekvering og logiske tester i shell

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

TUSEN TAKK! BUTIKKEN MIN! ...alt jeg ber om er.. Maren Finn dette og mer i. ... finn meg på nett! Grafiske lisenser.

MAT Oblig 1. Halvard Sutterud. 22. september 2016

UNIVERSITETET I OSLO ØKONOMISK INSTITUTT

INF2820 Datalingvistikk V2012. Jan Tore Lønning & Stephan Oepen

2/24/2012. Dynamic Programming. I dag. Example. Example PARSING. Jan Tore Lønning

Notater til INF2220 Eksamen

MAT1030 Diskret matematikk

Gir vi de resterende 2 oppgavene til én prosess vil alle sitte å vente på de to potensielt tidskrevende prosessene.

INF5820 Natural Language Processing - NLP. H2009 Jan Tore Lønning

Han Ola of Han Per: A Norwegian-American Comic Strip/En Norsk-amerikansk tegneserie (Skrifter. Serie B, LXIX)

Ukeoppgaver fra kapittel 3 & 4

Sitronelement. Materiell: Sitroner Galvaniserte spiker Blank kobbertråd. Press inn i sitronen en galvanisert spiker og en kobbertråd.

MAT1030 Diskret matematikk

INF Algoritmer og datastrukturer

Physical origin of the Gouy phase shift by Simin Feng, Herbert G. Winful Opt. Lett. 26, (2001)

UNIVERSITETET I OSLO ØKONOMISK INSTITUTT

klassisk angoragenser classic angora sweater

Gradient. Masahiro Yamamoto. last update on February 29, 2012 (1) (2) (3) (4) (5)

INF2220: Time 8 og 9 - Kompleksitet, beregnbarhet og kombinatorisk søk

FIRST LEGO League. Härnösand 2012

Transkript:

Tekstalgoritmer Søk etter delstrenger i array

Definisjoner Et alfabet er en endelig mengde tegn A = {a 1, a 2,, a k }. En (tekst)streng S = S [0: n -1] med lengde n er en sekvens av tegn fra A. Vi vil i programmene representer strengen S som en array S[0:n -1].

Definisjoner Et alfabet er en endelig mengde tegn A = {a 1, a 2,, a k }. En (tekst)streng S = S [0: n -1] med lengde n er en sekvens av tegn fra A. Vi vil i programmene representer strengen S som en array S[0:n -1]. Søkeproblemet: Gitt to strenger, T (= Tekst) and P (= Pattern) mønster, hvor P er kortere enn T (vanligvis mye kortere). Finn ut om P finnes som en (sammenhengende) substreng i T, og hvis ja, hvor i T. 0 1 2 n -1 m-1 T [0:n -1] (Tekst) P [0:m -1] (Mønster)

Definisjoner Et alfabet er en endelig mengde tegn A = {a 1, a 2,, a k }. En (tekst)streng S = S [0: n -1] med lengde n er en sekvens av tegn fra A. Vi vil i programmene representer strengen S som en array S[0:n -1]. Søkeproblemet: Gitt to strenger, T (= Tekst) and P (= Pattern) mønster, hvor P er kortere enn T (vanligvis mye kortere). Finn ut om P finnes som en (sammenhengende) substreng i T, og hvis ja, hvor i T. 0 1 2 n -1 H [0:n -1] (Høystakk) m-1 N [0:m -1] (Nål)

Definisjoner Let P be a string of size m A substring P[i.. j] of P is the subsequene of P onsisting of the haraters with ranks between i and j A prefix of P is a substring of the type P[0.. i] A suffix of P is a substring of the type P[i..m - 1] 0 1 2 i j m -1 P [0:m -1]

Definisjoner Let P be a string of size m A substring P[i.. j] of P is the subsequene of P onsisting of the haraters with ranks between i and j A prefix of P is a substring of the type P[0.. i] A suffix of P is a substring of the type P[i..m - 1] 0 1 2 i m -1 P [0:m -1]

Definisjoner Let P be a string of size m A substring P[i.. j] of P is the subsequene of P onsisting of the haraters with ranks between i and j A prefix of P is a substring of the type P[0.. i] A suffix of P is a substring of the type P[i..m - 1] 0 1 2 i m -1 P [0:m -1]

Examples of strings: Python program HTML doument DNA sequene Digitized image import math print("enter the oeffiients of the form ax^3 + bx^2 + x + d") lst=[] for i in range(0,4): a=int(input("enter oeffiient:")) lst.append(a) x=int(input("enter the value of x:")) sum1=0 j=3 for i in range(0,3): while(j>0): sum1=sum1+(lst[i]*math.pow(x,j)) break j=j-1 sum1=sum1+lst[3] print("the value of the polynomial is:",sum1)

Examples of strings: Python program HTML doument DNA sequene Digitized image <!DOCTYPE html> <html lang="no"> <head> <meta hwp-equiv="x-ua-compa\ble" ontent="ie=edge" /> <meta id="viewport" name="viewport" ontent="width=devie-width, ini\al-sale=1" /> <meta harset="u_-8" > <meta name="format-dete\on" ontent="telephone=no"> <meta name="generator" ontent="vortex" /> <\tle>obligatoriske innleveringer høsten 2018 - IN2010 - Høst 2018 - Universitetet i Oslo</\tle> <meta property="og:\tle" ontent="obligatoriske innleveringer høsten 2018 - IN2010 - Høst 2018 - Universitetet i Oslo" /> <meta name="twiwer:ard" ontent="summary" /> <meta name="twiwer:site" ontent="@unioslo" /> <meta name="twiwer:\tle" ontent="obligatoriske innleveringer høsten 2018" /> <meta name="twiwer:desrip\on" ontent="les denne saken på UiOs newsider." /> <meta name="twiwer:url" ontent="hwps://www.uio.no/studier/emner/matnat/ifi/in2010/h18/obligatoriskeinnleveringer/index.html" /> <meta property="og:url" ontent="hwps://www.uio.no/studier/emner/matnat/ifi/in2010/h18/obligatoriskeinnleveringer/index.html" /> <meta property="og:type" ontent="website" /> <link rel="shortut ion" href="/vrtx/deora\ng/resoures/dist/images/favion.io" > <link rel="apple-touh-ion-preomposed" href="/vrtx/deora\ng/resoures/dist/images/apple-touhion.png" > <sript><!-- if (/ipad Android 3/i.test(navigator.userAgent)) { var tabletvp = doument.getelementbyid('viewport'); tabletvp.setawribute("ontent", "width=1020, user-salable=yes"); } if (/googlebot/i.test(navigator.useragent)) { doument.addeventlistener("domcontentloaded", fun\on(event) { var ss = '@media only sreen and (max-width: 16m) and (orienta\on : portrait),' + ' var head = doument.getelementsbytagname('head')[0]; var s = doument.reateelement('style'); s.setawribute('type', 'text/ss'); if (s.stylesheet) { s.stylesheet.sstext = ss; } else { s.appendchild(doument.reatetextnode(ss)); } head.appendchild(s); }); } only sreen and (max-width: 19m) and (orienta\on : landsape) { * { max-width: 420px; } }';

Examples of strings: Python program HTML doument DNA sequene Digitized image

Examples of strings: Python program HTML doument DNA sequene Digitized image

Anvendelser GREP(1) User Commands GREP(1) NAME top grep, egrep, fgrep - print lines that math pawerns SYNOPSIS top grep [OPTION...] PATTERNS [FILE...] grep [OPTION...] -e PATTERNS... [FILE...] grep [OPTION...] -f PATTERN_FILE... [FILE...] DESCRIPTION top grep searhes for PATTERNS in eah FILE. PATTERNS is one or pawerns separated by newline haraters, and grep prints eah line that mathes a pawern. A FILE of - stands for standard input. If no FILE is given, reursive searhes examine the working diretory, and nonreursive searhes read standard input. In addi\on, the variant programs egrep and fgrep are the same as grep -E and grep -F, respe\vely. These variants are depreated, but are provided for bakward ompa\bility.

Anvendelser

Anvendelser

Anvendelser

0 1 2 n -1 T [0:n -1] P [0:m -1]

Vindu 0 1 2 n -1 T [0:n -1] P [0:m -1] Hvordan vil du gjøre dette? Beskriv en algoritme!

Vindu 0 1 2 n -1 T [0:n -1] P [0:m -1] Sammenlign Vinduet med P: Hvis mismath, flytt vinduet ett hakk forover

0 1 2 n -1 T [0:n -1] P [0:m -1] Sammenlign Vinduet med P: Hvis mismath, flytt vinduet ett hakk forover

0 1 2 n -1 T [0:n -1] P [0:m -1] Sammenlign Vinduet med P: Hvis mismath, flytt vinduet ett hakk forover

0 1 2 n-m n -1 T [0:n -1] P [0:m -1] Sammenlign Vinduet med P: Hvis mismath, P finnes ikke i T (som substreng)

Sammenligner fra 0 mot n Vindu 0 1 2 n-m n -1 T [0:n -1] P [0:m -1] for i 0 to n - m do if T [i : i+m-1] = P then // er vindu = P? return(i) endif endfor return(-1)

Den naive algoritmen for strengsammenligning Vindu Sammenligner fra 0 mot n 0 1 2 n -1 T [0:n -1] P [0:m -1]

Den naive algoritmen for strengsammenligning Vindu Sammenligner fra 0 mot n 0 1 2 n -1 T [0:n -1] P [0:m -1] Brute fore (rå kraft) brukes ofte synonymt med unødvendig tungvindt dårlig, men korrekt treg enkel lite gjennomtenkt nødløsning lite effektiv

Den naive algoritmen for strengsammenligning Vindu Sammenligner fra 0 mot n 0 1 2 n -1 T [0:n -1] P [0:m -1] Brute fore (rå kraft) brukes ofte synonymt med unødvendig tungvindt dårlig, men korrekt treg enkel lite gjennomtenkt nødløsning lite effektiv men er noen ganger nødvendig brute fore løsninger er typisk den første ideen vi får i IN2010 søker vi som oftest mer effektive algoritmer

Den naive algoritmen for strengsammenligning Vindu Sammenligner fra 0 mot n 0 1 2 n -1 T [0:n -1] The brute-fore pattern mathing algorithm ompares the pattern P with the text T for eah possible shift of P relative to T, until either a math is found, or all plaements of the pattern have been tried Brute-fore pattern mathing runs in time O(nm) Example of worst ase: T = aaa ah P = aaah may our in images and DNA sequenes unlikely in English text P [0:m -1]

Den naive algoritmen for strengsammenligning Vindu Sammenligner fra 0 mot n 0 1 2 n -1 T [0:n -1] Algorithm BruteForeMath(T, P) Input text T of size n and pattern P of size m Output starting index of a substring of T equal to P or -1 if no suh substring exists for i 0 to n - m { test shift i of the pattern } j 0 while j < m T[i + j] = P[j] j j + 1 if j = m return i {math at i} else break while loop {mismath} return -1 {no math anywhere} P [0:m -1]

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o

Boyer-Moore a p a t t e r n m a t h i n g a l g o Hvilke forberedelser må vi gjøre for å kunne bestemme hvor langt vi skal rykke fram når det er en mismath?

Boyer-Moore a p a t t e r n m a t h i n g a l g o Charater-jump heuristi: When a mismath ours at T[i] = If P ontains, shift P to align the last ourrene of in P with T[i] Else, shift P to align P[0] with T[i + 1]

Boyer-Moore a p a t t e r n m a t h i n g a l g o Charater-jump heuristi: When a mismath ours at T[i] = If P ontains, shift P to align the last ourrene of in P with T[i] Else, shift P to align P[0] with T[i + 1] Vi må for alle tegn i alfabetet vite: Finnes i mønsteret P? Hvis ja, må vi vite hvor siste forekomst er.

Boyer-Moore a p a t t e r n m a t h i n g a l g o d e f g h i j k last() -1-1 -1-1 -1-1 -1 3 1-1 -1 Vi må for alle tegn i alfabetet vite: Finnes i mønsteret P? Hvis ja, må vi vite hvor siste forekomst er.

Boyer-Moore Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math } Case 1: j 1 + l Case 2: 1 + l j...... a.......... i b a j l m j.... b a j...... a....... a.. i b. l j m (1 + l). a.. b. 1 + l

Analyse Kjøretiden for Boyer-Moores algoritme er O(nm + s) Worst ase-eksempel: T = aaa a P = baaa Kan oppstå i bilder og DNAsekvenser men er usannsynlig i norsk/engelsk tekst Algoritmen er signifikant raskere enn brute-fore på norsk/engelsk tekst a a a a a a a a a 6 5 4 11 3 2 1 b a a a a a 12 b a a a a a 18 10 17 9 16 8 15 7 14 13 b a a a a a 24 23 22 21 20 19 b a a a a a

Boyer-Moore a a a a a a b b a L() 4 5 3 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b a L() 4 5 3 j = 5 l L[T[i]] i i + m min(j, 1 + l) j m - 1 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b a L() 4 5 3 j = 5 l L[T[5]] i i + m min(j, 1 + l) j m - 1 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b a L() 4 5 3 j = 5 l L[a] i i + m min(j, 1 + l) j m - 1 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b a L() 4 5 3 j = 5 l 4 i i + m min(j, 1 + l) j m - 1 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b a L() 4 5 3 j = 5 l 4 i 5 + 6 min(5, 1 + 4) j m - 1 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b a L() 4 5 3 j = 5 l 4 i 5 + 6 min(5, 5 ) j m - 1 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b a l 4 i 5 + 6 5 j m - 1 L() 4 5 3 j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b a l 4 i 6 j m - 1 L() 4 5 3 j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 5 a a a a a a b b l 4 i 6 j 5 a L() 4 5 3 j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 6 a a a a a a b b l 4 i 6 j 5 a L() 4 5 3 j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 6 a a a a a a b b a L() 4 5 3 j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 4 a a a a a a b b a j = 3 L() 4 5 3 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 4 a a a a a a b b a j = 3 L() 4 5 3 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 7 a a a a a a b b a L() 4 5 3 j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 7 a a a a a a b b a L() 4 5 3 j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 8 a a a a a a b b L() 4 5 3 a j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 8 a a a a a a b b L() 4 5 3 a j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 8 a a a a a a b b L() 4 5 3 a j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 8 a a a a a a b b L() 4 5 3 a j = 5 Algorithm BoyerMooreMath(T, P, Σ) L lastourenefuntion(p, Σ ) i m - 1 j m - 1 repeat if T[i] = P[j] if j = 0 return i { math at i } else i i - 1 j j - 1 else { harater-jump } l L[T[i]] i i + m min(j, 1 + l) j m - 1 until i > n - 1 return -1 { no math }

Boyer-Moore i = 10 a a a a a a b b a j = 5

Boyer-Moore i = 10 a a a a a a b b a j = 5

Boyer-Moore a a a a a a b b a

Boyer-Moore i = 8 a a a a a a b b a j = 2 L() 4 5 3

Boyer-Moore i = 12 a a a a a a b b a j = 5 L() 4 5 3

Boyer-Moore i = 12 a a a a a a b b a j = 5 L() 4 5 3

Boyer-Moore i = 12 a a a a a a b b a j = 5 L() 4 5 3

Boyer-Moore i = 13 a a a a a a b b a j = 5 L() 4 5 3

Boyer-Moore i = 15 a a a a a a b b a j = 5 L() 4 5 3

Boyer-Moore i = 10 a a a a a a b b a

Boyer-Moore a a a a a a b b a Men hva er svakheten til Boyer-More?

Boyer-Moore i = 8 a a a a a a b b a j = 2

Boyer-Moore i = 12 a a a a a a b b a j = 5

Boyer-Moore i = 8 a a a a a a b b a j = 2

Boyer-Moore i = 8 a a a a a a b b a j = 2

Boyer-Moore i = 8 a a a a a a b b a j = 2

Boyer-Moore i = 15 a a a a a a b b a j = 5

Boyer-Moore med good suffix shift i = 15 a a a a a a b b a j = 5

Boyer-Moore med good suffix shift i = 8 a a a a a a b b a j = 2

Boyer-Moore med good suffix shift i = 15 a a a a a a b b a j = 5

Knuth-Morris-Pratt-algoritmen a a a a a a b b a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a Ingen sammenligning nødvendig her

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a Første sammenligning etter flytting av j ( j 1 )

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a Mismath, og vi flytter ett hakk ( j 0 )

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a Mismath, og vi flytter ett hakk ( j 0 )

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a Mismath, og vi flytter 4 hakk ( j 0 )

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a Mismath, og vi flytter 4 hakk ( j 0 )

Knuth-Morris-Pratt-algoritmen i a a a a a a b b j a Mismath, og vi flytter 1 hakk ( i 0 )

Knuth-Morris-Pratt-algoritmen a a a a a a i b b j a

Knuth-Morris-Pratt-algoritmen a a a a a a b b 1 2 3 4 5 6 a 7 a 8 9 10 11 12 a j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 2 13 a 14 15 16 17 18 19 a

Knuth-Morris-Pratt-algoritmen the failure funtion Også kjent som «partial math-table» j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 2

Knuth-Morris-Pratt-algoritmen the failure funtion Også kjent som «partial math-table» Knuth-Morris-Pratt s algorithm preproesses the pattern to find mathes of prefixes of the pattern with the pattern itself j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 2

Knuth-Morris-Pratt-algoritmen the failure funtion Også kjent som «partial math-table» Knuth-Morris-Pratt s algorithm preproesses the pattern to find mathes of prefixes of the pattern with the pattern itself The failure funtion F(j) is defined as the size of the largest prefix of P[0..j] that is also a suffix of P[1..j] j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 2

Knuth-Morris-Pratt-algoritmen the failure funtion Også kjent som «partial math-table» Knuth-Morris-Pratt s algorithm preproesses the pattern to find mathes of prefixes of the pattern with the pattern itself The failure funtion F(j) is defined as the size of the largest prefix of P[0..j] that is also a suffix of P[1..j] Knuth-Morris-Pratt s algorithm modifies the brute-fore algorithm so that if a mismath ours at P[j] T[i] we set j F( j - 1) j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 2

j 0 1 2 3 4 5 P[j] a F(j) 0 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j]

j 0 1 2 3 4 5 P[j] a F(j) 0 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..1] = ab P[1..1] = b Altså lengste prefiks i ab som også er suffiks i b

j 0 1 2 3 4 5 P[j] a F(j) 0 0 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..1] = ab P[1..1] = b Altså lengste prefiks i ab som også er suffiks i b

j 0 1 2 3 4 5 P[j] a F(j) 0 0 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..2] = aba P[1..2] = ba Altså lengste prefiks i aba som også er suffiks i ba

j 0 1 2 3 4 5 P[j] a F(j) 0 0 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..2] = aba P[1..2] = ba Altså lengste prefiks i ab som også er suffiks i ba

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..2] = aba P[1..2] = ba Altså lengste prefiks i ab som også er suffiks i ba

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..3] = aba P[1..3] = ba Altså lengste prefiks i aba som også er suffiks i ba

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..3] = aba P[1..3] = ba Altså lengste prefiks i aba som også er suffiks i ba

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..4] = abaa P[1..4] = baa Altså lengste prefiks i abaa som også er suffiks i baa

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..4] = abaa P[1..4] = baa Altså lengste prefiks i abaa som også er suffiks i baa

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..4] = abaa P[1..4] = baa Altså lengste prefiks i abaa som også er suffiks i baa

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..5] = abaab P[1..4] = baab Altså lengste prefiks i abaab som også er suffiks i baab

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..5] = abaab P[1..4] = baab Altså lengste prefiks i abaab som også er suffiks i baab

j 0 1 2 3 4 5 P[j] a F(j) 0 0 1 0 1 2 F(j) er definert som lengden av lengste prefikset i P[0..j] som også er suffiks i P[1..j] P[0..5] = abaab P[1..4] = baab Altså lengste prefiks i abaab som også er suffiks i baab

KMP Failure Funtion Knuth-Morris-Pratt s algorithm preproesses the pattern to find mathes of prefixes of the pattern with the pattern itself The failure funtion F(j) is defined as the size of the largest prefix of P[0..j] that is also a suffix of P[1..j] Knuth-Morris-Pratt s algorithm modifies the brutefore algorithm so that if a mismath ours at P[j] T[i] we set j F(j - 1) j 0 1 2 3 4 5 P[j] a a F(j) 0 0 1 1 2 3.. a x..... a a j a a F(j 1)

The KMP Algorithm The failure funtion an be represented by an array and an be omputed in O(m) time At eah iteration of the whileloop, either i inreases by one, or the shift amount i - j inreases by at least one (observe that F(j - 1) < j) Hene, there are no more than 2n iterations of the whileloop Thus, KMP s algorithm runs in optimal time O(m + n) Algorithm KMPMath(T, P) F failurefuntion(p) i 0 j 0 while i < n if T[i] = P[j] if j = m - 1 return i - j { math } else i i + 1 j j + 1 else if j > 0 j F[j - 1] else i i + 1 return -1 { no math }