DM02 - Obligatorisk opgave E.05 Rejseplanlægning. Jacob Aae Mikkelsen

Størrelse: px
Starte visningen fra side:

Download "DM02 - Obligatorisk opgave E.05 Rejseplanlægning. Jacob Aae Mikkelsen"

Transkript

1 DM02 - Obligatorisk opgave E.05 Rejseplanlægning Jacob Aae Mikkelsen November 2005

2 Resumé Denne rapport dokumenterer opbygningen af et program der skal beregne den korteste rejsetid mellem en start og en slutstation i en køreplan. Rapporten forklarer teorien bag opbygning af grafen der søges i, opbygningen af en hob som minimums prioritetskø, samt Dijkstar s algoritme. Slutteligt er implementationen og afprøvningen af programmet beskrevet.

3 Indhold 1 Indledning 2 2 Kravspecifikation 3 3 Design Udviklingsstrategi Teori om grafer Hob teori Dijkstra s algoritme Implementation Grafens opbygning Dijkstra s algoritme Implementation af hoben Køretids analyse Opbygning af grafen Søgningen Pladsforbrug Afprøvning 15 7 Konklusion 17 A Testkørsels udskrifter 19 A.1 Testkøreplanen B Kilde kode 20 B.1 Rute.java B.2 TextReader.java B.3 Vertex.java B.4 Edge.java B.5 Dijkstra.java B.6 Heap.java

4 Kapitel 1 Indledning Denne rapport dokumenterer udviklingsforløbet og afprøvningen af et program der skal kunne beregne rejsetider i en togplan. Hoveddelene i opgaven er at konstruere en vægtet, orienteret graf, programmere en binær hob som prioritetskø, samt at implementere Dijkstras algoritme. Rapporten fungerer sammen med programmet, som obligatorisk opgave, og dermed som adgangskrav til eksamen i DM02 - efterår 2005 på Syddansk Universitet, Odense. Kravene til både programmet og rapporten er specificeret i punktform i afsnittet kravspecifikation. I design afsnittet er teorien bag Dijkstras algoritme, grafens opbygning og hoben beskrevet, samt hvorledes opgaven i praksis er grebet an. Afsnittet om implementation beskriver hvorledes koden er bygget op, og hvor kildekoden skiller sig væsentligt ud fra teorien i design afsnittet. Køretiden er analyseret i afsnittet herom, for opbygningen af grafen, såvel som for søgningen efter den korteste tur. Der er benyttet forskellige former for test til at afprøve programmet med, og disse er forklaret og dokumenteret i test afsnittet. Slutteligt er der konkluderet på de resultatet af opgaven. Programmet virker efter hensigten, og teorien bag er forklaret i denne rapport. 2

5 Kapitel 2 Kravspecifikation Opgaven går ud på at lave et program, som ud fra en togplan finder den bedste rute mellem to byer. Turen skal tage så kort tid som muligt, men med så få togskift som muligt. Turen må forlænges med 15 minutter for at undgå et togskift. Og hvis ruten ud fra disse kriterier er ens, er de lige gode. Der er i opgaven stillet følgende direkte krav til programmet Programmet skal kodes i programeringssproget JAVA (den nyeste version) Der skal konstrueres en graf, som representerer køreplanen, der skal overholde følgende krav: for hver toglinie tilføjes knuder for hver station, og kanter mellem to på hinanden følgende stationer (Eksterne kanter) Når alle toglinierne er tilføjet tilføjes for hver station kanter (Interne kanter), mellem de afgange der er mindst 5 minutter senere end den forige. Vægten af en ekstern kant er forskellen i minuttter mellem slut og start. Vægten af en intern kant er forskellen i minutter mellem slut og start, plus 15 minutter. Grafen skal kunne bygges i tid O(max{ n a log n a, n s k 2 }), hvor n a er det samlede antal afgang fra alle stationerne tilsammen, n s er antallet af stationer, og k er det største antal afgange, der er fra nogen station. Der skal kodes en binær hob, der kan fungere som prioritetskø Dijkstra s algoritme skal implementeres for at finde korteste vej korteste vej og antal skift for den ønskede rute skal kunne findes i tid O((n a + n s k 2 ) log(n a )) Programmet skal køre med tre inputs 1. fil med køreplan 3

6 KAPITEL 2. KRAVSPECIFIKATION 2. startstationen 3. slutstationen Output fra programmet skal være to tal adskilt af et mellemrum, det første skal være antal minutter om turen, og det andet antal togskift. Programmet skal testes og afprøves for korrekthed Kildekoden skal være kommenteret i passende omfang Der er til rapporten stillet følgende krav Beskrielse og begrundelser af væsentlige valg. Argument for at køretiderne overholdes. Forklaring af test og afprøvning Eventuelle fejl og mangler beskrives. Den skal indeholde en udskrift af kildekoden 4

7 Kapitel 3 Design 3.1 Udviklingsstrategi Opgaven er beskrevet ganske detaljeret, algoritmerne, såvel som strukturerne, er gennemgået i undervisningen. Med dette i mente er vandfaldsmodellen benyttet til projektet. Der er under testningen ikke fundet nævneværdige problemer, hvorfor dette synes et fornuftigt valg. 3.2 Teori om grafer Hvis en graf skal overføres fra et stykke papir til en computer er det fornuftigt at benytte enten et array eller en arrayliste, til at opbevare knuderne. Indeni knuderne gemmes en adjacens liste med de udgående kanter. I dette tilfælde, hvor kanterne har information om vægt, togskifte og den station den peger på, samt at vi ikke ved hvor mange knuder der skal være i grafen, når vi går igang med at bygge den, er det oplagt at benytte en ArrayListe. I ArrayListen gemmes så knuder, der oprettes som objekter af klassen Vertex. Knuder (Vertex) skal indeholde oplysninger om stationsnavn, tiden den er på stationen, afstanden fra start til knuden og antal togskift på den korteste rute fra startknuden, samt udgående kanter. De udgående kanter gemmes i en adjacensliste som objekter af typen Edge. Denne liste implementeres som en LinkedList i JAVA. De øvrige oplysninger kan gemmes som ret simple typer. For at opfylde kravet til køretid oprettes en variabel med knudens index i arraylisten, således at der ikke skal søges igennem listen for at finde knuden. Kanter (Edge) skal indeholde oplysninger om til hvilken station den går, hvor stor vægt den har, og om den representerer et togskifte (intern kant). Disse oplysninger kan også representeres ved simple typer. Opbygningen af grafen i opgaven sker ved at tilføje eksterne kanter på grafen først, altså de kanter hvor passagereren reelt kører med tog. Dette kan gøres efterhånden som linierne i inputfilen læses. Herefter skal knuderne sorteres efter navn og tid, med arraylistens indbyggede sorteringsfunktion. Herefter skal der for hver knude tilføjes kanter, til 5

8 3.3. HOB TEORI KAPITEL 3. DESIGN den samme station, blot der er 5 minutter mellem afgangene. 3.3 Hob teori I Cormen et. al[2] gennemgåes teorien for en max-hob. Teoretisk er det helt parallelt med en min-hob, således skal der implementeres metoderne: buildminheap, minheapify, decreasekey og extractmin. Elementerne i hoben bliver knuderne fra grafen, og nøglen de skal sorteres efter, er afstanden fra startknuden til knuden selv. Metoden minheapify(i) forudsætter at undertræerne fra i opfylder min-hob kravene. Ellers sammenligner denne metode nøglen for i med begge eventuelle børn, og evt. bytter denne med den mindste af dem, og kalder så sig selv på den nye plasering af i. I buildminheap(a) opbygges hoben ved kald til minheapify(i) for alle elementerne i den øverste halvdel af hoben, idet den nederste halvdel er blade i hoben, og disse opfylder i sig selv min-hob betingelserne. Metoden decreasekey(i, key) ændrer nøglen for den knude med index i til en lavere værdi, og bobler så denne op i hoben ved at sammenligne nøglen med forældrerens nøgle, og bytte hvis den er mindre. Når det kommer til extractmin(), der returnerer det mindste element i hoben, indføres en kontrol metode heaphasmoreelements(), således at metoden ikke bør kaldes inden der er kontrolleret om der faktisk er flere elementer i hoben. I extractmin() hentes det nederste element og indsættes som det øverste, der midlertidig er gemt, inden det returneres. Det nye øverste element bobles så ved hjælp af minheapify ned til den korrekte plads. Herved bevares hob strukturen efter det mindste element er fjernet, og den kan derfor bruges som prioritetskø. 3.4 Dijkstra s algoritme Dijkstra s algoritme er en søgealgoritme, der bruges til at bestemme korteste afstande mellem en startknude og alle andre knuder i en vægtet orienteret graf uden negative kanter. Algoritmen starter med at initializere alle knuderne til afstanden uendelig, undtagen startknuden. Her er startknuden lig med en startstation, og der kan derfor godt være flere knuder der starter med afstanden 0. Alle knuderne indsættes i prioriteskøen (hoben), og elementerne betragtes ét efter ét, med den mndste nøgle først. For hver knude, gennemgåes de knuder der peges på i dens adjacens liste. Disse knuders distance opdateres, hvis afstanden fra den knude kanten kommer fra plus vægten af kanten er mindre end knudens egen distance, og hoben opdateres for hvert skift. I denne implementation er vi bare ude efter afstanden og togskift mellem en startknude og en slutknude, og vi gemmer således ikke resultatet fra de andre knuder. Da knuderne, når de er udtaget af køen ikke ændrer deres værdi, er den første gang vi møder en knude der representerer slutstationen den der har den korteste distance, og algoritmen kan afbrydes der. 6

