3 Die Datenstruktur Graph 3 2 Reprsentation von

  • Slides: 29
Download presentation
3. Die Datenstruktur Graph 3. 2 Repräsentation von Graphen Für die Darstellung eines Graphen

3. Die Datenstruktur Graph 3. 2 Repräsentation von Graphen Für die Darstellung eines Graphen eignet sich die sogenannte Adjazenzmatrix. Dabei handelt es sich um eine Tabelle, in der die Zeilen- und Spaltenüberschriften die Knotenbezeichner sind. In eine Zelle wird eine 1 eingetragen, wenn es zwischen den zugehörigen Knoten eine Kante gibt. Informatik 11 - 3. Die Datenstruktur Graph – 3. 2 Repräsentation von Graphen

Beispiel 1: Graph Adjazenzmatrix v 1 v 2 1 v 3 1 v 4

Beispiel 1: Graph Adjazenzmatrix v 1 v 2 1 v 3 1 v 4 1 v 5 v 2 v 3 v 4 1 1 1 v 5 v 6 1 1 1 v 6 1 In eine Zelle wird eine 1 eingetragen, wenn es zwischen den zugehörigen Knoten eine Kante gibt. Die Adjazenzmatrix ist symmetrisch zur Hauptdiagonalen. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Beispiel 2: Graph Adjazenzmatrix v 1 v 2 v 3 v 4 1 1

Beispiel 2: Graph Adjazenzmatrix v 1 v 2 v 3 v 4 1 1 1 v 5 v 6 v 2 v 3 v 4 v 5 1 1 v 6 1 Bei einem gerichteten Graphen muss die Adjazenzmatrix nicht mehr symmetrisch zur Hauptdiagonalen sein. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Beispiel 3: Graph Adjazenzmatrix v 1 v 2 v 3 v 4 10 20

Beispiel 3: Graph Adjazenzmatrix v 1 v 2 v 3 v 4 10 20 10 v 2 10 v 3 20 20 v 4 10 10 v 5 v 6 10 30 10 v 6 Bei einem gewichteten Graphen trägt man die Kantenwerte ein. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen 40 30 40

Implementierung einer Matrix in Java: Beispiel: (keine Adjazenzmatrix!) mat[0] = Feld mit 3 Elementen

