Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW.

Ähnliche Präsentationen


Präsentation zum Thema: "Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW."—  Präsentation transkript:

1

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 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

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

12 -11- Prof. Dr. R. Güttler Programmiersprachen 2 Kapitel 3: Folge Datenstrukturen 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

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 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“.


Herunterladen ppt "Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW."

Ähnliche Präsentationen


Google-Anzeigen