9 Kapitel 4 Implementation 4.1 Grafens opbygning Tekstindlæsning Det første der sker i programmet er at der initialiseres et TextReader object med den køreplanfil programmet er startet med. Det er her valgt at anbringe indlæsningsenheden i en klasse for sig selv, da dette er en veldefineret opgave, og derfor berettiger til det. Textreaderen minder meget om en standart indlæsningsklasse, men er udvidet med to metoder, hasmorelines og getnextline. Dette letter at få køreplanen læst én linie af gangen Knuder og kanter Knuderne, representeret i Vertex klassen, er primært en samling af data, og indeholder mest metoder der gemmer data eller returnerer data. Det eneste der er værd at bemærke er at distancen initialiseres til Dette er vurderet til at være stort nok til at rejsetiden i en togplan sagtens vil holde sig under dette tal. Metoden compareto laver blot strenge med stationsnavnet efterfulgt af tiden og sammenligner disse alfabetisk Eksterne kanter For hver linie der er i køreplanen, læses denne linie, og hvis den indeholder en station tilføjes en knude med oplysninger om stationsnavn og tid. Da vi kender startstationen, testes allerede her om stationen er startstationen, og hvis den er ændres knudens distance til 0. På denne måde gennemføres initializeringen til Dijkstra s algoritme allerede her. Hvis ikke stationen er den sidste på en banestrækning, tilføjes en kant fra den seneste knude til nuværende. På denne måde tilføjes alle knuder, samt alle eksterne kanter. 7

