Föreläsning 10: Prioritetskö, trappa (heap), heapsort, Reguljära uttryck



Relevanta dokument
Föreläsning 9: Prioritetskö, trappa (heap), heapsort, Reguljära uttryck

Föreläsning 7: Prioritetskö, trappa heapsort, hashning

Föreläsnings 10 - Överlagring, Konstruerare, Arv, Mer Exceptions, Reguljära Uttryck

ANVÄND NAVIGATIONEN I CAPITEX SÄLJSTÖD

OOP Objekt-orienterad programmering

Tentamen i Programmering grundkurs och Programmering C

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

Algebra, polynom & andragradsekvationer en pampig rubrik på ett annars relativt obetydligt dokument

Föreläsning 8: Räkning. Duvhålsprincipen. Kombinatorik

Lathund, procent med bråk, åk 8

Snapphanalegen. Firekángabogena. Spelregler. (4 spelare)

Objektorienterad programmering i Java

Du ska nu skapa ett litet program som skriver ut Hello World.

Tentamen i Algoritmer & Datastrukturer i Java

Klasser och objekt i C#

Tentamen OOP

Individuellt Mjukvaruutvecklingsprojekt

Väga paket och jämföra priser

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

DATASAMORDNING NYHETERNA I CHAOS Utbildning Chaos/Handledning - Nyheterna i Chaos 3/

Snabbslumpade uppgifter från flera moment.

Distribuerade system. CORBA eller RMI

Ha det kul med att förmedla och utveckla ett knepigt område!

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Programmera en NXT Robot

Sammanfatta era aktiviteter och effekten av dem i rutorna under punkt 1 på arbetsbladet.

Gissa det hemliga talet

Föreläsning 3. Stack

Föreläsning 8: Exempel och problemlösning

Erfarenheter från ett pilotprojekt med barn i åldrarna 1 5 år och deras lärare

729G04 - Hemuppgift, Diskret matematik

Idag: Dataabstraktion

Handbok Blinken. Danny Allen Översättare: Stefan Asserhäll

Bortom fagert tal om bristande tillgänglighet som diskriminering

Föreläsning 3: Booleans, if, switch

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

ANVÄNDARHANDLEDNING FÖR

Lathund till Annonsportalen

Statsbidrag för läxhjälp till huvudmän 2016

Omvandla Vinklar. 1 Mattematiskt Tankesätt

ELEV- HANDLEDNING (Ansökan via webben)

Lite skoj - typ. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

Föreläsning 10. ADT:er och datastrukturer

Hemsida Arbetsrum. Skapa arbetsrumslista

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Sammanfattning på lättläst svenska

Menys webbaserade kurser manual för kursdeltagare. Utbildningsplattform: Fronter

Dugga Datastrukturer (DAT036)

Arbeta bäst där du är Dialect Unified Mi

Föreläsning 7. Träd och binära sökträd

Göm ninjorna. Det här projektet kommer att bygga på din kunskap om CCS-kung fu.

Tentamen i Objektorienterad programmering

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

Boken om Teknik. Boken om Teknik är en grundbok i Teknik för åk 4 6.

Praktisk programmering

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

FORTNOX SMÅFÖRETAGENS BÄSTA VÄN. Fortnox kom igång guide Praktisk bokföring. En guide för dig som vill komma igång med bokföring i Fortnox

Predikan Lyssna! 1 maj 2016

912 Läsförståelse och matematik behöver man lära sig läsa matematik?

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

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

UPPGIFT: SKRIV EN DEBATTARTIKEL

Skriva B gammalt nationellt prov

Stimulated recall En forskningsmetod

Efter att du har installerat ExyPlus Office med tillhörande kartpaket börjar du med att göra följande inställningar:

Tentamen, EDAA20/EDA501 Programmering

Administration Excelimport

Handledning för digitala verktyg Talsyntes och rättstavningsprogram. Vital, StavaRex och SpellRight

Träning i bevisföring

Objektorienterad programmering D2

Övningshäfte i matematik för. Kemistuderande BL 05