Implementierung einer Matrix in Java: Beispiel: (keine Adjazenzmatrix!) mat[0] = Feld mit 3 Elementen 1 2 3 4 5 6 mat[1] = Feld mit 3 Elementen int[][] mat; public Matrix(){ mat = new int [zeilen] [spalten]; Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Implementierung einer Matrix in Java: 1 2 3 4 5 6 public class Matrix{

Implementierung einer Matrix in Java: 1 2 3 4 5 6 public class Matrix{ int zeilen = 2; int spalten = 3; int[][] mat; public Matrix(){ mat = new int [zeilen] [spalten]; mat[0][0] = 1; mat[0][1] = 2; mat[0][2] = 3; mat[1][0] = 4; mat[1][1] = 5; mat[1][2] = 6; } } Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Ausgabe der Matrix mit verschachtelten Schleifen: 1 2 3 4 5 6 public void

Ausgabe der Matrix mit verschachtelten Schleifen: 1 2 3 4 5 6 public void ausgabe(){ for(int i = 0; i< zeilen; i++){ for(int j = 0; i<spalten; j++){ System. out. print( "mat[" + i + "] [" + j + "] = " + mat[i][j]+" } System. out. println(); } Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen ");

Übung 1 – Matrizen in Java Übertrage das Beispiel für eine Matrix mit der

Übung 1 – Matrizen in Java Übertrage das Beispiel für eine Matrix mit der Methode zur Ausgabe in ein Blue. J Projekt. Teste und untersuche auch das Blue. J Projekt Matrix. Scanner im Ordner Lösungen. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Modellieren eines Graphen: Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Modellieren eines Graphen: Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Die Klasse GRAPH_MATRIX verwaltet die Knoten und Kanten und stellt eine Methode zur formatierten

Die Klasse GRAPH_MATRIX verwaltet die Knoten und Kanten und stellt eine Methode zur formatierten Ausgabe der Matrix bereit. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

 Verwalten von Knoten und Kanten: A B C D A 0 5 8

Verwalten von Knoten und Kanten: A B C D A 0 5 8 3 B 5 0 -1 5 C 8 -1 0 -1 D 3 5 -1 0 Knotenfeld: knoten[0] Bezeichner "A" Knotennummer 0; knoten[1] Bezeichner "B" Knotennummer 1; Matrix: 0 für die Elemente der Hauptdiagonale; -1 steht für eine nicht vorhandene Kante, diese Zelle bleibt bei der Ausgabe leer. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

 Einfügen eines neuen Knotens : A B C D E A 0 5

Einfügen eines neuen Knotens : A B C D E A 0 5 8 3 -1 B 5 0 -1 5 -1 C 8 -1 0 -1 -1 D 3 5 -1 0 -1 E -1 -1 0 Knotenfeld ergänzen, vorausgesetzt, der Knoten ist noch nicht vorhanden und die maximale Anzahl ist nicht überschritten. Matrix: 0 und -1 in der neuen Spalte und der neuen Zeile ergänzen. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

 Einfügen einer neuen Kante : A B C D E A 0 5

Einfügen einer neuen Kante : A B C D E A 0 5 8 3 -1 B 5 0 -1 5 9 C 8 -1 0 -1 -1 D 3 5 -1 0 -1 E -1 9 -1 -1 0 Matrix: Gewichtung eintragen Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Übung 2 – Implementieren einer Matrix für einen Graphen Vorlage: Graph_Matrix_Vorlage In der Vorlage

Übung 2 – Implementieren einer Matrix für einen Graphen Vorlage: Graph_Matrix_Vorlage In der Vorlage ist bereits eine Methode zur formatierten Ausgabe implementiert. Ergänze das Projekt um die benötigten Attribute und um die fehlenden Methoden Knoten. Einfuegen und Kante. Einfuegen. Eine kurze Hilfestellung findest auf der folgenden Seite. Im Quelltext sind in den Kommentaren ebenfalls Erläuterungen notiert. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Übung 2 – Implementieren einer Matrix für einen Graphen Vorlage: Graph_Matrix_Vorlage Klasse GRAPH_MATRIX void

Übung 2 – Implementieren einer Matrix für einen Graphen Vorlage: Graph_Matrix_Vorlage Klasse GRAPH_MATRIX void Knoten. Einfuegen(String bezeichner) Wenn die maximale Anzahl an Knoten erreicht wird oder Knoten bereits eingefügt ist, erfolgt kein Einfügen. Ob der Knoten bereits eingefügt ist, findet man mit der Methode Knoten. Nummer(bezeichner) heraus. In der Matrix soll an der Position der Diagonalen eine 0 stehen. An den übrigen Plätzen (d. h. in der Spalte und in der Zeile des neuen Knotens) bis zu dieser Position wird mithilfe einer geeigneten Schleife in die Matrix jeweils eine -1 eingefügt, die in der Methode Ausgabe() die Ausgabe einer Leerstelle bewirkt. Klasse GRAPH_MATRIX void Kante. Einfuegen(String von, String nach, int gewichtung) In der Methode legt man zwei int-Attribute von. Nummer und nach. Nummer fest, denen die Knotennummern der Knoten von und nach zugeordnet werden. Falls diese Knoten in der Knotenliste auftauchen (d. h. die Knotennummer ist nicht -1) und nicht identisch sind, ergänzt man in der Matrix die beiden Einträge. Ausführliche Hinweise findest du auf den nächsten Seiten und im Buch auf den Seiten 103 -105. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Knoten und Kanten einfügen – detaillierte Beschreibung Graph Knotenliste A B C D E

Knoten und Kanten einfügen – detaillierte Beschreibung Graph Knotenliste A B C D E A 0 1 1 1 -1 B 1 0 1 -1 -1 C 1 1 0 -1 1 D 1 -1 -1 0 1 E -1 -1 1 1 0 Adjazenzmatrix Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Knoten E in die Knotenliste einfügen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Knoten E in die Knotenliste einfügen Jeder Knoten hat eine Knotennummer, die mit dem Arrayindex identisch ist. Noch nicht vorhandene Knoten erhalten die Nummer -1 A B C D 0 1 2 3 public int Knoten. Nummer(String bezeichner) { int ergeb =-1; for (int i=0; (i < anzahl. Knoten) && (ergeb == -1); i++){ if (knoten[i]. Bezeichnung. Geben(). equals(bezeichner)) { ergeb = i; } } return ergeb; } Der Aufruf Knoten. Nummer(“E“) liefert den Wert -1 zurück. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Knoten E in die Knotenliste einfügen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Knoten E in die Knotenliste einfügen Der Knoten wird dem Feld zugefügt und die Einträge in der Matrix werden ergänzt. A B C D E 0 1 2 3 4 A B C D E A 0 1 1 1 -1 B 1 0 1 -1 -1 C 1 1 0 -1 -1 D 1 -1 -1 0 -1 E -1 -1 0 anzahl. Knoten hat vor dem Einfügen von E den Wert 4. Also kann E so eingefügt werden: knoten[anzahl. Knoten] = new KNOTEN(bezeichner); Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Knoten E in die Knotenliste einfügen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Knoten E in die Knotenliste einfügen Der Knoten wird dem Feld zugefügt und die Einträge in der Matrix werden ergänzt. A B C D E 0 1 2 3 4 A B C D E A 0 1 1 1 -1 B 1 0 1 -1 -1 C 1 1 0 -1 -1 D 1 -1 -1 0 -1 E -1 -1 0 public void Knoten. Einfuegen(String bezeichner) { if ((anzahl. Knoten < knoten. length) && (Knoten. Nummer(bezeichner) == -1)) { knoten[anzahl. Knoten] = new KNOTEN(bezeichner); matrix[anzahl. Knoten] = 0; for (int i=0; i<anzahl. Knoten; i++) { matrix[anzahl. Knoten][i] = -1; matrix[i][anzahl. Knoten] = -1; } anzahl. Knoten = anzahl. Knoten + 1; } } Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Kante DE in die Matrix einfügen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Kante DE in die Matrix einfügen Adjazenzmatrix vorher: A B C D E A 0 1 1 1 -1 B 1 0 1 -1 -1 C 1 1 0 -1 1 D 1 -1 -1 0 -1 E -1 -1 0 Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Kante DE in die Matrix einfügen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Kante DE in die Matrix einfügen Adjazenzmatrix nachher: A B C D E A 0 1 1 1 -1 B 1 0 1 -1 -1 C 1 1 0 -1 1 D 1 -1 -1 0 1 E -1 -1 1 1 0 Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Kante DE in die Matrix einfügen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Kante DE in die Matrix einfügen A B C D E 0 1 2 3 4 Knotennummern von D und E ermitteln: int von. Nummer, nach. Nummer; von. Nummer = Knoten. Nummer(von); nach. Nummer = Knoten. Nummer(nach); public int Knoten. Nummer(String bezeichner) { int ergeb =-1; for (int i=0; (i < anzahl. Knoten) && (ergeb == -1); i++){ if (knoten[i]. Bezeichnung. Geben(). equals(bezeichner)) { ergeb = i; } } return ergeb; } Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Kante DE in die Matrix einfügen

Knoten und Kanten einfügen – detaillierte Beschreibung Beispiel: Kante DE in die Matrix einfügen A B C D E A 0 1 1 1 -1 B 1 0 1 -1 -1 C 1 1 0 -1 1 D 1 -1 -1 0 1 E -1 -1 1 1 0 Einträge in der Matrix ergänzen: public void Kante. Einfuegen(String von, String nach, int gewichtung) { int von. Nummer, nach. Nummer; von. Nummer = Knoten. Nummer(von); nach. Nummer = Knoten. Nummer(nach); if ((von. Nummer!=-1) && (nach. Nummer!=-1) && (von. Nummer!=nach. Nummer)) { matrix[von. Nummer][nach. Nummer] = gewichtung; matrix[nach. Nummer][von. Nummer] = gewichtung; } } Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Übung 3 – Beispiele für Graphen Graph_Matrix_Beispiele (im Ordner Lösungen) Teste die Methoden für

Übung 3 – Beispiele für Graphen Graph_Matrix_Beispiele (im Ordner Lösungen) Teste die Methoden für die gegebenen Beispielgraphen. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Modellierung und Implementierung mit Listen Gibt es in einem Graphen viele Knoten aber wenig

Modellierung und Implementierung mit Listen Gibt es in einem Graphen viele Knoten aber wenig Kanten, so hat die Adjazenzmatrix wenig Einträge. Man spricht in diesem Fall von einem dünnen Graphen. Beispiel: v 1 v 2 1 v 3 1 v 4 1 v 5 v 6 v 2 v 3 v 4 1 1 1 v 5 v 6 1 1 1 Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Modellierung und Implementierung mit Listen In diesem Fall bietet es sich an, die Knoten

Modellierung und Implementierung mit Listen In diesem Fall bietet es sich an, die Knoten und Kanten in einfach verketteten Listen zu verwalten: Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Übung 4 (Vertiefung) – Implementierung mithilfe der Javaklasse Vector Ergänze in der Vorlage Graph_Liste_Vector_0

Übung 4 (Vertiefung) – Implementierung mithilfe der Javaklasse Vector Ergänze in der Vorlage Graph_Liste_Vector_0 den fehlenden Quelltext. Die Listen werden mit der Javaklasse Vector implementiert. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Übung 4 (Vertiefung) – Implementierung mithilfe der Javaklasse Vector Ausgabe des erzeugten Graphen: A:

Übung 4 (Vertiefung) – Implementierung mithilfe der Javaklasse Vector Ausgabe des erzeugten Graphen: A: M, 64; UL, 59; F: KA, 127; WÜ, 131; FD: WÜ, 98; HO: WÜ, 192; N, 116; R, 166; KA: F, 127; S, 53; LI: UL, 126; M: A, 64; N, 163; R, 117; RO, 60; N: WÜ, 104; R, 80; HO, 116; M, 163; PA: R, 72; R: N, 80; PA, 72; HO, 166; M, 117; RO: M, 60; S: UL, 103; KA, 53; WÜ, 155; UL: A, 59; WÜ, 165; LI, 126; S, 103; WÜ: F, 131; N, 104; HO, 192; FD, 98; UL, 165; S, 155; Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen

Übung 5 (Vertiefung) – Implementierung ohne die Javaklasse Vector Ergänze in der Vorlage Graph_Liste_0

Übung 5 (Vertiefung) – Implementierung ohne die Javaklasse Vector Ergänze in der Vorlage Graph_Liste_0 den fehlenden Quelltext. Die Listen werden ohne Verwendung einer Javaklasse implementiert. Informatik 11 3. Datenstruktur Graph 3. 2 Repräsentation von Graphen