10 4.2. DIJKSTRA S ALGORITME KAPITEL 4. IMPLEMENTATION Interne kanter For at tilføje interne kanter sorteres arraylisten med knuderne efter alfabetisk rækkefølge. For hver knude indsættes indexnummeret i knuden, og der tilføjes interne kanter til alle de stationer der har samme navn, og som tidsmæssigt kommer senere i arraylisten end den knude der tilføjes kanter til. Da stationerne er alfabetiserede, kan løkken stoppes så snart den første station der ikke er den samme som knuden selv mødes. Der skal være mindst 5 minutter mellem afgangene, således at et togskifte fysisk vil kunne lade sig gøre. if(calculatelength(nexttime,starttime) >= 5) { currentvertex.addedge(new Edge( nextvertex, calculatelength(nexttime,starttime)+15, 1)); De kanter der tilføjes her som interne, tilføjes 15 minutter i forhold til tidsforskellen mellem dem, og togskift sættes til 1. De 15 minutter fratrækkes i den sidste ende, for hvert togskift der har været. Grafen er nu bygget op, og Dijkstra s algoritme sættes igang med at søge efter den korteste distance til slut stationen. 4.2 Dijkstra s algoritme Dijkstra s algoritme starter teoretisk med initialize-single-source. Dette skridt er allerede laver i grafens opbygning. Alle knuderne placeres i en binær hob, som prioritetskø. Hobens opbygning beskrives i næste afsnit. public Dijkstra(ArrayList<Vertex> input, String to) { priorityqueue = new Heap(input); Alle elementerne hentes ud af køen, i rækkefølge efter den mindste afstand fra startknuden, ved hjælp af en while-løkke. while(priorityqueue.heaphasmoreelements()) { Vertex u = priorityqueue.heapextractmin(); For hver knude testes om den er slutstationen, og i hvis det er, så må det jo være den der er kortest afstand til, derfor kan algoritmen stoppes, med en break. if(u.getname().equals(to)) { fastestroute = u; //The first hit, we re done break; } Hvis ikke stationen er slutstationen, itereres over alle kanterne i knudens adjacenslist, og kalder funktionen relax for hver knude, som kanten peger på. 8

11 4.3. IMPLEMENTATION AF HOBEN KAPITEL 4. IMPLEMENTATION } } Iterator it = u.getadjacent().iterator(); while(it.hasnext()) { Edge w = (Edge)it.next(); relax(u, w.getto(), w.getlength(), w.gettrainshift()); } Relax metoden Metoden relax kaldes med fire parametra. fra-knuden, til-knuden, kanten mellem dem s vægt, og kantens mulige togskift. Den sammenligner så til-knudens distance med fraknudens sammenlagt med kantens vægt, og opdaterer til-knuden hvis afstanden er mindre. Slutteligt kalder metoden decreasekey på køen, så denne opdateres. private void relax(vertex u, Vertex v, int weight, int shifts) { if(v.getdistance() > u.getdistance() + weight) { v.setdistance(u.getdistance() + weight); v.settrainshift(u.getshifts() + shifts); priorityqueue.decreasekey(v); } } 4.3 Implementation af hoben Det mest problematiske ved implementationen af hoben, var at arraylisten er indekseret fra nul, og hoben fra ét. Det er derfor markeret i koden, hvor der bruges array indeksering, og hvor der bruges hob indeksering minheapify Metoden minheapify kaldes med et hob-index, og antager at de to mulige undertræer af dette index opfylder min-hob egenskaben. Den sammenligner så knuden med dens to børn, og bytter det mindste til det kaldte indeks, hvis det ikke allerede er der (hertil benyttes metoden swap). Hvis der sker en ombytning, kaldes nimheapify med hob-indekset for den placering der blev byttet opad i hoben. Således vil metoden blive kaldt rekursivt, indtil knuden er på plads i hoben. private void minheapify(int index) //Heap numbered { int i = index - 1; //Array numbered int l = 2*index - 1; //Array numbered int r = 2*index; //Array numbered int smallest; //Array numbered 9

12 4.3. IMPLEMENTATION AF HOBEN KAPITEL 4. IMPLEMENTATION } if(l < numberofelements && heap.get(l).getdistance()<heap.get(i).getdistance()){ smallest = l; } else { smallest = i; } if(r < numberofelements && heap.get(r).getdistance()<heap.get(smallest).getdistance()){ smallest = r; } if(smallest!= i) { swap(smallest, i); minheapify(smallest+1); } buildminheap Når hoben skal bygges fra en ikke sorteret arrayliste, benyttes den egenskab, at halvdelen af knuderne (rundet op) er blade. Blade opfylder hob egenskaberne, så metoden kalder bare minheapify fra den midterste knude ned til nummer ét. public void buildminheap() { for(int i = (int) Math.floor(numberOfElements/2) ; i > 0 ; i-- ) { minheapify(i); //Heap numbered } } heapextractmin Her i heapextractmin hentes det første elemnent i arraylisten, gemmer det midlertidigt, mens det sidste element flyttes op på dens plads, og tildeles index 0. minheapify kaldes på listens nye første element, hvorved det bobles ned til dets rigtige plads. Pladsen hvor det sidste element overskrives med et null objekt, så listen bliver mindre for hver gang metoden kaldes. Slutteligt returneres det mindste element. public Vertex heapextractmin() { Vertex min = heap.get(0); heap.set(0, heap.get(numberofelements-1)); heap.get(0).setindex(0); heap.set(numberofelements-1, null); 10

13 4.3. IMPLEMENTATION AF HOBEN KAPITEL 4. IMPLEMENTATION } numberofelements--; minheapify(1); //Heap numbered return min; decreasekey Metoden her er ikke helt som i bogen[2], idet knuden allerede har skiftet værdi (dette sker i Dijkstra s relax-metode). Relevant er til gengæld at knuden selv kender sit index, som også kunne være valgt som parameter i stedet for. At knuden selv kender sit index forøger hastigheden, frem for at skulle kalde metoden indexof, der skal søge listen igennem. Dette ville forøge køretiden med en faktor n a (Antal knuder). public void decreasekey(vertex v) { int index = v.getindex(); //Array numbered int parentindex = (int) Math.floor((index+1)/2)-1; //Array numbered while (index > 0 && (heap.get(parentindex).getdistance() > heap.get(index).getdistance())) { swap( index, parentindex); index = parentindex; parentindex = (int) Math.floor((index+1)/2)-1; } } heaphasmoreelements & swap Disse to metoder er ganske simple, swap ombytter to elementer, der er på de to arraylist indekserede pladser, den kaldes med, og opdaterer også deres nye index. heaphasmoreelements returnerer true, hvis hoben indeholder flere elementer, og false ellers. Denne metode bruges, således at underflow fejl kan undgåes. 11

14 Kapitel 5 Køretids analyse De to klasser Vertex og Edge indeholder ikke metoder der kommer over konstant tid, da det er set og get metoder de fleste af dem. Dette er trivielt, og disse analyseres ikke nærmere når de enkelte metoder kaldes. 5.1 Opbygning af grafen Indlæsning fra køreplanen og eksterne kanter Kravet til køretiden er at den skal kunne bygges i O(max{ n a log n a, n s k 2 }), hvor n a er det samlede antal afgang fra alle stationerne tilsammen, n s er antallet af stationer, og k er det største antal afgange, der er fra nogen station. Sammenhængen mellem antal afgange fra stationerne og linier tekst i inputfilen, afhænger af hvor mange tog-linier der er i inputfilen. For alle stationer på en tog-linie tilføjes kanter, med undtagelse af den sidste. Da vi skal alle linierne i køreplanen igennem, hvor nogen af dem er blanke for at markere linieskift, skal vi først argumentere for at der kun er en konstant faktor i forskel mellem antal blanke linier og slutstationer, og afgange ialt. Den mindste toglinie der kan forekomme er på to stationer, og herefter kommer en blank linie, det vil sige at n a mindst vil være en tredjedel af liniene i køreplanen. Vi ved at følgende sammenhæng er gyldig: O(3 n a ) O(n a log n a ) Da der ikke er løkker i TextLoader klassen, kan der kun opstå problemer i whileløkken i linie 41 i Rute. Da der ikke er noget inden i løkken der gøres mere end én gang for hver linie i filen, er der ikke problemer med at overholde kravet i denne del Interne kanter ArrayListens indbyggede sorterings algoritme er i API en[1] under Collecions.sort opgivet til: The sorting algorithm is a modified mergesort (in which the merge is 12

15 5.2. SØGNINGEN KAPITEL 5. KØRETIDS ANALYSE omitted if the highest element in the low sublist is less than the lowest element in the high sublist). This algorithm offers guaranteed n log(n) performance. Da ArrayListen indeholder præcis n a elementer, nemlig de externe kanter, giver dette præcis O(n a log n a ). I linie 68 i Rute itereres over alle knuderne, og indeni denne løkke i linie 74 startes en ny løkke. I denne løkke betragtes alle de knuder der har større index i arraylisten. Dette giver ved første øjekast en køretid på O(n 2 a). Dette er ikke tilfældet, da while-løkken stoppes med break, hvis det ikke længere er den samme by. Dette kan jo gøres første gang vi møder en anden by, da listen er i alfabetisk rækkefølge. Vi kommer dermed kun igennem løkken k gange. Dette giver så en køretid på O(n a k). Dette skal vi så prøve at se på. Hvis nu vi multiplicerer hver station (n s ) med det maksimale antal afgange fra hver station (k), så er det højst det antal afgange der samlet er fra alle stationerne (n a ). Det er ret intuitivt, da der bare skal være én station med mindre afgange end det maksimale. Derfor kan vi omskrive i udtrykket, således at: O(n a k) = O(n s k k) = O(n s k 2 ) Da indlæsningen af køreplanen og de externe kanter kan laves i O(n a log n a ), og de interne kanter kan tilføjes i O(n s k 2 ), kan hele grafen derfor bygges op i tiden O(max{ n a log n a, n s k 2 }). 5.2 Søgningen Hob en Min-hoben er implementeret parallelt med den max-hob der er udførligt beskrevet i Cormen et al. [2]. Det vil sige at køretiderne for de enkelte metoder er som i skemaet, hvor n betegner antal knuder i hoben: Metode Køretid minheapify O(log n) buildminheap O(n) heaphasmoreelements O(1) heapextractmin O(log n) decreasekey O(log n) swap O(1) Køretiden for buildminheap fremkommer, fordi man ser på halvdelen af elementerne, og disse skiftes højst én plads, for hver knude der betragtes. De logaritmiske køretider fremkommer ved at hoben maksimalt har højden log n, og de enkelte knuder dermed højst flyttes log n pladser. Værd at bemærke er derimod, at der i knuderne er der oprettet en variabel, der ved hvilket indeks knuden er placeret på. Derfor benyttes arraylistens metode indexof ikke, der benytter O(n) tid, men derimod blot et kald til knuden, der benytter O(1) tid. Køretiderne for heaphasmoreelements og swap er trivielle, da der ikke er nogen løkker eller rekursive kald, der kan forlænge køretiden, men kun kald til set og get metoder. 13

16 5.3. PLADSFORBRUG KAPITEL 5. KØRETIDS ANALYSE Dijkstra Selve søgningen skal kunne gennemføres i tiden O((n a + n s k 2 ) log(n a )). Vi har vist at n a er antallet af externe afgange, og med god tilnærmelse antallet af knuder (i hvert fald kun adskilt af en konstant faktor). Der er også argumenteret for at n s k 2, er det maksimale antal af interne kanter. Derfor må n a + n s k 2 være det samlede antal af kanter i grafen. Dijkstra starter med at oprette en hob med alle knuder. Da hoben kan laves i køretid O(n a log n a ), er dette ikke et problem ( n a < n a + n s k 2 ). For hver knude gennemløbes while-løkken, indtil vi møder en knude der repræsenterer slut stationen, hvor den afbrydes. Worst case er jo at møde slut knuden som den sidste, så i store O beregningerne betyder dette intet, men i praksis vil det nok ofte spare en del beregninger. For hver knude kaldes heapextractmin, således er køretiden på O(n a log(n a )) efter dette skridt. For hver knude stadigvæk hentes adjacenslisten, og metoden relax kaldes på de knuder der står i den. Da alle adjacens listerne løbes igennem, er det dermed alle kanterne der kalder relax. Metoden relax laver et par simple operationer, inden den kalder decreasekey, så dennes køretid er O(log(n a )). Den samlede køretid for denne operation er O(AntalKanter log(n a )) = O((n a +n s k 2 ) log(n a )). Dette er større end den tidligere fundne køretid, så det er denne tid, som gælder indtil nu. Rute klassen overtager igen styringen, og beder Dijkstra om at aflevere resultatet. Dette sker i konstant tid, så den samlede køretid for søgningen bliver altså: O((n a + n s k 2 ) log(n a )) 5.3 Pladsforbrug Det er gennem hele programmet den samme arraylist der benyttes, og de samme adjacenslister i knuderne. Dette gør at efter grafens opbygning benyttes minimalt plads, da der bare byttes rundt i arraylisten i hobens operationer, frem for at kopiere dataene. Faktisk slettes knuderne efterhånden som de er færdigbehandlede i søgningen, og dette må siges at være ganske tilfredsstillende. 14

17 Kapitel 6 Afprøvning For at afprøve korrektheden er følgende testtilfælde oplagte. Hvis køreplanen fra opgaven benyttes til en søgning fra Lunderskov til Middelfart, finder programmet også korrekt svaret 42 1 Den i opgaven anbefalede DM02check test består programmet også uden problemer. 1. Ingen mulighed mellem de to byer 2. Vej gennem grafen uden skift 3. Vej med skift der er lige så lang som vej uden skift 4. Vej medskift der er 15 min. kortere end vej uden skift 5. Vej med flere skift 6. Start og slut station den samme 7. Station der ikke eksisterer 8. Vej hvor skift mindre end 5 min havde været hurtigere Resultatet af de nummererede tests er anført i skemaet nedenfor, alle sammen udført på testkøreplanen i bilag A. Test Input Forventet Reelt +/- 1 c til a Ingen vej Ingen vej Godkendt 2 b til d Godkendt 3 a til c Godkendt 4 a til d eller Godkendt 5 a til e Godkendt 6 a til a Godkendt 7 a til q Ingen vej Ingen vej Godkendt 8 a til c Godkendt 15

18 KAPITEL 6. AFPRØVNING Evaluering af kodens kvalitet Programmeringen overholder de retningslinier for god kilde, som beskrevet af Michael Kölling i Objects First... [3]. Koden er kommenteret, og effektiviseret de steder det synes oplagt. 16

19 Kapitel 7 Konklusion Alle kravene i kravspecifikationen er opfyldt, både til programmet og til rapporten. Det vurderes derfor at opgaven er løst tilfredsstillende i henhold til opgaveformuleringen. Teorien er beskrevet, om Dijkstras algoritme, binær hob og opbygning af grafer på en computer. Selve implementationen er forklaret, med henblik på at forklare de valg der er gjort, i forbindelse med køretid og korrekthed. Programmet er afprøvet for især korrekthed, og har bestået de opstillede tests, også den med opgaven anbefalede DM02check. Der er ikke i den forstand testet robusthed, da det forventes at input er i det beskrevne format. Det er lykkedes at få programmet til at overholde kravet til worst case køretid, som der er, mens det reelt endda vil lave færre beregninger i de fleste tilfælde. 17

20 Litteratur [1] [2] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms (2. Edition). MIT Press, [3] Michael Kölling and David J. Barnes. Objects First with JAVA - A practical introduction using BlueJ (2nd Edition). Pearson Educational Limited 2004,

21 Bilag A Testkørsels udskrifter A.1 Testkøreplanen a, 01:00 b, 02:00 b, 02:30 c, 03:00 d, 03:30 b, 02:04 c, 02:10 a, 01:30 c, 03:30 a, 02:00 d, 04:45 d, 04:00 e, 05:00 19

22 Bilag B Kilde kode B.1 Rute.java 1 import java. u t i l. ArrayList ; 2 import java. u t i l. C o l l e c t i o n s ; 3 / 4 This i s t h e main c l a s s f o r t h e mandatory assignment in DM02 SDU F a l l I t c o n t r o l s t h e f l o w o f information in t h e program, used to c a l c u l a t e t h e 7 s h o r t e s t time to t r a v e l from a to b in a t r a i n d e p a r t u r e plan 8 9 In t h i s c l a s s, t h e graph i s b u i l d 10 Kokken 12 / 13 public class Rute { 14 / 15 The s t a r t i n g p o i n t o f t h e a p p l i c a t i o n args [ 0 ] t h e f i l e with t h e t r a i n d e p a r t u r e plan args [ 1 ] t h e s t a t i o n t r a v e l i n g from args [ 2 ] t h e s t a t i o n t r a v e l l i n g to 19 / 20 public s t a t ic void main ( S t r i n g [ ] a r g s ) { 21 ArrayList<Vertex> v e r t e x L i s t = new ArrayList<Vertex >() ; S t r i n g t r a i n I t e n n e r a r y = "" ; 24 S t r i n g from = "" ; 25 S t r i n g to = "" ; 26 try { 27 t r a i n I t e n n e r a r y = a r g s [ 0 ] ; 28 from = a r g s [ 1 ] ; 29 to = a r g s [ 2 ] ; 30 } 31 catch ( ArrayIndexOutOfBoundsException e ) { 32 System. out. p r i n t l n ( " Problems e x i s t s on the input arguments " ) ; 33 } 34 20

23 B.1. RUTE.JAVA BILAG B. KILDE KODE 35 // B u i l d i n g Vertex s and E x t e r n a l edges 36 TextReader r e a d e r = new TextReader ( t r a i n I t e n n e r a r y ) ; 37 S t r i n g s t a r t = "" ; 38 S t r i n g starttime = "" ; 39 Vertex l a s t V e r t e x = null ; while ( r e a d e r. hasmorelines ( ) ) { 42 S t r i n g t h i s L i n e = r e a d e r. getnextline ( ) ; 43 i f ( t h i s L i n e. l e n g t h ( ) > 5) { // Line must be l o n g e r than 5 to be an entry, e l s e i t s a new r o u t e 44 S t r i n g [ ] p a r t s O f S t r i n g = t h i s L i n e. s p l i t ( ", " ) ; // S p l i t s around t h e,, i s o l a t i n g t h e name 45 S t r i n g [ ] time = p a r t s O f S t r i n g [ 1 ]. s p l i t ( " : " ) ; // S p l i t s around t h e :, i s o l a t i n g minnuttes and hours 46 S t r i n g localtime = time [ 0 ]. s u b s t r i n g ( time [ 0 ]. l e n g t h ( ) 2) + " : " + time [ 1 ]. subsequence ( 0, 2 ) ; 47 S t r i n g v = p a r t s O f S t r i n g [ 0 ] + ", " + localtime ; 48 Vertex newvertex = new Vertex ( p a r t s O f S t r i n g [ 0 ], localtime ) ; i f (! s t a r t. e q u a l s ( "" ) ) { // Adding e x t e r n a l edge, i f t h e s t a t i o n i s n t t h e l a s t on t h e r o u t e 51 l a s t V e r t e x. addedge (new Edge ( newvertex, c a l c u l a t e L e n g t h ( localtime, starttime ), 0 ) ) ; 52 } 53 i f ( p a r t s O f S t r i n g [ 0 ]. e q u a l s ( from ) ) { // I n i t i a l i z e s t h e d i s t a n c e, i f t h e s t a t i o n i s t h e s t a r t i n g one 54 newvertex. s e t D i s t a n c e ( 0 ) ; 55 } 56 v e r t e x L i s t. add ( newvertex ) ; 57 s t a r t = v ; 58 starttime = localtime ; 59 l a s t V e r t e x = newvertex ; 60 } 61 else { 62 s t a r t = "" ; 63 } 64 } // Adding i n t e r n a l edges 67 C o l l e c t i o n s. s o r t ( ( ArrayList<Vertex >) v e r t e x L i s t ) ; // S o r t s t h e v e r t e x s according to name and d e p a r t u r e t i m e 68 for ( int i = 0 ; i < v e r t e x L i s t. s i z e ( ) 1; i ++) { // I t e r a t e s over a l l t h e v e r t e x s 69 Vertex currentvertex = ( Vertex ) v e r t e x L i s t. get ( i ) ; 70 currentvertex. s e t I n d e x ( i ) ; // S e t s t h e indexnumber 71 S t r i n g F i r s t C i t y = currentvertex. getname ( ) ; 72 starttime = currentvertex. getdeparturetime ( ) ; 73 int j = i +1; 74 while ( j<v e r t e x L i s t. s i z e ( ) ) { // Keeps us i n s i d e t h e 21

24 B.1. RUTE.JAVA BILAG B. KILDE KODE a r r a y L i s t 75 i f (! ( ( Vertex ) v e r t e x L i s t. get ( j ) ). getname ( ). e q u a l s ( F i r s t C i t y ) ) { 76 break ; // Stops t h e w h i l e lop, i f t h e s t a t i o n i s no l o n g e r t h e same 77 } 78 else { 79 Vertex nextvertex = ( Vertex ) v e r t e x L i s t. get ( j ) ; 80 S t r i n g nexttime = nextvertex. getdeparturetime ( ) ; 81 i f ( c a l c u l a t e L e n g t h ( nexttime, starttime ) >= 5) { // Only adds i n t e r n a l edge, i f t h e time between a r r i v a l and d e p a r t u r e i s more than 5 minnuttes 82 currentvertex. addedge (new Edge ( nextvertex, c a l c u l a t e L e n g t h ( nexttime, starttime )+15, 1) ) ; 83 } 84 } 85 j ++; 86 } 87 } 88 v e r t e x L i s t. get ( v e r t e x L i s t. s i z e ( ) 1). s e t I n d e x ( v e r t e x L i s t. s i z e ( ) 1) ; //The d i j k s t r a a l g o r i t h m i s s t a r t e d here 91 D i j k s t r a d i j k s t r a = new D i j k s t r a ( v e r t e x L i s t, to ) ; 92 System. out. p r i n t l n ( d i j k s t r a. g e t R e s u l t ( ) ) ; 93 } / 96 C a l c u l a t e s t h e t h e l e n g t h o f t h e time i n t e r v a l between t h e two parameters 97 a r r i v a l The a r r i v a l time, as a s t r i n g in t h e format "hh :mm" d e p a r t u r e The d e p a r t u r e time, as a s t r i n g in t h e format "hh :mm" 100 / 101 private static int c a l c u l a t e L e n g t h ( S t r i n g a r r i v a l, S t r i n g departure ) 102 { 103 i f ( c a l c u l a t e R e l a t i v e T i m e ( a r r i v a l ) c a l c u l a t e R e l a t i v e T i m e ( departure ) < 0) { 104 return ( c a l c u l a t e R e l a t i v e T i m e ( a r r i v a l ) c a l c u l a t e R e l a t i v e T i m e ( departure ) ) +1440; 105 } 106 return c a l c u l a t e R e l a t i v e T i m e ( a r r i v a l ) c a l c u l a t e R e l a t i v e T i m e ( departure ) ; 107 } / 110 C a l c u l a t e s t h e number o f minutes from 00:00 to t h e time i n p u t t e t 111 time t h e time, as a s t r i n g in t h e format "hh :mm" 113 / 114 private static int c a l c u l a t e R e l a t i v e T i m e ( S t r i n g time ) 22

25 B.2. TEXTREADER.JAVA BILAG B. KILDE KODE 115 { 116 int hours = I n t e g e r. p a r s e I n t ( time. s u b s t r i n g ( time. l e n g t h ( ) 5, time. l e n g t h ( ) 3) ) ; 117 int minutes = I n t e g e r. p a r s e I n t ( time. s u b s t r i n g ( time. l e n g t h ( ) 2, time. l e n g t h ( ) ) ) ; 118 return hours 60 + minutes ; 119 } 120 } B.2 TextReader.java 1 import java. i o. BufferedReader ; 2 import java. i o. FileNotFoundException ; 3 import java. i o. FileReader ; 4 import java. i o. IOException ; 5 / 6 Basic c l a s s f o r t e x t input, 7 O b j e c t s o f t h i s c l a s s i s ment to read a f i l e once only, 8 but one l i n e at a time. 9 Kokken 11 / 12 public class TextReader { private S t r i n g nextline = null ; 15 private BufferedReader r e a d e r ; 16 / 17 Constructor f o r t h e TextReader c l a s s, 18 I n i t i a l i z e s t h e reading o f t h e f i l e which i s s p e c i f i e d 19 f i l e n a m e The f i l e to read 21 / 22 public TextReader ( S t r i n g f i l e n a m e ) 23 { 24 try { 25 r e a d e r = new BufferedReader (new FileReader ( f i l e n a m e ) ) ; 26 nextline = r e a d e r. readline ( ) ; 27 } 28 catch ( FileNotFoundException e ) { 29 System. out. p r i n t l n ( " F i l e wasn t found! " ) ; 30 } 31 catch ( IOException e ) { 32 System. out. p r i n t l n ( " Something went wrong i n reading the f i l e! " ) ; 33 } 34 } / 37 Method to determine, whether t h e f i l e has any more l i n e s in i t 38 I f not, t h e f i l e i s c l o s e d p r o p e r l y 39 / 40 public boolean hasmorelines ( ) 41 { 23

26 B.3. VERTEX.JAVA BILAG B. KILDE KODE 42 i f ( nextline!= null ) { 43 return true ; 44 } 45 else { 46 try{ 47 r e a d e r. c l o s e ( ) ; 48 } 49 catch ( IOException e ) { 50 System. out. p r i n t l n ( " Something went wrong i n reading the f i l e! " ) ; 51 } 52 catch ( NullPointerException e ) { 53 System. out. p r i n t l n ( " Closing e r r o r, f i l e didn t e x i s t! " ) ; 54 } 55 return f a l s e ; 56 } 57 } / 60 Method to g e t t h e next l i n e from t h e f i l e 61 Should only be c a l l e d, i f a l r e a d y checked 62 i f t h e f i l e has more l i n e s in i t. 63 / 64 public S t r i n g getnextline ( ) 65 { 66 try { 67 S t r i n g l a s t L i n e = nextline ; 68 nextline = r e a d e r. readline ( ) ; 69 return l a s t L i n e ; 70 } 71 catch ( IOException e ) { 72 System. out. p r i n t l n ( " Something went wrong i n reading the f i l e! " ) ; 73 } 74 return null ; 75 } 76 } B.3 Vertex.java 1 import java. u t i l. LinkedList ; 2 / 3 This c l a s s i s used in t h e DM02 p r o j e c t o f f a l l I t i s a c l a s s, used to s t o r e information o f v e r t i c e s o f 5 a d i r e c t e d graph. 6 Kokken // Jacob Aae Mikkelsen 8 / 9 public c l a s s Vertex implements Comparable { private S t r i n g name ; 12 private S t r i n g departuretime ; 24

27 B.3. VERTEX.JAVA BILAG B. KILDE KODE 13 private int d i s t a n c e ; 14 private int t r a i n S h i f t s ; 15 private int arrayindex ; 16 private LinkedList <Edge> a d j a c e n t ; 17 / 18 Constructor o f c l a s s Vertex. 19 / 20 public Vertex ( S t r i n g name, S t r i n g departure ) 21 { 22 this. name = name ; 23 this. departuretime = departure ; 24 this. d i s t a n c e = ; 25 this. t r a i n S h i f t s = 0 ; 26 this. arrayindex = 0 ; 27 a d j a c e n t = new LinkedList <Edge >() ; 28 } / 31 Method to add an edge to t h e adjacency l i s t o f t h e v e r t e x 32 / 33 public void addedge ( Edge newedge ) 34 { 35 a d j a c e n t. add ( newedge ) ; 36 } / 39 Returns t h e name o f t h e s t a t i o n in t h e Vertex 40 / 41 public S t r i n g getname ( ) 42 { 43 return name ; 44 } / 47 Returns t h e d e p a r t u r e time o f t h e Vertex 48 / 49 public S t r i n g getdeparturetime ( ) 50 { 51 return departuretime ; 52 } / 55 Returns t h e d i s t a n c e from t h e s t a r t i n g s t a t i o n to t h i s v e r t e x 56 / 57 public int g e t D i s t a n c e ( ) 58 { 59 return d i s t a n c e ; 60 } / 63 Returns t h e number o f t r a i n s h i f t s on t h e way to t h i s v e r t e x 64 / 65 public int g e t S h i f t s ( ) 66 { 25

28 B.3. VERTEX.JAVA BILAG B. KILDE KODE 67 return t r a i n S h i f t s ; 68 } / 71 Returns t h e index o f t h e Vertex in t h e a r r a y L i s t 72 / 73 public int getindex ( ) 74 { 75 return arrayindex ; 76 } / 80 S e t s t h e index o f v e r t e x in t h e a r r a y L i s t 81 / 82 public void s e t I n d e x ( int newindex ) 83 { 84 arrayindex = newindex ; 85 } / 88 Returns t h e l i s t o f edges, p o i n t i n g to t h e a d j a c e n t v e r t e x s 89 / 90 public LinkedList getadjacent ( ) 91 { 92 return a d j a c e n t ; 93 } / 96 S e t s t h e d i s t a n c e from t h e s t a r t i n g s t a t i o n to t h e v e r t e x 97 / 98 public void s e t D i s t a n c e ( int amount ) 99 { 100 d i s t a n c e = amount ; 101 } / 104 S e t s t h e number o f t r a i n s h i f t s from t h e s t a r t i n g s t a t i o n to t h i s v e r t e x 105 / 106 public void s e t T r a i n S h i f t ( int s h i f t s ) 107 { 108 t r a i n S h i f t s = s h i f t s ; 109 } / 112 Overwrites t h e t o S t r i n g method from t h e Object c l a s s 113 r e t u r n s t h e name and d e p a r t u r e time, only s e p a r a t e d with a, 114 / 115 public S t r i n g t o S t r i n g ( ) 116 { return name + ", " + departuretime ; 119 }

29 B.4. EDGE.JAVA BILAG B. KILDE KODE 121 / 122 Compares two v e r t i c e s, only by t h e i r S t r i n g r e p r e s e n t a t i o n 123 / 124 public int compareto ( Object arg0 ) { 125 S t r i n g t h i s V e r t e x = this. t o S t r i n g ( ) ; 126 S t r i n g othervertex = arg0. t o S t r i n g ( ) ; 127 return t h i s V e r t e x. compareto ( othervertex ) ; 128 } 129 } B.4 Edge.java 1 / 2 This c l a s s i s used in t h e DM02 p r o j e c t o f f a l l I t i s an implementation o f t h e information s t o r e d in 4 edges o f a d i r e c t e d graph 5 Kokken // Jacob Aae Mikkelsen 7 / 8 public class Edge { 9 private Vertex to ; 10 private int l e n g t h ; 11 private int t r a i n S h i f t ; / 14 c o n s t r u c t o r o f c l a s s Edge 15 / 16 public Edge ( Vertex to, int l e n g t h, int t r a i n S h i f t ) 17 { 18 this. to = to ; 19 this. l e n g t h = l e n g t h ; 20 this. t r a i n S h i f t = t r a i n S h i f t ; 21 } / 24 r e t u r n s t h e v e r t e x, t h e edge i s p o i n t i n g towards 25 / 26 public Vertex getto ( ) 27 { 28 return to ; 29 } / 32 r e t u r n s t h e l e n g t h o f t h e edge 33 / 34 public int getlength ( ) 35 { 36 return l e n g t h ; 37 } / 40 r e t u r n s number o f t r a i n s h i f t s 41 / 27

30 B.5. DIJKSTRA.JAVA BILAG B. KILDE KODE 42 public int g e t T r a i n S h i f t ( ) 43 { 44 return t r a i n S h i f t ; 45 } / 48 Overwrites t h e t o S t r i n g method o f Object 49 / 50 public S t r i n g t o S t r i n g ( ) 51 { 52 return to + ", " + l e n g t h ; 53 } 54 } B.5 Dijkstra.java 1 import java. u t i l. ArrayList ; 2 import java. u t i l. I t e r a t o r ; 3 / 4 This c l a s s i s used in t h e DM02 p r o j e c t o f f a l l I t i s an implementation o f most o f t h e D i j k s t r a a l g o r i t h m Kokken // Jacob Aae Mikkelsen 7 / 8 public class D i j k s t r a 9 { 10 private Vertex f a s t e s t R o u t e = null ; 11 private Heap priorityqueue ; 12 / 13 Constructor o f t h e D i j k s t r a c l a s s Uses t h e D i j k s t r a a l g o r i t h m to f i n d t h e s h o r t e s t path t h r o u g t t h e graph, 16 r e p r e s e n t e d in t h e ArrayList o f V e r t i c e s. The l i s t s h o u l d a l r e a d y be i n i t i a l i z e d 17 to s t a r t from a s t a t i o n, and t h i s implementation only s t o r e s information about 18 t h e d e s t i n a t i o n to save memory space 19 / 20 public D i j k s t r a ( ArrayList<Vertex> input, S t r i n g to ) 21 { 22 p riorityqueue = new Heap ( input ) ; 23 while ( priorityqueue. heaphasmoreelements ( ) ) { 24 Vertex u = p r i orityqueue. heapextractmin ( ) ; 25 i f ( u. getname ( ). e q u a l s ( to ) ) { 26 f a s t e s t R o u t e = u ; //The f i r s t h i t, which i s t h e f a s t e s t, we re done 27 break ; 28 } 29 I t e r a t o r i t = u. getadjacent ( ). i t e r a t o r ( ) ; 30 while ( i t. hasnext ( ) ) { 31 Edge w = ( Edge ) i t. next ( ) ; 32 r e l a x ( u, w. getto ( ), w. getlength ( ), w. g e t T r a i n S h i f t ( ) ) ; 28

31 B.6. HEAP.JAVA BILAG B. KILDE KODE 33 } 34 } 35 } / 38 Returns t h e s h o r t e s t d i s t a n c e found 39 / 40 public S t r i n g g e t R e s u l t ( ) 41 { 42 i f ( f a s t e s t R o u t e!= null ) { 43 return "" + ( f a s t e s t R o u t e. g e t D i s t a n c e ( ) (15 f a s t e s t R o u t e. g e t S h i f t s ( ) ) ) + " " + f a s t e s t R o u t e. g e t S h i f t s ( ) ; 44 } 45 else { 46 return "Der er ingen måde at komme frem på! " ; 47 } 48 } / 51 P r i v a t e method used by t h e d i j k s t r a a l g o r i t h m to update t h e d i s t a n c e s 52 o f t h e v e r t i c e s, and i t updates t h e queue, so t h e next element i s t h e 53 c o r r e c t one. 54 / 55 private void r e l a x ( Vertex u, Vertex v, int weight, int s h i f t s ) 56 { 57 i f ( v. g e t D i s t a n c e ( ) > u. g e t D i s t a n c e ( ) + weight ) { 58 v. s e t D i s t a n c e ( u. g e t D i s t a n c e ( ) + weight ) ; 59 v. s e t T r a i n S h i f t ( u. g e t S h i f t s ( ) + s h i f t s ) ; 60 p riorityqueue. decreasekey ( v ) ; 61 } 62 } 63 } B.6 Heap.java 1 import java. u t i l. ArrayList ; 2 / 3 This c l a s s i s used in t h e DM02 p r o j e c t o f f a l l I t i s an implementation o f a heap, used as a p r i o r i t y queue 5 Kokken // Jacob Aae Mikkelsen 7 / 8 public class Heap { 9 10 private ArrayList <Vertex> heap ; 11 private int numberofelements ; 12 / 13 I n i t i a l i z e s t h e heap. 14 / 15 public Heap ( ArrayList <Vertex> A) 16 { 17 heap = A; 18 numberofelements = A. s i z e ( ) ; 29

