Algoritmer och datastrukturer, föreläsning 11

Relevanta dokument
Algoritmer och datastrukturer 2012, föreläsning 6

Föreläsning 6 Datastrukturer (DAT037)

Trädstrukturer och grafer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning Datastrukturer (DAT037)

Datastrukturer. föreläsning 8. Lecture 6 1

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning Datastrukturer (DAT036)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsning 7 Datastrukturer (DAT037)

Lösningsförslag till tentamen Datastrukturer, DAT037,

Algoritmer och datastrukturer 2012, fo rela sning 8

Föreläsning Datastrukturer (DAT036)

Föreläsning 2. Länkad lista och iterator

Föreläsning 1. Introduktion och sökning i graf. Vad är en algoritm?

Föreläsning Datastrukturer (DAT036)

Lösningar Datastrukturer TDA

DAI2 (TIDAL) + I2 (TKIEK)

Tentamen, Algoritmer och datastrukturer

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Grafer, traversering. Koffman & Wolfgang kapitel 10, avsnitt 4

Programmering i C++ EDA623 Dynamiska datastrukturer. EDA623 (Föreläsning 11) HT / 31

Föreläsning 9 Innehåll

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Tentamen Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 2. Länkad lista och iterator

Föreläsning 5: Grafer Del 1

Programmering i C++ EDAF30 Dynamiska datastrukturer. EDAF30 (Föreläsning 11) HT / 34

Föreläsning 10. Grafer, Dijkstra och Prim

Grafer, allmänt. Med datastrukturen graf menas vanligen: en mängd av noder (vertices) och en mängd av bågar (edges).

Föreläsning 6. Rekursion och backtracking

FÖRELÄSNING 11 DATALOGI I

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

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

Datastrukturer och Algoritmer D0041D

Tentamen Datastrukturer (DAT036)

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Föreläsningsanteckningar F6

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

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Grafer. 1 Grafer. Grunder i matematik och logik (2015) 1.1 Oriktade grafer. Marco Kuhlmann

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

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

Näst nästa gång: Nästa gång: mer grafer (kap 10) Grafer 1 1. ! uppspännande träd. ! minimala uppspännande träd. ! Prims algoritm. !

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 13. Rekursion

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

Tentamen Datastrukturer, DAT037 (DAT036)

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

Föreläsning 9 Datastrukturer (DAT037)

Tentamen Datastrukturer (DAT036)

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

TENTAMEN I DATAVETENSKAP

Kapitel 9: Grafalgoritmer

Dugga Datastrukturer (DAT036)

Grafer. Objektorienterad modellering och design (EDAF25) Föreläsning 2. Grafer. Grafer Traversering Djupet först. Agenda. Grafer

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

Föreläsning Datastrukturer (DAT036)

Graphs (chapter 14) 1

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen Datastrukturer (DAT036)

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Binära sökträd. Seminarium 9 Binära sökträd Innehåll. Traversering av binära sökträd. Binära sökträd Definition. Exempel på vad du ska kunna

Kaliningrad) låg vid bägge sidor av floden Pregel samt på

Tentamen i Objektorienterad modellering och design Helsingborg

Föreläsning 13. Träd

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

729G04 - Diskret matematik. Lektion 4

Föreläsning REPETITION & EXTENTA

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

Föreläsning 3 Datastrukturer (DAT037)

Optimering Kruskal s algoritm Prim-Jarník s algoritm

Grafer MST Top. sortering Starkt samm. komponenter Kortaste avstånd. Grafalgoritmer 1. Douglas Wikström KTH Stockholm

Föreläsning 3 Datastrukturer (DAT037)

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

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 6. Rekursion och backtracking

träd dag graf båge och vikt Grafer definitioner och terminologi

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

Tentamen Datastrukturer D DAT 035/INN960

Länkade strukturer, parametriserade typer och undantag

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Objektorienterad modellering och design (EDAF25) Föreläsning 5. Repetition Grafer Traversering bredden först med kö

13 Prioritetsköer, heapar

Transkript:

