Vorlesung Informatik 2 Algorithmen und Datenstrukturen (20 – Graphen)

Slides:



Advertisements
Ähnliche Präsentationen
8. Termin Teil B: Wiederholung Begriffe Baum
Advertisements

Eine dynamische Menge, die diese Operationen unterstützt,
Minimum Spanning Tree: MST
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26-Graphenalgorithmen: Wiederholung und Übung) Prof. Th. Ottmann.
Kapitel 9: Graphdurchlauf
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Claudio Moraga; Gisbert Dittrich
Graphen Ein Graph ist eine Kollektion von Knoten und Kanten. Knoten sind einfache Objekte. Sie haben Namen und können Träger von Werten, Eigenschaften.
Kapitel 6: Klassifizierung von Sortiertechniken
7. Natürliche Binärbäume
R. Der - Vorlesung Algorithmen und Datenstrukturen (Magister)
Manfred Thaller, Universität zu Köln Köln 22. Januar 2009
Gliederung Motivation / Grundlagen Sortierverfahren
Programmieren 2 Future Car Projekt Praktikum 6 - Graphen
Programmieren 2 Future Car Projekt Praktikum 6
Programmieren 2 Future Car Projekt Praktikum 6
FB Informatik Prof. Dr. R.Nitsch Programmieren 2 Future Car Projekt Praktikum 6 - Graphen Reiner Nitsch - Speichern von Graphen -
Baumstrukturen Richard Göbel.
Algorithmentheorie 04 –Hashing
WS Algorithmentheorie 13 - Kürzeste (billigste) Wege Prof. Dr. Th. Ottmann.
WS Algorithmentheorie 05 - Treaps Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26 - Graphen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (19 - Analyse natürlicher Bäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen Halbzeit: Was haben wir bisher gelernt? Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (17 – Bäume: Grundlagen und natürliche Suchbäume) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (18 - Bäume: Durchlaufreihenfolgen, Analyse nat. Bäume) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (22 - Graphen)
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
Union-Find-Strukturen
Algorithmen und Datenstrukturen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Klausur „Diskrete Mathematik II“
Minimum Spanning Tree: MST
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Vortrag über Graphen Von Jörg Hendricks.
2. Die rekursive Datenstruktur Baum 2
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Effiziente Algorithmen
Effiziente Algorithmen
Diskrete Mathematik II
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Animation von Dijkstra
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Institut für Theoretische Informatik
Graphen und Bäume.
Kapitel 8: Graphalgorithmen 8. 1 Grundlagen 8
Kapitel 8: Graphalgorithmen 8. 1 Grundlagen 8
Informatik Datenstruktur Graph 3.3 Durchlaufen von Graphen
Analyse der Laufzeit von Algorithmen
10 Graphen gerichtete und ungerichtete, mit Marken an Ecken und/oder Kanten Anwendungsgebiete: Verkehrsnetze, Kommunikationsnetze, Netzpläne, Spiele,...
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung Datenstrukturen für den Algorithmus von.
Binärbäume.
Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
3. Die Datenstruktur Graph 3.3 Durchlaufen von Graphen
3. Die Datenstruktur Graph 3.2 Repräsentation von Graphen
 Präsentation transkript:

Vorlesung Informatik 2 Algorithmen und Datenstrukturen (20 – Graphen) T. Lauer

Motivation Wie komme ich am besten von Freiburg nach Ulm? Was ist die kürzeste Rundreise durch eine gegebene Menge von Städten? Welche Menge an Wasser kann die Kanalisation von Freiburg maximal verkraften? Gibt es einen Rundweg über die Brücken von Königsberg (Kaliningrad), derart dass jede Brücke nur einmal überquert wird und man zum Ausgangspunkt zurückgelangt?  Diese und viele andere Probleme lassen sich als Graphenprobleme definieren.

Repräsentation von Problemen durch Graphen Das Königsberger Brückenproblem: Ein Planungsproblem: Putz anbringen Garten anlegen Wände mauern Einziehen Dachstuhl herstellen Dach decken Innenausbau fertig stellen Möblieren 3

Definition von Graphen Definition: Ein gerichteter Graph G = (V,E) (englisch: digraph) besteht aus einer Menge V = {1, 2, . . . , |V|} von Knoten (englisch: vertices) und einer Menge E  V  V von Pfeilen oder Kanten (englisch: edges, arcs). Ein Paar (v, v´)  E heißt Pfeil oder Kante von v nach v´. Darstellung: Knoten werden durch Punkte dargestellt und Kanten bzw. Pfeile werden durch Verbindungslinien mit Pfeilspitze auf den Endknoten dargestellt. Einschränkung: Endliche Graphen, d.h. V  

Adjazenzmatrizen ì Ï ( i , j ) E ; a = í î 1 ( i , j ) Î E ; Adjazenzmatrizen dienen der Speicherung von Graphen. Ein Graph G = (V,E) wird in einer Booleschen |V | x |V |-Matrix AG = (aij), mit 1 i |V |, 1 j |V | gespeichert, wobei class graph { graph(int n){ this.numberOfNodes = n; this.a = new boolean[n][n]; } private int numberOfNodes; private boolean[][] a; } ì Ï falls ( i , j ) E ; a = í ij î 1 falls ( i , j ) Î E ;

Beispiel einer Adjazenzmatrix 1 2 3 4 5 6 7 8 9 1 0 1 1 0 0 0 1 0 0 2 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 1 0 0 0 5 0 0 0 1 0 0 0 0 0 6 1 0 0 0 1 1 0 0 0 7 0 0 0 0 1 0 0 0 0 8 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 1 0 3 8 2 1 7 9 6 5 4

Eigenschaften von Adjazenzmatrizen Bei der Speicherung eines Graphen mit Knotenmenge V in einer Adjazenzmatrix ergibt sich ein Speicherbedarf von Θ(|V |2). Dieser Speicherbedarf ist nicht abhängig von der Anzahl der Kanten im Graphen. Demnach sind Adjazenzmatrizen ungünstig, wenn der Graph vergleichsweise wenige Kanten enthält. Wegen der erforderlichen Initialisierung der Matrix oder der Berücksichtigung aller Einträge der Matrix benötigen die meisten Algorithmen Ω(|V |2) Rechenschritte.

Adjazenzlisten Bei Adjazenzlisten wird für jeden Knoten eine lineare, verkettete Liste der von diesem Knoten ausgehenden Kanten gespeichert. Die Knoten werden als lineares Feld von |V | Anfangszeigern auf je eine solche Liste verwaltet. Die i-te Liste enthält ein Listenelement mit Eintrag j für jeden Endknoten eines Pfeils (i, j)  E. Adjazenzlisten unterstützen viele Operationen, z.B. das Verfolgen von Pfeilen in Graphen, sehr gut. Andere Operationen dagegen werden nur schlecht unterstützt, insbesondere das Hinzufügen und Entfernen von Knoten.

Ein Beispiel 1 2 3 4 5 6 7 8 9 3 6 4 6 5 8 7 5 2 1

Implementierung von Adjazenzlisten class graphAL { graphAL(int n) { this.numberOfNodes = n; this.edgeTo = new edge[n]; } private int numberOfNodes; private edge[] edgeTo; } class edge { edge(int node, edge next) { this.node = node; this.next = next; } int node; edge next; }

Doppelt verkettete Kantenliste Die bei Adjazenzlisten fehlende Dynamik kann erreicht werden, indem man die Knoten in einer doppelt verketteten Liste speichert, anstatt sie in einem Feld fester Größe zu verwalten. Jedes Listenelement dieser Liste enthält drei Verweise, zwei davon auf benachbarte Listenelemente und einen auf eine Kantenliste, wie bei Adjazenzlisten. Jede Kantenliste ist doppelt verkettet; statt einer Knotennummer besitzt jedes Kantenlistenelement einen Verweis auf ein Element der Knotenliste.

Doppelt verkettete Kantenliste am Beispiel 1 2 3 4 5 6 7 8 9

Durchlaufen von Graphen Für manche Probleme ist es wichtig, Graphen vollständig zu traversieren, d.h. alle Knoten eines Graphen zu betrachten. Fasst man die Web-Seiten im Internet als Knoten und die Links auf diesen Seiten als Kanten auf, so muss man beim Suchen nach einem bestimmten Schlüsselwort alle Knoten dieses Web-Seiten-Graphen inspizieren. Das Betrachten oder Inspizieren eines Knotens in einem Graphen nennt man auch oft Besuchen des Knotens. Manchmal ist es wichtig die Knoten nach einer gewissen Systematik zu besuchen. Wir werden im Folgenden die Tiefensuche und die Breitensuche als zwei Spezialfälle eines allgemeinen Knotenbesuchsalgorithmus kennen lernen.

Besuchen aller Knoten eines Graphen G = (V,E) Spezialfall: Binärbäume Dafür sind verschiedene Traversierungsreihenfolgen wohl definiert. Beispielsweise Preorder: WLR Tiefensuche: besuche die Söhne eines jeden Knotens vor seinen Brüdern Breitensuche: besuche die Brüder eines Knotens vor seinen Söhnen

Ein allgemeines Schema für das Traversieren Im Gegensatz zu Bäumen kann es bei Graphen Zyklen geben. Deswegen kann es beim Traversieren passieren, dass wir bei einem schon einmal besuchten Knoten ankommen. Aus diesem Grund müssen wir uns die bereits besuchten Knoten in einer Tabelle merken, um Endlosschleifen zu vermeiden. Da jeder Knoten mehrere Nachfolger haben kann, müssen wir darüber hinaus eine Datenstruktur verwenden, in der wie die noch zu besuchenden Knoten ablegen.

Tiefendurchlauf: DFS rekursiv Rekursive Formulierung des Tiefendurchlaufs: DFS(v): Markiere v als „besucht“ und füge v zu B hinzu; for each (jede von v ausgehende Kante (v, v‘)) do: if v‘ ist nicht „besucht“ then DFS(v‘)

Tiefendurchlauf: DFS mit Stapel Formulierung des Tiefendurchlaufs mit Hilfe eines Stapels S: DFS(s): Initialisiere S als Stapel mit einzigem Element s; while S ≠  do {Nehme oberstes Element u von S herunter; if besucht(u) = false then { setze besucht(u) = true; for each Kante (u, v), die von u ausgeht do stapele v auf S } } /* end while

Beispiel 1 2 3 4 6 8 5 7

Breitendurchlauf: BFS mit Schlange Q BFS(s): Setze besucht(s) = true und für alle anderen Knoten v setze besucht(v) = false; Setze Q = {s}; while Q ≠  do { entferne erstes Element u von Q; betrachte jede von u ausgehende Kante (u, v): if besucht(v) = false then setze besucht(v) = true; füge v am Ende von Q ein } */ end while

Beispiel 1 2 3 4 6 8 5 7

Allgemeiner Knotenbesuchsalgorithmus für einen Graphen G = (V,E) Sei b erster besuchter Knoten B = {b} markiere alle Knoten in V als unbesucht 2. while es gibt noch eine unbesuchte Kante (v, v´)  E mit v  B do wähle Kante (v, v´) und markiere sie als besucht B = B  {v´} endwhile

Verbesserung: Verwende Rand Rand: Grenze zwischen besuchten und unbesuchten Knoten B = {b}; R = {b} 2. while R   do wähle v  R if es gibt keine unbesuchte Kante (v, v´)  E then R = R \ {v} else { wähle unbesuchte Kante (v, v´)  E; if v´ B then B = B  {v´}; R = R  {v´} endif } endif endwhile

Konkrete Traversierungsverfahren Die Reihenfolge, in der die Knoten ausgegeben werden, hängt offensichtlich von der Datenstruktur für den Rand ab, d. h. der Art, wie die Knoten darin abgelegt werden. Verwendet man für die Knotenliste einen Stack, so ergibt sich ein Tiefendurchlauf durch den Graphen. Verwendet man hingegen eine Queue, so entspricht das Verhalten einem Breitendurchlauf.

Beispiel 1 2 3 4 5 4 4 3 4 5 1 5 3 1 2 3 5

Breiten und Tiefendurchlauf Durchlauf ab Knoten 1 mit Stack (Ausgabe: 1  4  5  3): Durchlauf ab Knoten 1 mit Queue (Ausgabe: 1  4  3  5): 5 4 4 3 4 1 1 1 1 1 1 1 5 5 5 5 3 3 3 3 4 4 4 4 1 1 1 1