32 B.6. HEAP.JAVA BILAG B. KILDE KODE 19 buildminheap ( ) ; 20 } / 23 s o r t s t h e element i n t o i t s p l a c e in t h e heap, 24 assuming t h e lower t r e e s i s in c o r r e c t order 25 / 26 private void minheapify ( int index ) // Heap numbered 27 { 28 int i = index 1 ; // Array numbered 29 int l = 2 index 1 ; // Array numbered 30 int r = 2 index ; // Array numbered 31 int s m a l l e s t ; // Array numbered i f ( l < numberofelements && heap. get ( l ). g e t D i s t a n c e ( ) < heap. get ( i ). g e t D i s t a n c e ( ) ) { 34 s m a l l e s t = l ; 35 } 36 else { 37 s m a l l e s t = i ; 38 } 39 i f ( r < numberofelements && heap. get ( r ). g e t D i s t a n c e ( ) < heap. get ( s m a l l e s t ). g e t D i s t a n c e ( ) ) { 40 s m a l l e s t = r ; 41 } 42 i f ( s m a l l e s t!= i ) { 43 swap ( s m a l l e s t, i ) ; // Array numbered 44 minheapify ( s m a l l e s t +1) ; 45 } 46 } / 49 Converts an unsorted l i s t to a l i s t with heap p r o p e r t i e s 50 / 51 public void buildminheap ( ) 52 { 53 for ( int i = ( int ) Math. f l o o r ( numberofelements /2) ; i > 0 ; i ) { 54 minheapify ( i ) ; //Heap numbered 55 } 56 } / 59 Returns true, i f t h e r e i s more elements in t h e heap 60 / 61 public boolean heaphasmoreelements ( ) 62 { 63 i f ( numberofelements > 0) { 64 return true ; 65 } 66 else { 67 return f a l s e ; 30