lgoritmer och datastrukturer, föreläsning 11 enna föreläsning behandlar grafer. En graf har en mängd noder (vertex) och en mängd bågar (edge). Ett exempel är: E F G H Z enna graf har följande mängd av noder: {,,,, E, F, G, H, Z en har följande mängd bågar: {<, >, <, >, <, >, <, >, <, E>, <E, F>, <G, H>, <H, Z> Observera att bågarna är riktade! Vi definierar en nods utgrad som antal bågar som går ut från noden. En nods ingrad är antalet bågar in till noden. En väg från nod till nod är en mängd noder via vilka man kan gå från till via bågar. Observera att man får bara gå i pilens riktning på en båge. En cykel är en väg där första och sista noden är samma. En enkel cykel är en cykel där alla noder utom den sista och den första är olika. I en oriktad graf finns det ingen riktning på bågarna, man får gå åt båda hållen. Man kan se en oriktad graf som en riktad graf där det alltid finns en båge från till om det också finns en från till. En graf kallas sammanhängande om det finns en väg mellan alla noder. Grafen i figuren ovan är alltså inte sammanhängande. en har två komponenter. Ofta finns det något värde på bågarna i en graf. et kan till exempel representera längden av vägen mellan två noder eller kostnaden för att gå mellan två noder.

Representation av grafer en enklaste representationen är att använda en matris. ntag till exempel att vi har följande graf: 5 2 7 3 en kan representeras av följande matris eller tabell: null null null 5 null 2 3 null null null 7 null null null En nackdel är att om grafen är stor så blir matrisen mycket stor. Ofta så finns det bara bågar mellan noder som ligger nära varandra och då kommer det oftast att stå null i tabellen. En annan representation är närhetslistan. en ser ut så här för grafen ovan: 5 2 3 7 Fyrkanterna längst till vänster representerar noderna. I fyrkanterna finns data som hör hop med noden. e mer avlånga fyrkanterna representerar bågarna, här finns också data som hör ihop med bågen. e bågar som radas upp till vänster om en nod är de bågar som utgår från noden. Pilen som går från varje båge till en nod visar till vilken nod som bågen går. Representation i Java I Java använder man vanligtvis tre olika klasser för att representera grafer. Iden är samma som för träd och länkade listor, att man har en klass för trädet eller listan och en för noderna som i sin tur kan innehåller data. Vi använder en nodklass, en bågklass och en grafklass. En skiss av dem följer nedan.

Vi börjar med nodklassen. en kan se ut så här: public class Vertex{ //Nodklassen public Vertex nextvertex(){ public Edge firstedge(){ Om till exempel nod i grafen ovan anropar nextvertex så får man etc. Om anropar nextvertex() så blir resultatet null eftersom det inte finns någon nästa nod. Om nod anropar firstedge() så får man bågen som är strax till vänster om den. ågklassen kan ha föjande principiella utseende: public class Edge{ public Edge nextedge(){ public Vertex endpoint(){ Om man anropar nextedge() så får man den båge som finns till höger i närhetslistan. Om det inte finns någon så får man null. Om man anropar endpoint() så får man reda på vilken nod som bågen pekar på. Själva grafklassen kan se ut så här: public class igraph{ public Vertex firstvertex(){ public void insertvertex(vertex v){ public void insertedge(vertex v, Vertex w, Edge e){ Om man anropar firstvertex() så får man den första noden i grafen, i närhetsgrafen ovan är det nod. Exempel ntag att vi vill gå igenom alla noder i en graf g oberoende av bågar. å kan man göra så här: Vertex v = g.firstvertex(); while (g!= null){ //Gör något med noden här v = v.nextedge(); Observera att man inte alls följer bågarna i grafen när man gör så här. Exempel ntag att vi vill besöka alla grannarna till noden v. Så här kan man göra då: Edge e = v.firstedge(); Vertex w = e.endpoint(); //ehandla noden

tt gå igenom grafer Vi ska titta på två sätt att gå igenom (traversera) grafer genom att följa bågarna. I bägge fallen behövs det en startnod. en kan metoden firstvertex() i grafklassen förse oss med. en ena metoden kallas djupet först och den andra bredden först. jupet först Man använder rekursion för att gå igenom noderna. Man makerar noder som besökta när man har besökt dem, varje nod har ett booleskt attribut visited som används för detta. Man kan endast komma till noder som kan nås från startnoden. et betyder att om grafen har flera komponenter så kommer man bara att besöka alla noder i startnodens komponent. Metoden för detta placeras lämpligen i grafklassen. Koden kan se ut så här: public void depthfirst(vertex v){ v.visited = true; // Gör något med noden Edge e = v.firstedge(); Vertex w = e.endpoint(); if (!w.visited) depthfirst(w); redden först Här besöker man först alla startnodens grannar, sedan grannarnas grannar etc. Också här används ett boolskt attribut för att markera att en nod är besökt. Koden kan se ut så här: public void breadthfirst(vertex v){ v.visited = true; //Gör något med noden q.add(v); while (!q.isempty()){ Vertex x = q.remove; Edge e = x.firstedge(); Vertex w = endpoint(); if (!w.visited){ w.visited = true; //Gör något med noden; q.add(w); q kan vara t ex en lista i vilken man lagrar noder vars grannar man ska besöka. Man besöker bara de noder som kan nås från startnoden.

Läsavisningar i gamla boken vsnitt 1.1