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

Like dokumenter
INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

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

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

UNIVERSITETET I OSLO

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

Tekstalgoritmer. Søk etter delstrenger i array

Notater til INF2220 Eksamen

INF Algoritmer og datastrukturer

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

Turingmaskiner.

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Maps og Hashing. INF Algoritmer og datastrukturer. Map - ADT. Map vs Array

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

IN Algoritmer og datastrukturer

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

Datastrukturer for rask søking

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

Om Kurset og Analyse av Algoritmer

Obligatorisk oppgave 1 INF1020 h2005

Liste som abstrakt konsept/datatype

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

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

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

UNIVERSITETET I OSLO

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

UNIVERSITETET I OSLO

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF1000: Forelesning 7. Konstruktører Static

Obligatorisk oppgave 1 i INF 4130, høsten 2008

Dagens plan: INF Algoritmer og datastrukturer. Grafer vi har sett allerede. Det første grafteoretiske problem: Broene i Königsberg

INF1000: Forelesning 7

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

INF1000 Behandling av tekster

UNIVERSITETET I OSLO

Forelesning inf Java 5

Forelesning inf Java 5

UNIVERSITETET I OSLO

Enkle generiske klasser i Java

Løsningsforslag til eksamen i INF1000 våren 2006

INF Algoritmer og datastrukturer

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

INF2220: Time 12 - Sortering

INF1020 Algoritmer og datastrukturer

Gjennomgang av eksamen H99

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Inf 1020 Algoritmer og datastrukturer

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

UNIVERSITETET I OSLO

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Dagens plan. INF Algoritmer og datastrukturer. Koding av tegn. Huffman-koding

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Dictionary er et objekt som lagrer en samling av data. Minner litt om lister men har klare forskjeller:

UNIVERSITETET I OSLO

... HASHING. Hashing. Hashtabeller. hash(x)

UNIVERSITETET I OSLO

Læringsmål og pensum. Algoritmeeffektivitet

TDT4110 Informasjonsteknologi grunnkurs: Tema: Algoritmer i praksis. Professor Alf Inge Wang

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

INF våren 2017

Algoritmeanalyse. (og litt om datastrukturer)

INF1010 notat: Binærsøking og quicksort

Metoder med parametre, løkker og arrayer

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Dictionary er et objekt som lagrer en samling av data. Minner litt om lister men har klare forskjeller:

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

INF2220: Forelesning 1

UNIVERSITETET I OSLO

2 Om statiske variable/konstanter og statiske metoder.

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Algoritmer og Datastrukturer

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

Transkript:

Pattern matching algorithms INF2220 - Algoritmer og datastrukturer HØSTEN 2009 Institutt for informatikk, Universitetet i Oslo Algoritmer for lokalisering av substrenger Brute force Enkleste tenkelige algoritme for å løse problemet java.lang.string indexof Vi ser på hvordan det gjøres i standard biblioteket INF2220, forelesning 11: Tekstalgoritmer 1 Boyer Moore (Horspool) Relativt komplisert algoritme, med rask worst case Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 1 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 2 / 1 Lokalisering av Substrenger Brute force c o z w e r a... u Fins nåla i høystakken? Hvis JA: hvor? Brute force (rå kraft) brukes ofte synonymt med unødvendig tung dårlig treg lite gjennomtenkt nødløsning men er noen ganger nødvendig Brute force løsninger er typisk den første ideen vi får Stort sett hele dette kurset går ut på å unngå de Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 3 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 4 / 1

Brute force java.lang.string indexof c o z a... u Hvordan løser standard biblioteket til Java denne oppgaven? String klassen har en funksjon som lokaliserer substring Var ikke det den første algoritmen du tenkte på? Hva blir kompleksiteten av et sånt søk? Rimelig å tro at standard biblioteket er bra implementert Vi skal se på hvordan indexof er implementert, samt prøve å forklare hvorfor de har brukt den algoritmen Vi skal se på algoritmer som er raskere, gitt at visse forutsetninger er oppfylt Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 5 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 6 / 1 java.lang.string indexof java.lang.string indexof c o z w c r a... u store: c Andre pattern matching algoritmer har lavere kompleksitet Hvorfor bruker standard biblioteket en såpass enkel algoritme? Er det hensyn Java må ta som vi slipper å ta? Vi lagrer første element i nål Så leiter vi etter match på første element før vi flytter nål Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 7 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 8 / 1

