Föreläsning 11 - Automater, textsökning, tillstånd

Relevanta dokument
Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Algoritmer, datastrukturer och komplexitet

Exempeltenta GruDat 2002/2003

ENKEL Programmering 3

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Lösningar Datastrukturer TDA

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Linjär sökning. Föreläsning 12. Binär sökning. Exempel: Binära sökträd. Binärt sökträd

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Lab5 för prgmedcl04 Grafik

i=1 c i = B och c i = a i eller c i = b i för 1 i n. Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering.

Grundläggande datalogi - Övning 4

JavaScript del 3 If, Operatorer och Confirm

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

DD1320 Tillämpad datalogi. Lösnings-skiss till tentamen

Användarhandledning Version 1.2

Övning 5 - Tillämpad datalogi 2013

DAI2 (TIDAL) + I2 (TKIEK)

Programmering för språkteknologer II, HT2014. Rum

Visual Basic, en snabbgenomgång

DAB760: Språk och logik

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Objektorienterad programmering med Java Swing: Händelser, lyssnare och applets

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Tentamen i Algoritmer & Datastrukturer i Java

+5V. start. Styrsystem. stopp. Tillståndsmaskiner

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Manual för ehp och HP:s digitala arkiv

Algoritmer. Två gränssnitt

Översikt. Programmering tillämpningar och datastrukturer. Vad kursen täcker. Lärare. Rekommenderad litteratur. Kursmål 729G58 (HKGBB7)

Grundläggande Datalogi för F

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Tentamen, Algoritmer och datastrukturer

Innehåll. Sökning och hashtabeller. En bilsamling att söka i. En bil-klass att söka efter. Hur hittar vi alla bilar som uppfyller ett annat villkor

Tildatenta Lösningsskiss

MMA132: Laboration 2 Matriser i MATLAB

Programmering för språkteknologer II, HT2011. Rum

+5V. start. Styrsystem. stopp. Tillståndsmaskiner

Fredag 10 juni 2016 kl 8 12

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 11 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Gränssnitt för FakeGranska. Lars Mattsson

TDDI16: Datastrukturer och algoritmer

Kojo med Inga Ingenjör

PROGRAMMERINGSTEKNIK TIN212

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 16: Problemträd

Objektorienterad programmering Föreläsning 2

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Inkapsling (encapsulation)

Internet. En enkel introduktion. Innehåll:

Programmering II (ID1019) :00-11:00

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Tentaupplägg. Betygsgränser: 1 uppg 19:00 Betyg 3 2 uppg 18:00 Betyg 4 2 uppg 16:30 Betyg 5 3 uppg 18:00 Betyg 5

Laboration 3, uppgift En klass för en räknare

Teoretisk del. Facit Tentamen TDDC (6)


Grundläggande Datalogi för F

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Automatateori (2) Idag: Sammanhangsfria språk. Dessa kan uttryckas med Grammatik PDA

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Föreläsning 7: Syntaxanalys

Introduktion till MySQL

Lösningsförslag: Instuderingsfrågor, del D