Användarmanual och policy för Göteborgs Evenemangskalender på goteborg.com

Gruppenkät. Lycka till! Kommun: Stadsdel: (Gäller endast Göteborg)

Idag. Hur vet vi att vår databas är tillräckligt bra?

Föreläsning 3. Stack

Det andra alternativet är att ladda upp filer genom att klicka på plustecknet nere till vänster. Man klickar sig in på den mapp som man vill att

Arbetsmarknadsläget i Hallands län i augusti månad 2016

Design by. Manual Jossan.exe. Manual. till programmet. Jossan.exe. E-post:

Lathund för överföring av rapporter och ljudfiler

Hur motiverad är patienten?

Säkerhetskopiering och återställning Användarhandbok

Skapa en rapport med snygg formatering, rubriker, sidnummer och innehållsförteckning

Vad är WordPress? Medlemmar

Riktlinjer för medborgardialog

Föreläsning 5: Rekursion

Dina inloggningsuppgifter är samma som du använder för att logga in på skolans datorer.

Det är bra om även distriktsstyrelsen gör en presentation av sig själva på samma sätt som de andra.

Tentamen i Algoritmer & Datastrukturer i Java

Projekt benböj på olika belastningar med olika lång vila

SANNOLIKHET. Sannolikhet är: Hur stor chans (eller risk) att något inträffar.

Hävarmen. Peter Kock

Logga in. Gå in på: Klicka på Logga in. Klicka på den region, kommun eller organisation där din verksamhet finns

Att koda en magnetremsa i plastkortskrivare med inbyggd magnetkodare.

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

DOP-matematik Copyright Tord Persson. Bråktal Läs av vilka tal på tallinjen, som pilarna pekar på. Uppgift nr

Föreningen Nordens lokala hemsidor

Del A (obligatorisk för alla)

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

INSTUDERINGSFRÅGOR TILL PROVET

Vad är en webbläsare?

Transkript:

Föreläsning 10: Prioritetskö, trappa (heap), heapsort, Reguljära uttryck Prioritetskö, Trappa (heap) Heapsort Bästaförstsökning Implementation Reguljära uttryck Prioritetskö När man poppar en stack får man ut det senast inpushade. När man tar ut något ur en vanlig kö får man tvärtom ut det som legat längst tid i kön. Man skulle kunna se det som att det som stoppas in tidsstämplas och att det påstämplade talet ger prioriteten för uthämtning. I en prioritetskö stämplas en prioritet på varje objekt som stoppas in och vid uthämtning får man objektet med högst prioritet. En abstrakt prioritetskö kan ha följande anrop. put(x); Stoppa in x med påstämplad prioritet p. x=get(); Hämta det som har högst prioritet. isempty(); Undersök om prioritetskön är tom. isfull(); Undersök om prioritetskön är full. Om det man vill stoppa in i prioritetskön är ett tal kan man använda talet självt som prioritet och bara skriva put(x). Hur den då skiljer sej från en stack och från en vanlig kö ser man av följande exempel. pq.put(1); pq.put(3); pq.put(2); x = pq.get(); // x blir 3 En kö hade skickat tillbaka det först instoppade talet 1; en stack hade skickat tillbaka det senast instoppade talet, 2; prioritetskön skickar tillbaka det bästa talet, 3. I denna prioritetskö betraktar vi största talet som bäst - vi har en så kallad maxprioritetskö. Det finns förstås också minprioritetsköer, där det minsta talet betraktas som bäst. Prioritetsköer har många användningar. Man kan tänka sej en auktion där budgivarna stoppar in sina bud i en maxprioritetskö och auktionsförrättaren efter "första, andra, tredje" gör pq.get() för att få reda på det vinnande budet. För att han ska veta vem som lagt detta bud behöver förstås fler uppgifter lagras.