Boyer Moore Boyer Moore c o z w c r a... u Skal vi øke hastigheten må vi minske antall sammenligninger Vi kan preprosessere informasjonen i nål og høystakk Vi kan gjøre rimelige antagelser om input Boyer Moore antar at vi bare har 1-byte characters 1-byte characters gir oss 256 muligheter (2 8 = 256) Vi kan bruke den informasjonen til å preprosessere nålen Vi matcher baklengs med Boyer Moore Merk at elementet z ikke finnes i nålen Dvs. etter første match kan nålen flyttes 3 hakk frem Informasjonen vi trenger for å beregne dette ligger i arrayen vi kaller bad character shift Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 9 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 10 / 1 Bad Character Shift bad character shift (forenklet) int[] badcharshift = new int[256]; // assume 1-byte characters Hvordan beregne bad character shift? Vi må raskt kunne svare på om en bokstav er med i nålen Bokstaver er 1-byte lange dvs. (int) bokstav [0, 255] badcharshift er en array int[256] Vi fyller denne med shift verdier ut i fra hva som er i nålen for(int i = 0; i < badcharshift.length; i++){ badcharshift[i] = needle.length; /* shift size = 1 for characters inside needle */ for(int i = 0; i < needle.length; i++){ badcharshift[ (int) needle[i] ] = 1; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 11 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 12 / 1

bad character shift (forenklet) bad character shift (forenklet) Hvordan ser preprosesseringen ut hvis vi bruker nålen fra i sta? c o z w r c a v u badcharshift[ 99 ] == 1 badcharshift[ 121 ] == 1 121 == (int) y badcharshift[ 103 ] == 1 103 == (int) g For alle andre verdier x [0, 255] badcharshift[ x ] == 3 (needle.length == 3) badcharshift[ 122 ] == 3 badcharshift[ 99 ] == 1 badcharshift[ 97 ] == 3 122 == (int) z 97 == (int) a Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 13 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 14 / 1 bad character shift bad character shift int[] badcharshift = new int[256]; // assume 1-byte characters for(int i = 0; i < badcharshift.length; i++){ badcharshift[i] = needle.length; Hvordan ser preprosesseringen ut hvis vi bruker nålen fra i sta? /* calculate bad shift up to needle.length - 1 */ int last = needle.length - 1; badcharshift[ 99 ] == 2 badcharshift[ 121 ] == 1 121 == (int) y for(int i = 0; i < last; i++){ badcharshift[ (int) needle[i] ] = last - i; For alle andre verdier x [0, 255] badcharshift[ x ] == 3 (needle.length == 3) Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 15 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 16 / 1

bad character shift Boyer Moore Horspool c o z w r c a y u public int boyer moore horspool(char[] needle, char[] haystack){ if ( needle.length > haystack.length ){ return -1; int[] bad shift = new int[char MAX]; // 256 for(int i = 0; i < CHAR MAX; i++){ bad shift[i] = needle.length; int offset = 0, scan = 0; int last = needle.length - 1; int maxoffset = haystack.length - needle.length; for(int i = 0; i < last; i++){ bad shift[needle[i]] = last - i; badcharshift[ 122 ] == 3 badcharshift[ 99 ] == 2 badcharshift[ 121 ] == 1 122 == (int) z 121 == (int) y while(offset <= maxoffset){ for(scan = last; needle[scan] == haystack[scan+offset]; scan--){ if(scan == 0){ // match found! return offset; offset += bad shift[haystack[offset + last]]; return -1; Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 17 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 18 / 1 Boyer Moore Horspool Good Suffix Shift Anta nålen vi leter etter er: fiskekake Horspool tilnavnet er der fordi vi mangler good suffix shift good suffix shift beregner hvor langt vi kan flytte nålen, basert på antall matchende bokstaver før mismatch good suffix shift er en array som er like lang som nålen Vi får informasjon om hvordan høystakken ser ut, når vi vet hvor langt frem i nåla vi fikk match index Mismatch Shift goodcharshift 0 e 1 goodcharshift[0] == 1 1 ke 9 goodcharshift[1] == 9 2 ake 4 goodcharshift[2] == 4 3 kake 9 goodcharshift[3] == 9 4 ekake 9 goodcharshift[4] == 9 5 kekake 9 goodcharshift[5] == 9 6 skekake 9 goodcharshift[6] == 9 7 iskekake 9 goodcharshift[7] == 9 8 fiskekake 9 goodcharshift[8] == 9 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 19 / 1 Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 20 / 1

Boyer Moore Oppsummering Alle algoritmer gjennomgått, blir lagt ut: brute force java.lang.string indexof forenklet bad character shift Boyer Moore Horspool Boyer Moore Bjarne Holen (Ifi, UiO) INF2220 H2009, forelesning 11 21 / 1