P(X nk 1 = j k 1,..., X n0 = j 0 ) = j 1, X n0 = j 0 ) P(X n0 = j 0 ) = etc... P(X n0 = j 0 ) ... P(X n 1

Föreläsning 3-4 Innehåll

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Tentamen i Introduktion till programmering

Tentamen kl Uppgift 4. Uppgift 5

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Föreläsning 9: Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Inledande matematik för I1. MVE011 läsperiod Matlab vecka 2 övningsuppgifter

Algoritmer, datastrukturer och komplexitet

Wittkopp. Primor 2000 Level 5

Sphero SPRK+ Appen som används är Sphero Edu. När appen öppnas kommer man till denna bild.

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

kl Tentaupplägg

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 8 december 2015 Sida 1 / 22

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

Planering av ett större program, del 2 - for och listor. Linda Mannila

Xemacs, första hjälpen!

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Program & programmering

Att skriva på datorn

Transkript:

Föreläsning 11 - Automater, textsökning, tillstånd Automater Textsökning KMP-automat (Knuth-automat) Boyer-Moore Rabin-Karp Sökning på webben Automater En portkodsautomat med nio knappar kan se ut så här: A B C D E F G H I Anta att den rätta knappföljden är DEG. Då har automaten fyra olika tillstånd: 1. Starttillstånd. 2. Knapptryckning D har just gjorts. 3. Knapptryckningarna DE har just gjorts. 4. Knapptryckningarna DEG har just gjorts. Låset öppnas. När automaten är i ett visst tillstånd och en viss knapp trycks ner övergår den i ett nytt tillstånd, och det kan beskrivas med en övergångsmatris: A B C D E F G H 1 1 1 1 2 1 1 1 1 Exempel: Om automaten är i tillstånd 3 2 1 1 1 2 3 1 1 1 och knapp D trycks ner övergår den till 3 1 1 1 2 1 1 4 1 tillstånd 2. Man kan också rita en graf med fyra noder (som representerar tillstånden) och en massa bokstavsmärkta pilar (som visar vilka övergångar som finns). Mer om automater får man veta i kursen 2D1373, Artificiella språk och syntaxanalys. Textsökning Samma automat kan användas för textsökning, till exempel för att söka efter GUD i bibeln. Bokstav efter bokstav läses och automaten övergår i olika tillstånd. När fjärde tillståndet uppnås har man funnit GUD. Datalogins fader, Donald Knuth, uppfann en enkel metod att konstruera och beskriva automaten. En Knuth-automat har bara en framåtpil och en bakåtpil från varje tillstånd. Så här blir den:

Ett nolltillstånd har skjutits in längst till vänster. Automaten startar emellertid i tillstånd 1, som har ett G i noden. Den tjuvtittar på första bokstaven i bibeln, och om det är ett G läser den G-et och går till höger. Annars följer den bakåtpilen utan att glufsa bokstaven. I nolltillståndet glufsar den alltid en bokstav och går till höger. Koden blir i princip så här: int i=1; while (i<4){ if (i==0 Mio.nextChar() == gud[i]) { i++; Mio.getChar(); } else i = next[i]; } Här är gud[i] i-te bokstaven i det sökta ordet och next[i] det tillstånd man backar till från tillstånd i. Nextvektorn (bakåtpilarna) i vårt exempel blir i 1 2 3 next[i] 0 1 1 Om vi i stället söker efter ADAM i bibeln blir Knuth-automaten så här: Nextvektorn för ADAM blir alltså den här: i 1 2 3 next[i] 0 1 0 För GUD gick bakåtpilen från tillstånd 3 till tillstånd 1, men här vore meningslöst att två gånger i rad kolla om bokstaven är A. Bakåtpilen från tillstånd 4 till tillstånd 2 kräver också en förklaring. Om vi har sett ADA och nästa bokstav inte är ett M kan vi i alla fall hoppas att det A vi just sett ska vara början på ADAM. Därför backar vi till tillstånd 2 och undersöker om det möjligen kommer ett D. Reglerna för hur nextvektorn bildas kan sammanfattas så här: next[1]=0. Annars är next[i]=1 om ordet inte upprepar sej....men om de j senaste bokstäverna vi sett bildar början på sökordet sätts next[i]=j+1....men om bokstav j+1 är samma som bokstav i sätts i stället next[i]=next[j+1]. Reglerna kan programmeras i några få satser och ger då den algoritm för textsökning som uppkallats efter Knuth, Morris och Pratt: KMP-automat. Om den sträng vi söker efter är m tecken lång och texten vi söker i är n tecken lång kräver KMP-sökning aldrig mer än n+m teckenjämförelser och är alltså O(n+m). Metoden går igenom texten tecken för tecken - man kan alltså läsa ett tecken i taget t.ex. från en fil vilket är praktiskt om texten är stor. Tentafråga 19/10 2002 Rita en KMP-automat och ange nextvektor som söker efter ordet VÅLNADSVÅLD

Boyer-Moore Då hela texten finns i en vektor kan man istället använda Boyer-Moores metod. Den börjar med att försöka matcha sista tecknet i söksträngen, som är m tecken lång. Om motsvarande tecken i texten inte alls förekommer i söksträngen hoppar den fram m steg, annars flyttar den fram så att tecknet i texten passar ihop med sista förekomsten i söksträngen. Exempel: Vi söker efter i texten MEN MILDA MA. MEN MILDA MA MEN MILDA MA Boyer-Moore är O(n+m) i värsta fallet, men ca n/m steg om texten vi söker i består av många fler tecken än dom som ingår i söksträngen, så att vi oftast kan hoppa fram m steg. När du skriver Ctrl-S för att söka efter en sträng i Emacs är det Boyer-Moore som används. Boyer-Moore använder en skip-vektor för att veta hur den ska hoppa framåt. Rabin-Karp Beräknar en hashfunktion för söksträngen och jämför med hashfunktionen beräknad för alla avsnitt av längden m i texten. Med javas hashcode() % 17 får vi hash()=6 hash(men M)=8 hash(en MI)=9 hash(n MIL)=3 hash( MILD)=7 hash(milda)=0 hash(ilda )=9 hash(lda M)=7 hash(da MA)=16 hash(a MAT)=2 hash( MATI)=1 hash(matil)=12 hash(atild)=9 hash()=6 För att snabba upp beräkningarna använder man hela tiden förra hashvärdet. Komplexiteten blir O(n*m) i värsta fallet, men i praktiken bara O(n+m). Man kan läsa mer om algoritmer för textbehandling i kursen 2D1378, Text- och bildbehandling. Sökning på webben När man använder en sökmotor, t ex Google, för att hitta webbsidor som innehåller ett visst ord skulle alla ovanstående metoder bli för tidsödande. Där slår man istället upp ordet i ett index som skapats i förväg. Hur det fungerar kan man läsa mer om i kursen 2D1418, Språkteknologi.

Tillståndsprogrammering Det finns flera problem som kan modelleras med olika tillstånd. Objektorienterad programmering lämpar sig väl för att implementera tillstånd. Antag att vi har ett gammalt digitalur som visar tid och har två knappar A och B. A B A B A B 15:00 15: :00 I normalläge visas tiden. När man trycker på A så börjar timmarna blinka. Man kan då ändra timinställningen genom att trycka B. Trycker man på A igen så börjar minuterna blinka och trycker man ännu en gång på A så visas tiden på nytt. Den här funktionaliteten kan vi också beskriva med en automat. Vi har tre tillstånd, två möjliga händelser (events) och två saker som ska utföras (actions). Händelsen Atryck ändrar tillstånd i automaten. När Btryck inträffar så händer olika saker beroende på vilket tillstånd vi befinner oss i. Tillståndet måste lagras i en variabel som är åtkomlig för både A och B men den kanske inte behöver vara åtkomlig för andra klasser/metoder. Det finns olika sätt att lösa det men i princip används en instansvariabel om är åtkomlig från metoden. I vanliga fall bör metoder få all data via parametrar men i det här fallet ska man använda sig av en instansvariabel. Om man vill ha fler funktioner, behöver vi en ny knapp? Man kan tänka sig att införa händelsen Asläpp istället. Om man trycker ner A och håller inne knappen tillräckligt länge så hamnar man i ett tillstånd (t.ex. där man ställer timmarna) annars hamnar man i ett annat tillstånd (t.ex. visa datum). Telefonsvararen med en knapp, bankomater, grafiska gränssnitt, SAXparsning av XML-filer är andra problem som kan illustreras genom att rita en automat. Objektmodellering och tillståndsprogrammering kan man läsa mer om i kursen 2D1385 Programutvecklingsteknik.