Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Sabine Waltraud Keller Geändert vor über 8 Jahren
2
Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW
3
-2- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen 4.1 Einführung Definitionen (Wiederholung von Huckert) Knoten Kanten gerichtet ungerichtet Nachbar (adjacent), Vorgänger (predecessor), Nachfolger (successor) Kantenfolge (path), Pfeilfolge (directed path) Zyklisch, zyklenfrei verbunden, zusammenhängend, erreichbar
4
-3- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Implementierung Adjazenzmatrix Adjazenzlisten stack queue
5
-4- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen 4.2 Basisoperation: Suchen von Knoten Anwendung: Erreichbarkeit Finde alle von Knoten x aus erreichbaren Knoten z.B. finde in einem integrierten Schaltkreis alle mit einem gegebenen Pin elektrisch verbundenen Pins Zwei Basisalgorithmen zum Suchen von Knoten: Depth-First-Search DFS (Tiefensuche) Breadth-First-Search BFS (Breitensuche)
6
-5- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen 4.2.1 DFS Tiefensuche Benutzt einen stack und folgende Strategie: Start: push (x), x sei der Startknoten der Suche Regel 1: wenn möglich wähle einen noch nicht markierten Nachbar y des Top-Elements des stacks, markiere ihn als besucht und push(y) Regel 2: wenn Regel 1 nicht angewendet werden kann, mache ein pop Regel 3: wenn weder Regel 1 noch Regel 2 anwendbar sind => fertig
7
-6- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Anwendung am Beispielapplet! Implementierung: Klasse vertex mit Nutzdaten wasVisited Besucht Klasse stack
8
-7- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen Klasse graph (gerichtet oder ungerichtet) mit Knotenmenge (z.B. als Array vertexList[]) Kantenmenge (z.B. als Adjazenzmatrix adjMat[][] addVertex Knoten hinzufügen addEdge Kante hinzufügen displayVertex Knoten ausgeben getAdjUnvisitedVertex noch nicht besuchten Nachbar finden dfs die Tiefensuche selbst
9
-8- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen getAdjUnvisitedVertex noch nicht besuchten Nachbar finden // returns an unvisited vertex adj to v public int getAdjUnvisitedVertex(int v) { for(int j=0; j<nVerts; j++) if(adjMat[v][j]==1 && vertexList[j].wasVisited==false) return j; return -1; } // end getAdjUnvisitedVert()
10
-9- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen DFS public void dfs() // depth-first search { // begin at vertex 0 vertexList[0].wasVisited = true; // mark it displayVertex(0); // display it theStack.push(0); // push it while( !theStack.isEmpty() ) // until stack empty, { // get an unvisited vertex adjacent to stack top int v = getAdjUnvisitedVertex( theStack.peek() );
11
-10- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 4: Graph Algorithmen if(v == -1) // if no such vertex, theStack.pop(); else // if it exists, { vertexList[v].wasVisited = true; // mark it displayVertex(v); // display it theStack.push(v); // push it } } // end while // stack is empty, so we're done for(int j=0; j<nVerts; j++) // reset flags vertexList[j].wasVisited = false; } // end dfs
12
-11- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen 4.2.2 BFS Breitensuche Benutzt eine queue und folgende Strategie Start: setze current auf x Regel 1: wenn möglich wähle einen noch nicht markierten Nachbar y von current, markiere ihn als besucht und theQueue.insert(y) Regel 2: wenn Regel 1 nicht angewendet werden kann, nimm falls möglich ein Element y aus der queue, current = y Regel 3: wenn Regel 2 nicht anwendbar ist => fertig
13
-12- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Beispiel am Applet Implementierung Wie DFS, aber Klasse queue an Stelle von stack bfs an Stelle von dfs
14
-13- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen public void bfs() // breadth-first search { // begin at vertex 0 vertexList[0].wasVisited = true; // mark it displayVertex(0); // display it theQueue.insert(0); // insert at tail int v2; while( !theQueue.isEmpty() ) // until queue empty, { int v1 = theQueue.remove(); // remove vertex at head
15
-14- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen while( (v2=getAdjUnvisitedVertex(v1)) != -1 ) { // get one, vertexList[v2].wasVisited = true; // mark it displayVertex(v2); // display it theQueue.insert(v2); // insert it } // end while } // end while(queue not empty) // queue is empty, so we're done for(int j=0; j<nVerts; j++) // reset flags vertexList[j].wasVisited = false; } // end bfs()
16
-15- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen 4.3 Minimum Spanning Trees MST (Gerüste) Anwendungsbeispiel: integrierter Schaltkreis Eliminierung „unnötiger“ Verbindungen Vermeidung von Hitzeproblemen Erleichtert Layout ...
17
-16- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen 4.3.1 MST für ungewichtete Graphen In Graphentheorie: Graph mit der Minimalanzahl von Kanten, um die Knoten miteinander zu verbinden Es gibt i.d.R. mehrere Lösungen Kantenanzahl ? Zusammenhang mit DFS, BFS?
18
-17- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen Lösung: Wie DFS oder BFS Die „durchlaufenen“ Kanten ausgeben I.d.R liefern DFS und BFS unterschiedliche (aber natürlich gleichwertige) Minimum Spanning Trees
19
-18- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen public void mst() // minimum spanning tree (depth first) { // start at 0 vertexList[0].wasVisited = true; // mark it theStack.push(0); // push it while( !theStack.isEmpty() ) // until stack empty { // get stack top int currentVertex = theStack.peek(); // get next unvisited neighbor int v = getAdjUnvisitedVertex(currentVertex);
20
-19- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen if(v == -1) // if no more neighbors theStack.pop(); // pop it away else // got a neighbor { vertexList[v].wasVisited = true; // mark it theStack.push(v); // push it // display edge displayVertex(currentVertex); // from currentV displayVertex(v); // to v System.out.print(" "); } } // end while(stack not empty) Danach noch „Saubermachen“.
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.