Trappa pq.put(person); // person är ett objekt med bud, budgivarens // namn och adress m.m. winner = pq.get(); //budgivaren med högst bud Den bästa implementationen av en prioritetskö är en trappa, (eng heap), som är en hakvektor trappsteg tolkad som binärträd. Roten är trappsteg[1] (vi använder inte trappsteg[0]), dess båda söner är trappsteg[2] och trappsteg[3] osv. Allmänt gäller att trappsteg[i] har sönerna trappsteg[2*i] och trappsteg[2*i+1]. Trappvillkoret är att pappa är bäst, dvs varje tal ligger på två sämre tal. Ett nytt tal läggs alltid in sist i trappan. Om trappvillkoret inte blir uppfyllt, dvs om det är större än sin far, byter far och son plats och så fortgår det tills villkoret uppfyllts. Det här kallas upptrappning och kan i värsta fall föra det nya talet hela vägen upp till toppen, alltså trappsteg[1]. Man plockar alltid ut det översta talet ur trappan och fyller igen tomrummet med det sista talet i trappan. Då är inte trappvillkoret uppfyllt, så man får byta talet och dess störste son. Denna nedtrappning upprepas till villkoret åter gäller. Både put och get har komplexitet log N om trappan har N element. Nackdelen med trappan är man måste bestämma hakvektorns storlek från början. Heapsort Om man stoppar in N tal i en trappa och sedan hämtar ut dom ett efter ett får man dom sorterade. Komplexiteten för denna heapsort blir O(N log N), alltså av lika god storleksordning som quicksort. Visserligen är quicksort lite snabbare, men heapsort har inte quicksorts dåliga värstafallsbeteende, och så kan ju en heap användas till andra saker än sortering också. class Heapsort{ public static void main(string[] args){ Heap heap = new Heap(16); System.out.println("Skriv några ord (retur avslutar)"); while (!Mio.eoln()) heap.put(mio.getword()); while (!heap.isempty()) System.out.println(heap.get());

