INF Algoritmer og datastrukturer

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

Notater til INF2220 Eksamen

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

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

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

INF Algoritmer og datastrukturer

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

INF Algoritmer og datastrukturer

Turingmaskiner.

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

UNIVERSITETET I OSLO

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

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

IN Algoritmer og datastrukturer

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

UNIVERSITETET I OSLO

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

INF1020 Algoritmer og datastrukturer GRAFER

IN Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Obligatorisk oppgave 1 i INF 4130, høsten 2008

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. Hva er INF2220? Algoritmer og datastrukturer

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

Om Kurset og Analyse av Algoritmer

INF Algoritmer og datastrukturer

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

IN Algoritmer og datastrukturer

Datastrukturer for rask søking

INF2220: Forelesning 1

INF Algoritmer og datastrukturer

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Obligatorisk oppgave 1 i INF 4130, høsten 2009

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

UNIVERSITETET I OSLO

Hashing. INF Algoritmer og datastrukturer HASHING. Hashtabeller

INF Algoritmer og datastrukturer

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

Forelesning inf Java 5

UNIVERSITETET I OSLO

Forelesning inf Java 5

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

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

Inf 1020 Algoritmer og datastrukturer

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

INF1020 Algoritmer og datastrukturer

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

Grådige algoritmer. Lars Vidar Magnusson Kapittel 16. Aktivitetvelgingsproblemet Huffmankoder

INF1000: Forelesning 7. Konstruktører Static

INF3/4130 PRØVE-EKSAMEN MED SVARFORSLAG Gjennomgås 1/ , (lille aud.)

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

En oppsummering (og litt som står igjen)

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

Alle mot alle. Åttende forelesning. (eller eller Bellman-Ford, eller BFS, alt ettersom) fra alle noder.

INF1000: Forelesning 7

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

INF2220: Time 12 - Sortering

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

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

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Obligatorisk oppgave 1 INF1020 h2005

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

Kap. 4 del I Top Down Parsering INF5110 v2006. Stein Krogdahl Ifi, UiO

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

Algoritmer og datastrukturer Eksamen

INF Algoritmer og datastrukturer

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

Gjennomgang av eksamen H99

ALGORITMER OG DATASTRUKTURER

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

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

Quicksort. Fra idé til algoritme.

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Liste som abstrakt konsept/datatype

Transkript:

INF2220 - Algoritmer og datastrukturer HØSTEN 2015 Institutt for informatikk, Universitetet i Oslo INF2220, forelesning 10: Tekstalgoritmer 1 Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 1 / 25

Pattern matching algorithms 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 Boyer Moore (Horspool) Relativt komplisert algoritme, med rask worst case Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 2 / 25

Lokalisering av Substrenger c o z w e r a... u Høystakk c y g Nål Fins nåla i høystakken? Hvis JA: hvor? Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 3 / 25

Brute force 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 Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 4 / 25

Brute force c o z c y g a... u Høystakk c y g Nål Var ikke det den første algoritmen du tenkte på? Hva blir kompleksiteten av et sånt søk? Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 5 / 25

java.lang.string indexof c o z w c r a... u Høystakk store: c c y g Nål Vi lagrer første element i nål Så leiter vi etter match på første element før vi flytter nål Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 6 / 25

Boyer Moore 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 Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 7 / 25

Boyer Moore c o z w c r a... u Høystakk c y g Nål 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 Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 8 / 25

c z y g c y g c y g Ingen match for søkestrengen helt i starten av teksten eller de neste to posisjonene etter det Vi kan hoppe fremover og begynne å lete etter en match på den sjette plasseringen av teksten Informasjonen vi trenger for å beregne dette ligger i arrayen vi kaller bad character shift Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 9 / 25

Bad Character Shift 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 Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 10 / 25

bad character shift (forenklet) int[] badcharshift = new int[256]; // assume 1-byte characters 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; } Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 11 / 25

bad character shift (forenklet) Hvordan ser preprosesseringen ut hvis vi bruker nålen fra i sta? c y g Nål badcharshift[ 99 ] == 1 badcharshift[ 121 ] == 1 badcharshift[ 103 ] == 1 99 == (int) c 121 == (int) y 103 == (int) g For alle andre verdier x [0, 255] badcharshift[ x ] == 3 (needle.length == 3) Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 12 / 25

