Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2010 Graphenalgorithmen • Minimale Spannbäume • Kürzeste Pfade 2 Minimale Spannbäume Beispielproblem • Stadt besteht aus Menge von Häusern und Strassen • Jede Strasse verbindet genau 2 Häuser • Kosten, um Strasse zwischen Haus u und v zu reparieren ist w(u,v) w(u v) • Ziel: repariere Strassen, so dass – Alle Häuser verbunden – Totale Reparaturkosten minimal 3 Minimale Spannbäume Modellierung als Graph • Ungerichteter Graph G=(V, E) • Kantengewichte w(u,v) ( ) für Kanten u,v in E • Finde Teilmenge T der Kanten so dass – T verbindet alle Knoten (T ist ein Spannbaum) P – Kosten w(T ) = (u,v)∈T w(u, v) werden minimiert • Spannbaum mit minimalen Kosten über alle Spannbäume ist minimaler Spannbaum (minimal spanning tree, MST) 4 Generischer Algorithmus • Konstruiere Teilmenge A von Kanten • Starte mit leerer Menge • Füge eine Kante nach der anderen in A ein • Invariante: A ist eine Teilmenge eines MST – Füge nur Kanten ein, die Invariante erhalten – Kante (u,v) heisst sicher, wenn A ∪ {(u, v)} auch Teilmenge eines MST – D.h., füge nur sichere Kanten hinzu 5 Generischer Algorithmus • IInitialisierung: iti li i L Leere M Menge erfüllt füllt IInvariante i t • Fortsetzung: g Da nur sichere Kanten hinzugefügt werden bleibt A Teilmenge eines MST • Terminierung: Alle Kanten, die zu A hinzugefügt wurden sind in MST. Bei Terminierung der d Schleife hl f ist A ein Spannbaum, der auch minimal ist. 6 Auffinden von sicheren Kanten Definitionen: S Teilmenge von V, A Teilmenge von E • Schnitt (S,V (S,V-S): S): eine Partitionierung der Knoten V in disjunkte Mengen S und V-S • Kante ((u,v) , ) in E kreuzt den Schnitt,, falls ein Knoten in S und der andere in V-S • Schnitt respektiert p Kantenmenge g A,, wenn keine Kante in A den Schnitt kreuzt • Kante ist eine leichte Kante,, wenn sie einen Schnitt kreuzt und das kleinste Gewicht aller Kanten hat, die den Schnitt kreuzen Theorem: Sei A Teilmenge eines MST, (S,V-S) Schnitt, der A respektiert, (u,v) leichte Kante, die (S,V-S) kreuzt Dann ist (u,v) kreuzt. (u v) sicher für A. A 7 Beweis • Sei T MST der A beinhaltet • Wenn (u,v) ( ) nicht in T, T zeige dass wir MST T´ mit (u,v) konstruieren können – T´ : Wähle eine Kante (x,y) in T, die S h itt k Schnitt kreuzt, t ersetze t mit it (u,v) ( ) – Weil (u,v) leichte Kante, w(u,v)< w (x,y) • T´ ist Spannbaum, Gewicht ist kleiner gleich T => T´ ist MST • (u,v) ist sicher für A, weil A vereinigt mit (u,v) in T T´ ist 8 Generischer Algorithmus Während Ablauf des Algorithmus gilt: • A ist Wald, Wald dessen ZusammenhangsZusammenhangs komponenten Bäume sind – Keine Zyklen in Zusammenhangskomponenten! – Bäume können aus einzelnen Knoten bestehen • Jede für A sichere Kante verbindet zwei Komponenten • Zu Beginn hat jeder Baum nur ein Knoten – Es hat |V| Bäume • In jedem Schritt wird Anzahl Bäume um eins reduziert – Zuletzt bleibt ein Baum übrig, der MST 9 Algorithmus von Kruskal • Folgt direkt Idee des generischen Algorithmus • Find in jjedem Schritt sichere Kante,, die dem Wald hinzugefügt werden kann – Wähl Wähle Kante K mit i kl kleinstem i G Gewicht, i h di die keinen Zyklus verursacht 10 Algorithmus von Kruskal 11 Algorithmus von Kruskal • Analyse (diese Operationen nicht besprochen in Vorlesung!) T t l O(E lg Total l E) 12 Algorithmus von Prim • Teilmenge von Kanten A des MST ist immer ein Baum • In jedem Schritt, finde leichte Kante, die Baum mit neuem Knoten verbindet • Verwende Prioritätswarteschlange, um leichte Kante zu finden – Prioritätswarteschlange enthält Knoten nicht erreichbar in A – Schlüssel ist Kante mit geringstem Gewicht zu einem Knoten erreichbar in A • Jeder Knoten v, der hinzugenommen wird, speichert seinen Vater (v) im Baum 13 Algorithmus von Prim • Starte mit beliebiger Wurzel r 14 Analyse • Mit binary heap als Prioritätswarteschlange • Initialisierung in erster for Schleife: O(V ( lg g V)) • Decrease key für Wurzel r: O(lg V) • while-Schleife: – |V| Aufrufe von Extract-Min => O(V lg V) – <=|V| | | Aufrufe von Decrease-Keyy => O(E ( lgg V)) • Total O(E lg V) 15 Graphenalgorithmen • Minimale Spannbäume • Kürzeste Pfade 16 Kürzeste Pfade • Intuitiv: Finde kürzesten Pfad zwischen zwei Punkten auf einer Karte • Eingabe: gerichteter Graph mit Kantengewichten – Verallgemeinerung von Breitensuche auf gewichtete Bäume • Gewicht eines Pfades pp=<v <v0,vv1,...,vvk> = Summe der Kantengewichte = Pk ( i−1 , vi ) i=1 w(v • Gewicht des kürzesten Pfades 17 Kürzeste Pfade Varianten • Einziger g Startknoten (single-source) ( g ) – Alle kürzesten Pfade von einem Startknoten zu allen anderen Knoten • Einziger Ei ig Zi Zielknoten lk t ((single-destination) i gl d ti ti ) – Alle kürzesten Pfade von allen Startknoten zu einem Zielknoten – Drehe Richtung aller Kanten => single-source Problem • Festes Knotenpaar (single-pair) – Kürzester Pfad zwischen zwei Knoten – Kein asymptotsich schnellerer Algorithmus bekannt als für single source single-source • Alle Paare (all-pairs) – Naiv: löse single single-source source für alle Startknoten – Geht besser, Kapitel 25 im Buch 18 Negative Kantengewichte • Ok, falls keine Zyklen mit negativem Gewicht erreichbar von Startknoten Gewicht, – Könnten unendlich lang im Kreis gehen um Gewicht zu reduzieren e Problem oble falls alls Zyklus y lus vo vom Sta Startknoten t ote – Kein nicht erreichbar 19 Zyklen • Annahme: finde kürzeste Pfade ohne Zyklen • Zyklen kl mit negativem Gewicht h – Nicht erlaubt in Eingabe • Zyklen mit positivem Gewicht – Vermeidung von Zyklen führt zu kürzerem Pfad – Kommen nicht vor in Lösung • Zyklen mit Gewicht 0 – Führt Füh t zu nicht-eindeutiger i ht i d ti Lö Lösung – Annahme: finde Lösung ohne Zyklen mit Gewicht 0 20 Optimale Teilstruktur Lemma: Jeder Teilpfad eine kürzesten Pfades ist ein kürzester Pfad Beweis: Durch Widerspruch • Pfad p sei kürzester Pfad von u nach v • • • • Länge g Annahme: existiere kürzerer Pfad Also Neuer Pfad p´ • Nun • Widerspruch, p war kein kürzester Pfad! 21 Kürzeste Pfade, ein Startknoten Ausgabe: für jeden Knoten • Länge des kürzesten Pfades – Nach Initialisierung – Wird während des Algorithmus reduziert – ist Schätzung des kürzesten Pfades • Vorgängerknoten auf kürzestem Pfad • Nach Initialisierung • Aus wird Vorgängerteilgraph abgeleitet bildet Baum kürzester Pfade abgeleitet, 22 Generischer Algorithmus • Initialisierung • Relaxation • Unterschiede konkreter Algorithmen – Reihenfolge der Relaxationen – Anzahl Relaxationen auf jeder Kante 23 Eigenschaften kürzester Pfade • Dreiecksungleichung – Für alle Kanten (u,v) gilt • Eigenschaft der oberen Schranke – Für alle Knoten ist stets – Sobald bleibt d[v] konstant • Kein-Pfad-Eigenschaft Kein Pfad Eigenschaft – Wenn es keinen Pfad von s nach v gibt, d.h., d dann iistt stets t t 24 Eigenschaften kürzester Pfade • Konvergenzeigenschaft – Falls kürzester Pfad dann ist nach Relax(u,v,w) und , • Pfadrelaxationseigenschaft – W Wenn p=<v0,v1,...vk> kürzester kü t Pf Pfad d von s=v0 nach vk, und Kanten in Reihenfolge (v0,v1), ( 1,v2),...,(v (v ) ( k-1,vk) relaxiert l i t werden, d d dann gilt ilt – Ungeachtet anderer Relaxationsschritte 25 Bellman-Ford-Algorithmus • Negative Kantengewichte erlaubt • Gibt FALSE zurück falls negative Zyklen • Laufzeit Θ(V E) 26 Kürzeste Pfade in DAGs • Kanten mit negativem Gewicht erlaubt • Keine negativen Zyklen möglich • Laufzeit Θ(V + E) 27 Dijkstra-Algorithmus • Keine negativen Kantengewichte erlaubt • Modifikation von Breitensuche – Prioritätswarteschlange statt FIFO – Schlüssel sind kürzeste Pfad Schätzungen • Knoten aufgeteilt in zwei Teilmengen • S = endgültiger kürzester kür ester Pfad bestimmt • Q = Prioritätswarteschlange = V - S 28 Dijkstra-Algorithmus • Ähnlich wie Algorithmus von Prim, aber Schlüssel sind Schätzung des kürzesten Pfades • Greedy Algorithmus • Analyse: mit binärem Heap O(E lg l V) 29 Nächstes Mal • Noch mehr Graphenalgorithmen 30