Bästaförstsökning Labb 4 behandlar problemet att finna kortaste vägen från FAN till GUD. Man har då ett problemträd med FAN som stamfar, på nivån därunder sönerna MAN, FIN, FAT osv, på nästa nivå fans sonsöner osv. Om man lägger sönerna i en kö kommer man att gå igenom problemträdet nivå för nivå, alltså breddenförst. Om man byter kön mot en stack blir sökningen djupetförst. Med en prioritetskö får man bästaförstsökning, dvs den mest lovande sonen prioriteras och får föda söner. Exempel 1: Sök billigaste transport från Teknis till Honolulu. All världens resprislistor finns tillgängliga. Problemträdets poster innehåller en plats, ett pris och en faderspekare. Överst i trädet står Teknis med priset noll. Sönerna är alla platser man kan komma till med en transport och priset, till exempel T-centralen, 9.50. Man söker en Honolulupost i problemträdet. Med breddenförstsökning får man den resa som har så få transportsteg som möjligt. Med bästaförstsökning får man den billigaste resan. Exempel 2: Sök effektivaste processen för att framställa en önskad substans från en given substans. All världens kemiska reaktioner finns tillgängliga med uppgift om utbytet i procent. Problemträdets poster innehåller substansnamn och procenttal. Överst i trädet står utgångssubstansen med procenttalet 100. Sönerna är alla substanser man kan framställa med en reaktion och utbytet, till exempel C2H5OH, 96%. Med en maxprioritetskö får man fram den effektivaste process som leder till målet. Implementation Här följer en rudimentär implementation av en heap med Comparable-element. Vad händer om man försöker stoppa in ett element i en redan full Heap? Eller plocka ut något ur en tom Heap? Ge förslag på hur man ska hantera dessa fall. class Heap { /** En heap implementerad med en trappa (hakvektor tolkad som binärträd) */ private int size; /* Aktuell storlek */ private int maxsize; /* Maximal storlek */ private Comparable[] heap; /* Trappan - en hakvektor där heapens element lagras */ /** Konstruktor - ange trappans maxstorlek */ public Heap(int maxsize) { this.size=0; this.maxsize=maxsize; heap = new Comparable[maxsize+1]; /** Returnerar true om inga element finns i heapen */ public boolean isempty() return size==0; /** Returnerar true om inga fler element får plats i heapen */ public boolean isfull() return size==maxsize;

/** Lägger in ett nytt element i heapen */ public void put(comparable data){ if (!isfull()) { size=size+1; heap[size]=data; int i=size; while (i>1 && heap[i/2].compareto(heap[i])<0) { byt(i/2, i); i=i/2; /** Plockar ut det största (med compareto) elementet ur heapen */ public Comparable get(){ if (!isempty()){ Comparable data=heap[1]; heap[1]=heap[size]; size=size-1; int i=1; do { int max=maxindex(i); if (heap[i].compareto(heap[max])<0) byt(i,max); i=max; while (i<=size/2); return data; else return null; /** Hjälpmetod, byter plats på element a och b */ private void byt(int a, int b) { Comparable tmp=heap[a]; heap[a]=heap[b]; heap[b]=tmp; /** Hjälpmetod, returnerar index för största sonen */ private int maxindex(int i){ if (2*i+1>size) return 2*i; if (heap[2*i].compareto(heap[2*i+1])>0) return 2*i; else return 2*i+1; Reguljära uttryck Reguljära uttryck används när man vill söka efter en viss text i en textmassa. Ett reguljärt uttryck består av tecken och metatecken som tillsammans utgör ett sökmönster. Ett exempel på en vanlig användning av reguljära uttryck är filöppningsdialogen i en ordbehandlare. I Figur 1 visas en filöppningsdialog i ordbehandlaren Microsoft Word. I fältet Files of type räknas ett antal reguljära uttryck upp: *.doc, *.dot, *.htm osv. I dialogfönstret visas enbart filer vars filnamn matchar något av dessa reguljära uttryck. Exempelvis matchar filen Ett_word_dokument.doc sökmönstret *.doc.

Figur 1 Filöppningsdialog i Word, wordfiler Övriga filer i den öppnade mappen visas inte. För att se övriga filer i mappen måste ett annat sökmönster användas. Se Figur 2. Figur 2 Filöppningsdialog i Word, alla filer

Olika syntaxer för reguljära uttryck Det reguljära uttrycket *.doc i Figur 1 består av ett metatecken * samt fyra vanliga tecken.doc. Med metatecken avses att tecknet inte matchar sig självt utan skall tolkas särskilt. I det här fallet kommer * att matcha en teckenföljd. Det reguljära uttrycket kommer således att matcha filnamn bestående av en teckenföljd, vilken som helst, avslutat med ändelsen.doc. Exempel: Ett_word_dokument.doc Ett_till_dokument.doc Ett_.doc_dokument.doc I andra sammanhang, t.ex. när man använder programmeringsverktyg som java, lex, eller perl, har metatecknet * en liknande men annan tolkning. Javas klass Pattern tolkar * som inga eller flera av föregående och kan appliceras på ett enskilt tecken eller ett helt reguljärt uttryck. Reguljära uttryck i java Sedan JDK 1.4 stöder java programmering med reguljära uttryck. Nedan följer ett utdrag ur dokumentationen för klassen Pattern: ( ) A regular expression, specified as a string, must first be compiled into an instance of this class. The resulting pattern can then be used to create a Matcher object that can match arbitrary character sequences against the regular expression. All of the state involved in performing a match resides in the matcher, so many matchers can share the same pattern. A typical invocation sequence is thus Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches(); A matches method is defined by this class as a convenience for when a regular expression is used just once. This method compiles an expression and matches an input sequence against it in a single invocation. The statement boolean b = Pattern.matches("a*b", "aaaaab"); is equivalent to the three statements above, though for repeated matches it is less efficient since it does not allow the compiled pattern to be reused. ( ) Character classes [abc] a, b, or c (simple class) [^abc] Any character except a, b, or c (negation) [a-za-z] a through z or A through Z, inclusive (range) Greedy quantifiers X? X, once or not at all X* X, zero or more times X+ X, one or more times ( )