bad character shift (forenklet) c o z w r c a v u Høystakk c y g Nål badcharshift[ 122 ] == 3 122 == (int) z badcharshift[ 99 ] == 1 99 == (int) c badcharshift[ 97 ] == 3 97 == (int) a Vi kan gjøre det bedre for bokstavene som er i nålen Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 13 / 25

bad character shift int[] badcharshift = new int[256]; // assume 1-byte characters for(int i = 0; i < badcharshift.length; i++){ } badcharshift[i] = needle.length; /* calculate bad shift up to needle.length - 1 */ int last = needle.length - 1; for(int i = 0; i < last; i++){ } badcharshift[ (int) needle[i] ] = last - i; Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 14 / 25

bad character shift Hvordan ser preprosesseringen ut hvis vi bruker nålen fra i sta? c y g Nål badcharshift[ 99 ] == 2 badcharshift[ 121 ] == 1 99 == (int) c 121 == (int) y For alle andre verdier x [0, 255] badcharshift[ x ] == 3 (needle.length == 3) Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 15 / 25

bad character shift c o z w r c a y u Høystakk c y g Nål badcharshift[ 122 ] == 3 badcharshift[ 99 ] == 2 badcharshift[ 121 ] == 1 122 == (int) z 99 == (int) c 121 == (int) y Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 16 / 25

Boyer Moore Horspool 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; } 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; } Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 17 / 25

Shift-verdien er basert på den siste byten av nålen, uansett hvor vi ikke fikk match. shift basert på d, shift 4 a a c d a b c d a b c d shift basert på d, shift 1 a a c a b c d d d a c b d d Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 18 / 25

Bad suffix shift er effektiv til for eksempel å søke i tekst i naturlige språk fordi mismatches er sannsynlige Med få alfabeter er det sannsynlig å få matching nær slutten av nålen. I dette tilfellet kan vi ha nytte av å vurdere vellykket match-suffikser av nålen. Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 19 / 25

Boyer Moore Horspool Horspool er en forenkling av Boyer-Moore-streng-søkealgoritmen Boyer-Moore-algoritmen er basert på: 1. å analysere nålen baklengs 2. bad suffix shift 3. good suffix shift bad suffix shift unngår å gjenta mislykkede sammenligninger mot et tegn i høystakken good suffix shift beregner hvor langt vi kan flytte nålen, basert på antall matchende bokstaver før mismatch justerer bare matchende nål-tegn mot høystakk-tegn som allerede har fått match good suffix shift er en array som er like lang som nålen Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 20 / 25

Good suffix shift (Case 1) Antar at vi har fått match for nål[i... n] Hvis nål[i 1] er en mismatch og nål inneholder en annen kopi av nål[i... n] som ikke har tegnet nål[i 1] som prefiks, flytt nål slik at kopien matcher substrengen som allerede var matchet av nål[i... n] høystakk: prstabstubabvqxrst nål: qcabdabdab høystakk: prstabstubabvqxrst nål: qcabdabdab Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 21 / 25

Good Suffix Shift Anta nålen vi leter etter er: fiskekake 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 ke representerer en substreng i fiskekake som består av et tegn som ikke er en k pluss et tegn e Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 22 / 25

Good suffix shift (case 2) Antar at nål[i... n] og substreng t av høystakken matcher, men vi har en mismatch av nål[i 1] Hva hvis nål[i... n] ikke er en substreng i nål[0... i 1]? - - - - X M A N P A N M A N - - - - - - A N P A N M A N Case 2: flytt nål minst mulig slik at et suffiks av t matcher et prefiks av nål Hvis ingen slik match, flytt nål med nål posisjoner. Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 23 / 25

Good Suffix Shift Anta nålen vi leter etter er: ANPANMAN index Mismatch Shift goodcharshift 0 N 1 goodcharshift[0] == 1 1 AN 8 goodcharshift[1] == 8 2 MAN 3 goodcharshift[2] == 3 3 NMAN 6 goodcharshift[3] == 6 4 ANMAN 6 goodcharshift[4] == 6 5 PANMAN 6 goodcharshift[5] == 6 6 NPANMAN 6 goodcharshift[6] == 6 7 ANPANMAN 6 goodcharshift[7] == 6 source: wikipedia.org Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 24 / 25

Neste forelesning: 29. oktober Huffman-koding, Dynamisk programmering, Floyds algoritme og paradigmer for algoritmedesign Ingrid Chieh Yu (Ifi, UiO) INF2220 H2015, forelesning 10 25 / 25