1 / 25

Vorlesung Informatik 2 Algorithmen und Datenstrukturen (20 – Graphen)

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?

Download Presentation

Vorlesung Informatik 2 Algorithmen und Datenstrukturen (20 – Graphen)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

  4. Definition von Graphen Definition: Ein gerichteter Graph G = (V,E) (englisch: digraph) besteht auseiner Menge V = {1, 2, . . . , |V|} von Knoten (englisch: vertices) und einerMenge E V  Vvon Pfeilenoder Kanten(englisch: edges, arcs). EinPaar (v, v´)  Eheißt Pfeil oder Kante von vnach v´. Darstellung: • Knoten werden durch Punkte dargestellt und • Kanten bzw. Pfeile werden durch Verbindungslinien mit Pfeilspitze aufden Endknoten dargestellt. Einschränkung: Endliche Graphen, d.h. V  

  5. Adjazenzmatrizen • Adjazenzmatrizen dienen der Speicherung von Graphen. • Ein Graph G = (V,E) wird in einer Booleschen |V | x |V |-MatrixAG = (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;} Ï ; ì 0 ( i , j ) E falls = a í Î ij ; 1 ( i , j ) E falls î

  6. Beispiel einer Adjazenzmatrix 1 2 3 4 5 6 7 8 91 0 1 1 0 0 0 1 0 02 0 0 0 0 0 0 0 0 03 0 0 0 0 0 0 0 0 04 0 0 0 0 0 1 0 0 05 0 0 0 1 0 0 0 0 06 1 0 0 0 1 1 0 0 07 0 0 0 0 1 0 0 0 08 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 1 0 3 8 1 2 7 9 6 5 4

  7. Eigenschaften von Adjazenzmatrizen • Bei der Speicherung eines Graphen mit Knotenmenge V in einerAdjazenzmatrix ergibt sich ein Speicherbedarf von Θ(|V |2). • Dieser Speicherbedarf ist nicht abhängig von der Anzahl der Kantenim Graphen. • Demnach sind Adjazenzmatrizen ungünstig, wenn der Graphvergleichsweise wenige Kanten enthält. • Wegen der erforderlichen Initialisierung der Matrix oder derBerücksichtigung aller Einträge der Matrix benötigen die meistenAlgorithmen Ω(|V |2) Rechenschritte.

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

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

  10. 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;}

  11. Doppelt verkettete Kantenliste • Die bei Adjazenzlisten fehlende Dynamik kann erreicht werden, indemman die Knoten in einer doppelt verketteten Liste speichert, anstattsie in einem Feld fester Größe zu verwalten. • Jedes Listenelement dieser Liste enthält drei Verweise, zwei davonauf benachbarte Listenelemente und einen auf eine Kantenliste, wiebei Adjazenzlisten. • Jede Kantenliste ist doppelt verkettet; statt einer Knotennummerbesitzt jedes Kantenlistenelement einen Verweis auf ein Element derKnotenliste.

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

  13. Durchlaufen von Graphen • Für manche Probleme ist es wichtig, Graphen vollständig zutraversieren, d.h. alle Knoten eines Graphen zu betrachten. • Fasst man die Web-Seiten im Internet als Knoten und die Links aufdiesen Seiten als Kanten auf, so muss man beim Suchen nach einembestimmten Schlüsselwort alle Knoten dieses Web-Seiten-Grapheninspizieren. • Das Betrachten oder Inspizieren eines Knotens in einem Graphen nenntman auch oft Besuchendes Knotens. • Manchmal ist es wichtig die Knoten nach einer gewissen Systematikzu besuchen. • Wir werden im Folgenden die Tiefensuche und die Breitensuchealszwei Spezialfälle eines allgemeinen Knotenbesuchsalgorithmuskennen lernen.

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

  15. 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 einemschon einmal besuchten Knoten ankommen. • Aus diesem Grund müssen wir uns die bereits besuchten Knoten ineiner Tabelle merken, um Endlosschleifen zu vermeiden. • Da jeder Knoten mehrere Nachfolger haben kann, müssen wir darüberhinaus eine Datenstruktur verwenden, in der wie die noch zubesuchenden Knoten ablegen.

  16. 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: ifv‘ ist nicht „besucht“ then DFS(v‘)

  17. Tiefendurchlauf: DFS mit Stapel Formulierung des Tiefendurchlaufs mit Hilfe eines Stapels S: DFS(s): Initialisiere S als Stapel mit einzigem Element s; whileS≠  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

  18. Beispiel 1 2 3 4 6 8 5 7

  19. 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}; whileQ≠  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

  20. Beispiel 1 2 3 4 6 8 5 7

  21. 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  Bdo wähle Kante (v, v´) und markiere sie als besucht B = B  {v´} endwhile

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

  23. Konkrete Traversierungsverfahren • Die Reihenfolge, in der die Knoten ausgegeben werden, hängtoffensichtlich von der Datenstruktur für den Rand ab, d. h. der Art, wie dieKnoten darin abgelegt werden. • Verwendet man für die Knotenliste einen Stack, so ergibt sich einTiefendurchlauf durch den Graphen. • Verwendet man hingegen eine Queue, so entspricht das Verhalten einemBreitendurchlauf.

  24. Beispiel 1 2 3 4 5 4 3 1 4 5 4 5 3 1 2 3 5

  25. 1 1 4 4 3 5 1 1 5 5 5 5 4 3 4 3 1 1 4 1 3 3 1 4 1 4 1 1 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):

More Related