33 B.6. HEAP.JAVA BILAG B. KILDE KODE 68 } 69 } / 72 Returns t h e s m a l l e s t element in t h e heap, 73 s o r t i n g t h e remaining elements so t h e heap p r o p e r t i e s 74 i s maintained 75 / 76 public Vertex heapextractmin ( ) 77 { 78 Vertex min = heap. get ( 0 ) ; 79 heap. s e t ( 0, heap. get ( numberofelements 1) ) ; 80 heap. get ( 0 ). s e t I n d e x ( 0 ) ; 81 heap. s e t ( numberofelements 1, null ) ; // D e l e t e s t h e l a s t entry, j u s t copied to t h e f i r s t 82 numberofelements ; 83 minheapify ( 1 ) ; // Heap numbered 84 return min ; 85 } / 88 S o r t s t h e element i n t o i t s c o r r e c t p l a c e in t h e heap s t r u c t u r e, 89 a f t e r change has been made to t h e w e i g h t o f t h e eement 90 / 91 public void decreasekey ( Vertex v ) 92 { 93 int index = v. getindex ( ) ; // Array numbered 94 int parentindex = ( int ) Math. f l o o r ( ( index +1) /2) 1; // Array numbered 95 while ( index > 0 && ( heap. get ( parentindex ). g e t D i s t a n c e ( ) > heap. get ( index ). g e t D i s t a n c e ( ) ) ) { 96 swap ( index, parentindex ) ; 97 index = parentindex ; 98 parentindex = ( int ) Math. f l o o r ( ( index +1) /2) 1; 99 } 100 } / 103 Changes t h e l o c a t i o n o f t h e two elements in t h e array 104 / 105 private void swap ( int index1, int index2 ) 106 { 107 Vertex temp1 = heap. g e t ( index1 ) ; // Array numbered 108 Vertex temp2 = heap. g e t ( index2 ) ; // Array numbered 109 temp1. s e t I n d e x ( index2 ) ; 110 temp2. s e t I n d e x ( index1 ) ; 111 heap. s e t ( index2, temp1 ) ; 112 heap. s e t ( index1, temp2 ) ; 113 } 114 } 31

DM507 Eksamen Obligatorisk Opgave Rejseplanlægning

DM507 Eksamen Obligatorisk Opgave Rejseplanlægning Institut for Matematik og Datalogi Syddansk Universitet, Odense 21. februar 2011 LMF DM507 Eksamen Obligatorisk Opgave Rejseplanlægning 1 Problemet Denne opgave går ud på at lave et program, som ud fra

Læs mere

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen

Sekvensafstand DM34 - Eksamensopgave. Jacob Aae Mikkelsen Sekvensafstand DM34 - Eksamensopgave Jacob Aae Mikkelsen 19 10 76 kokken@grydeske.dk 27. maj 2005 Resumé Rapporten her beskriver tre forskellige rekursive metoder til at sammenligne tekst strenge med.

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2016 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 29. februar, 2016 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2019 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 27. februar, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2013 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 5. marts, 2013 Dette projekt udleveres i to dele. Hver del har sin deadline, således

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 20. marts, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den 6. maj 0. Kursusnavn: Algoritmer og datastrukturer I Kursus nr. 005. Tilladte hjælpemidler: Skriftlige hjælpemidler. Varighed: timer Vægtning

Læs mere

Algoritmer og datastrukturer Course No. 02105 Cheat Sheet 2012. May 15, 2012

Algoritmer og datastrukturer Course No. 02105 Cheat Sheet 2012. May 15, 2012 Algoritmer og datastrukturer Course No. 02105 Cheat Sheet 2012 May 15, 2012 1 CONTENTS 2012 CONTENTS Contents 1 Kompleksitet 3 1.1 Køretid................................................ 3 1.2 Asymptotisk

Læs mere

Sortering. Eksempel: De n tal i sorteret orden

Sortering. Eksempel: De n tal i sorteret orden Sortering 1 / 34 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 2 / 34 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Sortering. Eksempel: De n tal i sorteret orden

Sortering. Eksempel: De n tal i sorteret orden Sortering 1 / 32 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 2 / 32 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden

Læs mere

Sortering af information er en fundamental og central opgave.

Sortering af information er en fundamental og central opgave. Sortering Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 Mange opgaver er hurtigere i sorteret information (tænk på ordbøger, telefonbøger,

Læs mere

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer:

Sortering. De n tal i sorteret orden. Eksempel: Kommentarer: Sortering Sortering Input: Output: n tal De n tal i sorteret orden Eksempel: Kommentarer: 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 9 Sorteret orden kan være stigende eller faldende. Vi vil i dette kursus

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2010 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 24. april, 2010 (let justeret 10. maj og 21. maj 2010) Dette projekt udleveres i tre

Læs mere

Sortering af information er en fundamental og central opgave.

Sortering af information er en fundamental og central opgave. Sortering 1 / 36 Sortering Input: Output: Eksempel: n tal De n tal i sorteret orden 6, 2, 9, 4, 5, 1, 4, 3 1, 2, 3, 4, 4, 5, 6, 9 Mange opgaver er hurtigere i sorteret information (tænk på ordbøger, telefonbøger,

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2015 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 3. marts, 2015 Dette projekt udleveres i to dele. Hver del har sin deadline, således

Læs mere

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999 sammenligninger, hvor Programmering 1999 Forelæsning 17, tirsdag 2 november 1999 Søgning efter en given værdi i en tabel Lineær søgning og binær søgning Effektivitet: maskinuafhængig vurdering af køretid

Læs mere

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Institut for Matematik og Datalogi Syddansk Universitet, Odense Onsdag den 0. juni 009, kl. 9 Alle sædvanlige hjælpemidler (lærebøger, notater, osv.)

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2012 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 15. marts, 2012 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer Skriftlig Eksamen DM507 Algoritmer og Datastrukturer Institut for Matematik og Datalogi Syddansk Universitet, Odense Mandag den 6. juni 2016, kl. 15:00 19:00 Besvarelsen skal afleveres elektronisk. Se

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den. maj 00. Kursusnavn Algoritmer og datastrukturer Kursus nr. 06. Tilladte hjælpemidler: Alle hjælpemidler. Vægtning af opgaverne: Opgave

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den 6. maj 0. Kursusnavn: Algoritmer og datastrukturer Kursus nr. 06. Tilladte hjælpemidler: Skriftlige hjælpemidler. Varighed: timer Vægtning

Læs mere

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer

Skriftlig Eksamen DM507 Algoritmer og Datastrukturer Skriftlig Eksamen DM507 Algoritmer og Datastrukturer Institut for Matematik og Datalogi Syddansk Universitet, Odense Tirsdag den 24. juni 2014, kl. 10:00 14:00 Besvarelsen skal afleveres elektronisk. Se

Læs mere

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Grådige algoritmer Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Et generelt algoritme-konstruktionsprincip ( paradigme ) for

Læs mere

Prioritetskøer og hobe. Philip Bille

Prioritetskøer og hobe. Philip Bille Prioritetskøer og hobe Philip Bille Plan Prioritetskøer Træer Hobe Repræsentation Prioritetskøoperationer Konstruktion af hob Hobsortering Prioritetskøer Prioritetskø Vedligehold en dynamisk mængde S af

Læs mere

Korteste veje. Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje på DAGs. Philip Bille

Korteste veje. Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje på DAGs. Philip Bille Korteste veje Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje på DAGs Philip Bille Korteste veje Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje

Læs mere

Datastrukturer (recap)

Datastrukturer (recap) Dictionaries Datastrukturer (recap) Data: Datastruktur = data + operationer herpå En ID (nøgle) + associeret data. Operationer: Datastrukturens egenskaber udgøres af de tilbudte operationer (API for adgang

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2012 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 29. april, 2012 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3 DM502 Forelæsning 3 Indlæsning fra tastatur Udskrift til skærm Repetition Beregning af middelværdi Gentagelse med stop-betingelse (while) Heltalsdivision Division med nul Type-casting ( (double) ) Betinget

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den. maj 00. Kursusnavn Algoritmer og datastrukturer I Kursus nr. 005. Tilladte hjælpemidler: Alle skriftlige hjælpemidler. Vægtning af opgaverne:

Læs mere

Korteste veje. Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje på DAGs. Philip Bille

Korteste veje. Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje på DAGs. Philip Bille Korteste veje Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje på DAGs Philip Bille Korteste veje Introduktion Egenskaber for korteste veje Dijkstras algoritme Korteste veje

Læs mere

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox Martin Olsen DM0 Projekt 0 Del I. marts 0 FOTO: Colourbox Indhold Indledning... Opgave... Opgave... Opgave... Opgave... Opgave... Opgave... Opgave... Kildekode til SimpleInv.java... Kildekode til MergeSort.java...

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2019 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 10. april, 2019 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti.

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti. Korteste veje Korteste veje i vægtede grafer Længde af sti = sum af vægte af kanter på sti. Korteste veje i vægtede grafer Længde af sti = sum af vægte af kanter på sti. δ(u, v) = længden af en korteste

Læs mere

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti.

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti. Korteste veje Korteste veje i vægtede grafer Længde af sti = sum af vægte af kanter på sti. Korteste veje i vægtede grafer Længde af sti = sum af vægte af kanter på sti. δ(u, v) = længden af en korteste

Læs mere

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til fjj@noea.dk. Besvarelsen skal

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af 2 sider Danmarks Tekniske Universitet Skriftlig prøve, den 2. maj 200. Kursusnavn Algoritmer og datastrukturer I Kursus nr. 0205. Tilladte hjælpemidler: Alle skriftlige hjælpemidler. Vægtning af

Læs mere

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Grådige algoritmer Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Et generelt algoritme-konstruktionsprincip ( paradigme ) for

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2016 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 20. april, 2016 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Forår 2017 Projekt, del III Institut for matematik og datalogi Syddansk Universitet 6. april, 2017 Dette projekt udleveres i tre dele. Hver del har sin deadline, således

Læs mere

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Grådige algoritmer Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Et generelt algoritme-konstruktionsprincip ( paradigme ) for

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af 2 sider Danmarks Tekniske Universitet Skriftlig prøve, den 2. maj 200. Kursusnavn Algoritmer og datastrukturer Kursus nr. 02326. Tilladte hjælpemidler: Alle hjælpemidler. Vægtning af opgaverne:

Læs mere

Rolf Fagerberg. Forår 2013

Rolf Fagerberg. Forår 2013 Forår 2013 Mål for i dag Dagens program: 1 2 3 4 5 6 Forudsætninger: DM536 og DM537 Timer: 50% forelæsninger, 50% øvelser Forudsætninger: DM536 og DM537 Eksamenform: Skriftlig eksamen: Timer: 50% forelæsninger,

Læs mere

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte

Læs mere

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti.

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti. Korteste veje Korteste veje i vægtede grafer Længde af sti = sum af vægte af kanter på sti. Korteste veje i vægtede grafer Længde af sti = sum af vægte af kanter på sti. δ(u, v) = længden af en korteste

Læs mere

DM01 DM01. 4. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 13/5-2003. Side 1 af 7

DM01 DM01. 4. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 13/5-2003. Side 1 af 7 DM01 DM01 4. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk D12, Elias 13/5-2003 Side 1 af 7 DM01 Indholdsfortegnelse: BILAG:...2 1 FORMÅL:...3 2 KLASSER:...4 2.1 DNA2:...4 2.1.1 METODER:...4

Læs mere

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

Skriftlig Eksamen Algoritmer og Datastrukturer (dads) Skriftlig Eksamen Algoritmer og Datastrukturer (dads) Datalogisk Institut Aarhus Universitet Mandag den 27. maj 2002, kl. 9.00 13.00 Opgave 1 (25%) Denne opgave handler om multiplikation af positive heltal.

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 11 sider Skriftlig eksamen i Datalogi Modul 1 Sommer 2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 10% Opgave 2 10%

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4 DM502 Forelæsning 4 Flere kontrolstrukturer for-løkke switch-case Metoder Indhold Arrays og sortering af arrays String-funktioner for-løkke Ofte har man brug for at udføre det samme kode, for en sekvens

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af 2 sider Danmarks Tekniske Universitet Skriftlig prøve, den 23. maj 20. Kursusnavn: Algoritmer og datastrukturer I Kursus nr. 0205. Varighed: 4 timer Tilladte hjælpemidler: Alle skriftlige hjælpemidler.

Læs mere

BRP 6.9.2006 Kursusintroduktion og Java-oversigt

BRP 6.9.2006 Kursusintroduktion og Java-oversigt BRP 6.9.2006 Kursusintroduktion og Java-oversigt 1. Kursusintroduktion 2. Java-oversigt (A): Opgave P4.4 3. Java-oversigt (B): Ny omvendings -opgave 4. Introduktion til næste kursusgang Kursusintroduktion:

Læs mere

BRP Sortering og søgning. Hægtede lister

BRP Sortering og søgning. Hægtede lister BRP 18.10.2006 Sortering og søgning. Hægtede lister 1. Opgaver 2. Selection sort (udvælgelsessortering) 3. Kompleksitetsanalyse 4. Merge sort (flettesortering) 5. Binær søgning 6. Hægtede lister 7. Øvelser:

Læs mere

Netværksalgoritmer 1

Netværksalgoritmer 1 Netværksalgoritmer 1 Netværksalgoritmer Netværksalgoritmer er algoritmer, der udføres på et netværk af computere Deres udførelse er distribueret Omfatter algoritmer for, hvorledes routere sender pakker

Læs mere

DANMARKS TEKNISKE UNIVERSITET

DANMARKS TEKNISKE UNIVERSITET DANMARKS TEKNISKE UNIVERSITET Skriftlig prøve, 14. december 2018, 4 timer Side 1 af 18 Kursus navn: 02101 Indledende Programmering Kursus : 02101 Tilladte hjælpemidler: Ikke-digitale skriftlige hjælpemidler

Læs mere

22 Hobe. Noter. PS1 -- Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned.

22 Hobe. Noter. PS1 -- Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned. 22 Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned. Indsættelse i hobe. Sletning af minimalt element i hobe. Repræsentation. 327

Læs mere

Algoritmeanalyse. Øvre grænse for algoritme. Øvre grænse for problem. Nedre grænse for problem. Identificer essentiel(le) operation(er)

Algoritmeanalyse. Øvre grænse for algoritme. Øvre grænse for problem. Nedre grænse for problem. Identificer essentiel(le) operation(er) Algoritmeanalyse Identificer essentiel(le) operation(er) Øvre grænse for algoritme Find øvre grænse for antallet af gange de(n) essentielle operation(er) udføres. Øvre grænse for problem Brug øvre grænse

Læs mere

Datastrukturer (recap)

Datastrukturer (recap) Dictionaries Datastrukturer (recap) Data: Datastruktur = data + operationer herpå En ID (nøgle) + associeret data. Operationer: Datastrukturens egenskaber udgøres af de tilbudte operationer (API for adgang

Læs mere

Forelæsning Uge 5 Mandag

Forelæsning Uge 5 Mandag Forelæsning Uge 5 Mandag Algoritmeskabeloner findone, findall, findnoof, findsumof (sidste mandag) findbest Brug af klassen Collections og interfacet Comparable BlueJ s Debugger Nyttig til at inspicere

Læs mere

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507)

Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Skriftlig Eksamen Algoritmer og Datastrukturer (DM507) Institut for Matematik og Datalogi Syddansk Universitet, Odense Mandag den 7. juni 00, kl. 9 Alle sædvanlige hjælpemidler (lærebøger, notater, osv.)

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet Eksamen 005, F0 side af sider Danmarks Tekniske Universitet Skriftlig prøve, den 6. maj 00. Kursusnavn Algoritmik og datastrukturer I Kursus nr. 005. Tilladte hjælpemidler: Alle skriftlige hjælpemidler.

Læs mere

Mindste udspændende træ. Mindste udspændende træ. Introduktion. Introduktion

Mindste udspændende træ. Mindste udspændende træ. Introduktion. Introduktion Philip Bille Introduktion (MST). Udspændende træ af minimal samlet vægt. Introduktion (MST). Udspændende træ af minimal samlet vægt. 0 0 Graf G Ikke sammenhængende Introduktion (MST). Udspændende træ af

Læs mere

Introduktion til DM507

Introduktion til DM507 Introduktion til DM507 Rolf Fagerberg Forår 2017 1 / 20 Hvem er vi? Underviser: Rolf Fagerberg, IMADA Forskningsområde: algoritmer og datastrukturer 2 / 20 Hvem er vi? Underviser: Rolf Fagerberg, IMADA

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af 2 sider anmarks Tekniske Universitet Skriftlig prøve, den 23. maj 20. Kursusnavn: lgoritmer og datastrukturer Kursus nr. 02326. Varighed: 4 timer Tilladte hjælpemidler: lle skriftlige hjælpemidler.

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af sider Danmarks Tekniske Universitet Skriftlig prøve, den 3. maj 0. Kursusnavn: Algoritmer og datastrukturer I Kursus nr. 005. Varighed: timer Tilladte hjælpemidler: Alle skriftlige hjælpemidler.

Læs mere

Grafer og graf-gennemløb

Grafer og graf-gennemløb Grafer og graf-gennemløb Grafer En mængde V af knuder (vertices). En mængde E V V af kanter (edges). Dvs. ordnede par af knuder. Grafer En mængde V af knuder (vertices). En mængde E V V af kanter (edges).

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet Eksamen 005, F side af sider Danmarks Tekniske Universitet Skriftlig prøve, den 6. maj 0. Kursusnavn: Algoritmer og datastrukturer I Kursus nr. 005. Tilladte hjælpemidler: Skriftlige hjælpemidler. Varighed:

Læs mere

DM507 Algoritmer og datastrukturer

DM507 Algoritmer og datastrukturer DM507 Algoritmer og datastrukturer Introduktion til kurset Rolf Fagerberg Forår 2019 1 / 20 Hvem er vi? Underviser: Rolf Fagerberg, Institut for Matematik og Datalogi (IMADA) Forskningsområde: algoritmer

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af 2 sider Danmarks Tekniske Universitet Skriftlig prøve, den 26. maj 2009. Kursusnavn Algoritmik og datastrukturer I Kursus nr. 0205. Tilladte hjælpemidler: Alle skriftlige hjælpemidler. Vægtning

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet side af 3 sider anmarks Tekniske Universitet Skriftlig prøve, den 29. maj 203. ursusnavn: lgoritmer og datastrukturer ursus nr. 02326. jælpemidler: Skriftlige hjælpemidler. et er ikke tilladt at medbringe

Læs mere

Datastrukturer (recap) Datastruktur = data + operationer herpå

Datastrukturer (recap) Datastruktur = data + operationer herpå Dictionaries Datastrukturer (recap) Datastruktur = data + operationer herpå Datastrukturer (recap) Data: Datastruktur = data + operationer herpå En ID (nøgle) + associeret data (ofte underforstået, også

Læs mere

Rolf Fagerberg. Forår 2012

Rolf Fagerberg. Forår 2012 Forår 2012 Mål for i dag Dagens program: 1 2 3 4 5 6 Forudsætninger: DM502 og DM503 Timer: 50% forelæsninger, 50% øvelser Forudsætninger: DM502 og DM503 Eksamenform: Skriftlig eksamen: Timer: 50% forelæsninger,

Læs mere

Løsning af møntproblemet

Løsning af møntproblemet Løsning af møntproblemet Keld Helsgaun RUC, oktober 1999 Antag at tilstandene i problemet (stillingerne) er repræsenteret ved objekter af klassen State. Vi kan da finde en kortest mulig løsning af problemet

Læs mere

Rolf Fagerberg. Forår 2015

Rolf Fagerberg. Forår 2015 Forår 2015 Dagens program 1 2 3 4 5 Underviser:, IMADA Forskningsområde: algoritmer og datastrukturer Underviser:, IMADA Forskningsområde: algoritmer og datastrukturer Deltagere: BA i Datalogi BA i Software

Læs mere

DM34-1. Obligatorisk opgave Dilemma spillet. Jacob Aae Mikkelsen 191076 kok04

DM34-1. Obligatorisk opgave Dilemma spillet. Jacob Aae Mikkelsen 191076 kok04 DM34-1. Obligatorisk opgave Dilemma spillet Jacob Aae Mikkelsen 191076 kok04 April 2005 Kapitel 1 Resumé Denne rapport dokumenterer udviklingsforløbet og afprøvningen af et spil Dilemma. Spillet går ud

Læs mere

Grådige algoritmer. Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Grådige algoritmer. Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Grådige algoritmer Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Grådige algoritmer Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Læs mere

Grafer og grafalgoritmer

Grafer og grafalgoritmer Algoritmer og Datastrukturer/Datalogi C Forelæsning 15/10-2002 Henning Christiansen Grafer og grafalgoritmer Hvad mener vi med en graf? NEJ! Graf: En matematisk abstraktion over ting som er logisk forbundet

Læs mere

Stakke, køer og lidt om hægtede lister - kapitel 16 og 17

Stakke, køer og lidt om hægtede lister - kapitel 16 og 17 Datastrukturer & Algoritmer, Datalogi C Forelæsning 2/11-2004 Henning Christiansen Stakke, køer og lidt om hægtede lister - kapitel 16 og 17 Fundamentale datastrukturer man får brug for igen og igen Et

Læs mere

Stakke, køer og lidt om hægtede lister

Stakke, køer og lidt om hægtede lister Datastrukturer & Algoritmer, Datalogi C Forelæsning 4/11-2003 Henning Christiansen Stakke, køer og lidt om hægtede lister - kapitel 16 og 17 Hvorfor? Fundamentale datastrukturer man får brug for igen og

Læs mere

Intervalsøgning. Algoritmisk geometri. Motivation for intervaltræer. Intervalsøgning. Lad der være givet en database over ansatte i en virksomhed

Intervalsøgning. Algoritmisk geometri. Motivation for intervaltræer. Intervalsøgning. Lad der være givet en database over ansatte i en virksomhed Algoritmisk geometri Intervalsøgning 1 2 Motivation for intervaltræer Intervalsøgning Lad der være givet en database over ansatte i en virksomhed Ansat Alder Løn Ansættelsesdato post i databasen Vi kan

Læs mere

Algoritmisk geometri

Algoritmisk geometri Algoritmisk geometri 1 Intervalsøgning 2 Motivation for intervaltræer Lad der være givet en database over ansatte i en virksomhed Ansat Alder Løn Ansættelsesdato post i databasen Antag, at vi ønsker at

Læs mere

Rolf Fagerberg. Forår 2015

Rolf Fagerberg. Forår 2015 Forår 2015 Dagens program 1 2 3 4 5 Underviser:, IMADA Forskningsområde: algoritmer og datastrukturer Deltagere: BA i Datalogi BA i Software Engineering BA i Matematik-Økonomi BA i Anvendt Matematik BA

Læs mere

Rekursion og dynamisk programmering

Rekursion og dynamisk programmering Rekursion og dynamisk programmering Datastrukturer & Algoritmer, Dat C Forelæsning 12/10-2004 Henning Christiansen Rekursion: at en procedure kalder sig selv eller et antal metoder kalder hinanden gensidigt.

Læs mere

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

Skriftlig Eksamen Algoritmer og Datastrukturer (dads) Skriftlig Eksamen Algoritmer og Datastrukturer (dads) Datalogisk Institut Aarhus Universitet Onsdag den. august 200, kl. 9.00.00 Opgave (25%) Lad A = A[] A[n] være et array af heltal. Længden af det længste

Læs mere

DM13-1. Obligatorisk opgave E.05. Jacob Aae Mikkelsen

DM13-1. Obligatorisk opgave E.05. Jacob Aae Mikkelsen DM13-1. Obligatorisk opgave E.05 Jacob Aae Mikkelsen - 191076 26. september 2005 Indhold Analyse af problemstillingen........................ 2 Spørgsmål 1................................. 3 Spørgsmål

Læs mere

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt.

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt. Merging og hashing Mål Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt. Dette emne er et uddrag af kurset DM507 Algoritmer og datastrukturer (2. semester). Mål

Læs mere

Grafer og graf-gennemløb

Grafer og graf-gennemløb Grafer og graf-gennemløb Grafer En mængde V af knuder (vertices). En mængde E V V af kanter (edges). Dvs. ordnede par af knuder. Grafer En mængde V af knuder (vertices). En mængde E V V af kanter (edges).

Læs mere

Grafer og graf-gennemløb

Grafer og graf-gennemløb Grafer og graf-gennemløb Grafer En mængde V af knuder (vertices). En mængde E V V af kanter (edges). Dvs. ordnede par af knuder. Grafer En mængde V af knuder (vertices). En mængde E V V af kanter (edges).

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet ksamen 06, side af sider anmarks Tekniske Universitet Skriftlig prøve, den 6. maj 0. ursusnavn: lgoritmer og datastrukturer ursus nr. 06. Tilladte hjælpemidler: Skriftlige hjælpemidler. Varighed: timer

Læs mere

Find største element, sæt det på sidste plads. Grundidé i hobsortering. er er

Find største element, sæt det på sidste plads. Grundidé i hobsortering. er er Programming 1999 KVL Side 19-2 Tidsforbruget, dvs asymptotisk proportionalt med Sorting af element: Tidsforbrug de mindste element, sortet øvrige element 0 Løkkeinvariant for udvalgssorting osv Find tredjemindste

Læs mere

Rolf Fagerberg. Forår 2014

Rolf Fagerberg. Forår 2014 Forår 2014 Mål for i dag Dagens program: 1 2 3 4 5 6 Forudsætninger: Format: Programmering og Diskret matematik I (forelæsninger), TE (øvelser), S (arbejde selv og i studiegrupper) Eksamenform: Skriftlig

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2 DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter Skriftlig eksamen i Datalogi Modul 1 Sommer 1999 Opgavesættet består af 5 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 15% Opgave 2 15% Opgave 3 8% Opgave

Læs mere

DM01 DM01. 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 18/3-2003. Side 1 af 11

DM01 DM01. 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk. D12, Elias 18/3-2003. Side 1 af 11 DM01 DM01 3. Obl. Afl. Jacob Christiansen, 130282, jacob.ch@mail.tdcadsl.dk D12, Elias 18/3-2003 Side 1 af 11 DM01 Indholdsfortegnelse: BILAG:...2 1 FORMÅL:...3 2 KLASSER:...4 2.1 DILEMMA:...4 2.1.1 METODER:...4

Læs mere

Abstrakte datatyper C#-version

Abstrakte datatyper C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype

Læs mere

DM02 Kogt ned. Kokken. Januar 2006

DM02 Kogt ned. Kokken. Januar 2006 DM02 Kogt ned Kokken Januar 2006 1 INDHOLD Indhold 1 Asymptotisk notation 2 2 Algoritme analyse 2 3 Sorterings algoritmer 2 4 Basale datastrukturer 3 5 Grafer 5 6 Letteste udspændende træer 7 7 Disjunkte

Læs mere

Datastrukturer. Datastruktur = data + operationer herpå

Datastrukturer. Datastruktur = data + operationer herpå Prioritetskøer Prioritetskøer? Datastrukturer Datastruktur = data + operationer herpå Datastrukturer Data: Datastruktur = data + operationer herpå Ofte en ID + associeret data. ID kaldes også en nøgle

Læs mere

Danmarks Tekniske Universitet

Danmarks Tekniske Universitet ksamen 036, side af sider anmarks Tekniske Universitet Skriftlig prøve, den 3. maj 0. Kursusnavn: lgoritmer og datastrukturer Kursus nr. 036. Varighed: timer Tilladte hjælpemidler: lle skriftlige hjælpemidler.

Læs mere

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne. Exercise 1: Opgave 9.1 på CodeJudge. a) Lav klasserne Cirkel, Rektangel og Kvadrat, som implementerer vedhæftede interface From.java (se CodeJudge). Lav Rektangel før du laver Kvadrat. Kan du bruge nedarvning

Læs mere

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer BRP 13.9.2006 Tal. Om computer-repræsentation og -manipulation. Logaritmer 1. Opgaverne til i dag dækker det meste af stoffet 2. Resten af stoffet logaritmer binære træer 3. Øvelse ny programmeringsopgave

Læs mere