Kapitel 4: Minimal spannende Bäume Gliederung der Vorlesung 1. 2. 3. 4. 5. 6. 7. 8. 4/2, Folie 1 Fallstudie Bipartite Graphen Grundbegriffe Elementare Graphalgorithmen und Anwendungen Minimal spannende Bäume Kürzeste Wege Traveling Salesman Problem Flüsse in Netzwerken und Anwendungen Netzplantechnik © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Gliederung des Kapitels a) b) c) d) 4/2, Folie 2 Motivation Begriffe und Lösungsansatz Die Verfahren von Kruskal und Prim Ein anderer Ansatz © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Die Verfahren von Kruskal und Prim Anmerkung • • beide Verfahren basieren auf dem „generischen“ Lösungsansatz zum Bestimmen eines minimal spannenden Baums die Herangehensweise unterscheidet sich • • 4/2, Folie 3 bei „Kruskal“ werden sukzessive sichere Kanten aufgenommen, die Zusammenhangskomponenten im Teilgraphen G‘ = (V,E‘) „verbinden“ bei „Prim“ werden sukzessive zu einem Teilgraphen G‘ = (V‘,E‘), der nur eine Zusammenhangskomponente enthält, sichere Kanten hinzugefügt © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Die Verfahren von Kruskal und Prim Beispiel (/* Verfahren von Kruskal */) 1 1 3 3 2 4 2 5 1 3 4 4 6 3 2 5 4/2, Folie 4 3 3 2 1 - ... G‘ = (V,E‘) rot ... 5 Zusammenhangskomponenten 5 7 3 4 6 3 4 1 3 3 © 2011 Prof. Steffen Lange 3 3 1 HDa/FbI 4 ... G‘ = (V,E‘) rot ... 4 Zusammenhangskomponenten 5 7 - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Die Verfahren von Kruskal und Prim Beispiel (/* Verfahren von Prim */) 1 1 4 2 2 3 4 5 1 1 4 3 4 6 2 4 © 2011 Prof. Steffen Lange - ... G‘ = (V‘,E‘) rot ... 1 Zusammenhangskomponente 5 7 4 4 6 2 4 1 3 4 5 4/2, Folie 5 4 2 2 4 3 1 HDa/FbI 4 ... G‘ = (V‘,E‘) rot ... 1 Zusammenhangskomponente 5 7 - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Die Verfahren von Kruskal und Prim Algorithmische Fragestellung • gegeben: • • • ein ungerichteter, zusammenhängender Graph G = (V,E) eine Gewichtsfunktion w(.) für G gesucht: • eine Kantenmenge E‘ ⊆ E, so dass G‘ = (V,E‘) ein minimaler spannender Baum für G ist ... der Graph G habe genau n Knoten (/* der Einfachheit halber sei V = { 1,...,n } */) und m Kanten 4/2, Folie 6 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Algorithmische Idee 1) 2) 3) sortiere die Kanten nach aufsteigendem Gewicht und speichere sie in einer Liste L setze E‘ = ∅ solange |E‘| < n -1 ist • bestimme in L die Kante e mit dem kleinsten Gewicht und streiche e aus L prüfe, ob e zwei Zusammenhangskomponenten im Teilgraphen G‘ = (V,E‘) verbindet • • 4/2, Folie 7 falls ja, so setze E‘ = E‘ ∪ { e } © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Beispiel 1 1 6 6 1 6 6 © 2011 Prof. Steffen Lange - HDa/FbI 4 6 3 5 2 5 4/2, Folie 8 4 2 5 3 2 5 1 5 2 3 - 5 5 4 6 7 1 3 4 4 1 4 5 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Beispiel 1 1 6 6 1 6 6 © 2011 Prof. Steffen Lange - 4 6 3 5 HDa/FbI - 6 7 1 5 4 3 4 5 3 2 5 4/2, Folie 9 4 2 5 3 2 5 1 5 2 1 4 5 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Beispiel 1 1 6 6 1 6 © 2011 Prof. Steffen Lange - 6 3 5 HDa/FbI 4 5 7 1 5 3 2 5 4/2, Folie 10 4 2 6 5 3 2 5 1 5 2 4 5 3 - 6 1 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Beispiel 1 1 6 6 1 6 6 © 2011 Prof. Steffen Lange - 6 3 5 7 1 5 3 2 HDa/FbI 4 5 2 5 4/2, Folie 11 5 3 2 5 1 5 2 4 5 3 - 6 1 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Beispiel 1 1 6 6 1 6 6 © 2011 Prof. Steffen Lange - 6 3 5 7 1 5 3 2 HDa/FbI 4 5 2 5 4/2, Folie 12 5 3 2 5 1 5 2 4 5 3 - 6 1 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Anmerkung (/* Korrektheit */) • offenbar genügt es zu zeigen, dass in jedem Schritt eine sichere Kante aufgenommen wird • • es sei E‘ ⊆ E die aktuell ausgewählte Kantenmenge es seien V1,...,Vk die aktuell betrachteten Zusamenhangskomponenten von G‘ = (V,E‘) (/* es gilt V = V1 ∪ ... ∪ Vk */) es sei e = { u,v } die Kante die aufgenommen wird, wobei o.B.d.A. u ∈ V1 und v ∈ V2 gelte • • • 4/2, Folie 13 es sei A = V1 und B = V \ V1 offenbar ist (A,B) ein Schnitt der E‘ respektiert und e eine Kante, die den Schnitt kreuzt © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Anmerkung (/* Korrektheit */) • es sei e‘ = { u‘,v‘ } irgendeine Kante mit w(e‘) < w(e) • • offenbar gibt es eine Zusammenhangskomponente Vi mit u‘,v‘ ∈ Vi offenbar muss für den gewählten Schnitt (A,B) entweder Vi ⊆ A oder Vi ⊆ B gelten (/* da (A,B) die Kantenmenge E‘ respektiert und V1,..., Vk die aktuell betrachteten Zusammenhangskomponenten von G‘ = (V,E‘) sind */) • also kann e‘ nicht den Schnitt (A,B) kreuzen ... also ist e eine leichte Kante, die den Schnitt (A,B) kreuzt (/* und damit eine sichere Kante */) 4/2, Folie 14 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Anmerkung • statt in jedem Schritt • • alle Zusammenhangskomponenten im Teilgraphen G‘ = (V,E‘) zu bestimmen und zu prüfen, ob die aktuell interessierende Kante e zwei Zusammenhangskomponenten im Teilgraphen G‘ = (V,E‘) verbindet ... kann man natürlich auch alternativ prüfen, ob der Teilgraph (V,E‘ ∪ { e }) zyklenfrei ist 4/2, Folie 15 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Realisierung (/* Version 1 */) 1) 2) 3) bestimme eine Liste L, in der alle Kanten e von G bzgl. ihrer Gewichte w(e) aufsteigend sortiert sind setze E‘ = ∅ solange |E‘| < n - 1 ist • • • bestimme die Kante e mit dem minimalen Gewicht in L und streiche e aus L teste, ob G‘ = (V,E‘ ∪ { e }) ein zyklenfreier Graph ist falls ja, setze E‘ = E‘ ∪ { e } ... Schritt1) benötigt die Zeit O(m*log(m)) ... Schritt 3) wird höchstens m mal durchgeführt und benötigt (/* falls hier eine Tiefensuche verwendet wird */) jeweils die Zeit O(n+n) ... also benötigt diese Version die Zeit O(m*log(m) + m*n) 4/2, Folie 16 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Anmerkung • man kann die Laufzeit des Verfahrens von Kruskal verbessern, in dem man den Test auf Zyklenfreiheit anders realisiert ... das wollen wir uns etwas genauer ansehen • um herauszubekommen, ob der Graph G = (V,E) immer noch zyklenfrei ist, wenn eine Kante e = {u,v} aufgenommen wird (/* d.h. der Graph G‘ = (V,E ∪ { e }) ist auch zyklenfrei */) genügt es • • • 4/2, Folie 17 die Zusammenhangskomponente Vi in G = (V,E) zu bestimmen, zu der u gehört die Zusammenhangskomponente Vj in G = (V,E) zu bestimmen, zu der v gehört zu testen, ob Vi = Vj gilt © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Anforderungen an die Datenstruktur 4/2, Folie 18 • wir interessieren uns dafür, mögliche Zerlegungen einer gegebenen Menge in Teilmengen zu „verwalten“ • zu Beginn enthält jede Teilmenge ein Element • während der Benutzung der Datenstruktur kann sich die Zerlegung ändern, in dem zwei Teilmengen zu einer Teilmenge zusammengefasst werden (/* Union-Operation */) • um Teilmengen gezielt vereinigen zu können, sollte man herausbekommen können, zu welcher Teilmenge ein Element der gegebenen Menge aktuell gehört (/* Find-Operation */) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen 1 1 3 2 3 Beispiel 6 • 4/2, Folie 19 3 Z = { {1}, {2}, {3}, {4}, {5} } 4 • Z = { {1,2}, {3}, {4}, {5} } (/* Kante {1,2} in E‘ aufgenommen */) • Z = { {1,2}, {3,4}, {5} } (/* Kante {3,4} in E‘ aufgenommen */) • Z = { {1,2,3,4}, {5} } (/* Kante {2,3} in E‘ aufgenommen */) • Z = { {1,2,3,4}, {5} } (/* Kante {2,4} nicht in E‘ aufgenommen */) • Z = { {1,2,3,4,5} } (/* Kante {3,5} in E‘ aufgenommen */) © 2011 Prof. Steffen Lange - HDa/FbI 2 - Graphen und Optimierung 4 5 5 Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Namensgebung von Mengen • • v1,...,vn dienen als Namen für die Teilmengen { v1 },...,{ vn } allgemein dient ein ausgezeichnetes Element v ∈ V als Name für eine Teilmenge Vi ⊆ V relevante Operation 4/2, Folie 20 • union(vi,vk) – Menge der verwalteten Teilmengen ändern, indem die Teilmengen mit den Namen vi bzw. vk vereinigt werden • find(v) – den Namen der Teilmenge bestimmen, die aktuell das Element v enthält © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Realisierung von Union-Find-Strukturen (/* konzeptionell */) • repräsentiere Teilmengen als Bäume beliebiger Ordnung • • • • 4/2, Folie 21 jeder Knoten hat ein Element von V als Label jeder Knoten hat einen Zeiger auf seinen Vater die Wurzel hat einen Zeiger auf sich selbst das Label der Wurzel „dient“ als Name für diese Teilmenge © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Illustration einelementige Teilmengen {2} 2 mehrelementige Teilmengen 1 3 { 1,3,5,7 } 5 7 4/2, Folie 22 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Realisierung von Union-Find-Strukturen (/* konzeptionell */) Find-Operation ... gib das Label der Wurzel des Baums zurück, in dem das Element v gespeichert ist 4 6 ... find(6) = find(2) = find(4) = 4 2 { 2,4,6 } Union-Operation ... mache die Wurzel das Baums für die Teilmenge v2 zum Sohn der Wurzel des Baums für die Teilmenge v1 4 6 4 1 2 6 3 { 2,4,6 } ∪ { 1,3 } = { 1,2,3,4,6 } 4/2, Folie 23 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung 1 2 3 Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Implementierung von Union-Find-Strukturen (/* Version 1 */) ... verwenden ein eindimensionales Array zur Repräsentation aller Bäume (/* Array P, das mit den Elementen in V indiziert ist */) Väter 1 2 3 4 5 6 7 1 2 4 1 5 5 7 zugehörige Teilmengen: 4/2, Folie 24 © 2011 Prof. Steffen Lange - HDa/FbI { 1,3,4 } {2} { 5,6 } {7} - Graphen und Optimierung Elemente Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Implementierung von Union-Find-Strukturen (/* Version 1 */) 4/2, Folie 25 Initialisierung for ( int v = 1; v <= n; ++v ) P[v] = v; ... in Zeit O(n) Union-Operation void union ( int v1, int v2 ) { P[v2] = v1; } ... in Zeit O(1) Find-Operation int find ( int v ) { while ( P[v] != v ) { v = P[v]; } return(v); } © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung ... in Zeit O(n) Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Implementierung von Union-Find-Strukturen (/* Version 2 */) ... verwenden zwei eindimensionale Arrays zur Repräsentation aller Bäume (/* Array P, das mit den Elementen in V indiziert ist; Array M, das mit den Elementen in V indiziert ist; */) Väter Mächtigkeit der Teilmengen 1 2 3 4 5 6 7 1 2 4 1 5 5 7 3 1 1 2 2 1 1 zugehörige Teilmengen: 4/2, Folie 26 © 2011 Prof. Steffen Lange - HDa/FbI { 1,3,4 } {2} { 5,6 } {7} - Graphen und Optimierung Elemente Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Implementierung von Union-Find-Strukturen (/* Version 2 */) for ( int v = 1; v <= n; ++v ) { P[v] = v; M[v] = 1; } Initialisierung void union ( int v1, int v2 ) { if ( M[v1] > M[v2] ) { P[v2] = v1; M[v1] = M[v1] + M[v2]; } else { P[v1] = v2; M[v2] = M[v2] + M[v1]; } } Union-Operation 4/2, Folie 27 © 2011 Prof. Steffen Lange - HDa/FbI - ... in Zeit O(1) ... aber, in Zeit O(log(n)) ... wie gehabt Find-Operation ... in Zeit O(n) Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Begründung – Laufzeit der Find-Operation (/* Version 2 */) • für einelementige Teilmengen gilt: tiefe(B) ≤ log(n) • es seien V1, V2 Teilmengen mit n1 bzw. n2 Elementen, wobei n1 ≥ n2 gilt (/* nach IV gilt für die zugehörigen Bäume B1 und B2: tiefe(B1) ≤ log(n1) und tiefe(B2) ≤ log(n2) */) Fall 1: tiefe(B) = tiefe(B1) log(n) = log(n1 + n2) ≥ log(n1) ≥ tiefe(B1) B1 4/2, Folie 28 © 2011 Prof. Steffen Lange - B1 B2 HDa/FbI - Graphen und Optimierung B2 Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal - Einschub: Union-Find-Strukturen Begründung – Laufzeit der Find-Operation (/* Version 2 */) • für einelementige Teilmengen gilt: tiefe(B) ≤ log(n) • es seien V1, V2 Teilmengen mit n1 bzw. n2 Elementen, wobei n1 ≥ n2 gilt (/* nach IV gilt für die zugehörigen Bäume B1 und B2: tiefe(B1) ≤ log(n1) und tiefe(B2) ≤ log(n2) */) Fall 2: tiefe(B) = tiefe(B2) + 1 log(n) = log(n1 + n2) ≥ log(2n2) ≥ log(2) + log(n2) ≥ 1 + tiefe(B2) B1 B2 B1 4/2, Folie 29 © 2011 Prof. Steffen Lange - HDa/FbI B2 - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Datenstruktur • 4/2, Folie 30 eine Union-Find-Struktur (/* Version 2 */) zur Verwaltung der sukzessive erzeugten Zusammenhangskomponenten des Teilgraphen G‘ = (V,E‘) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Kruskal Realisierung (/* Version 2 */) 1) 2) 3) bestimme eine Liste L, in der alle Kanten e von G bzgl. ihrer Gewichte w(e) aufsteigend sortiert sind setze E‘ = ∅ und initialisiere die Union-Find-Struktur für die Knotenmenge V solange |E‘| < n - 1 ist • • • bestimme die Kante e = {u,v} mit dem minimalen Gewicht in L und streiche e aus L bestimme a = Find(u) und b = Find(v) falls a ≠ b ist, setze E‘ = E‘ ∪ { e } und rufe Union(a,b) auf ... Schritt 2) benötigt zusätzlich die Zeit O(n) ... Schritt 3) wird höchstens m mal durchgeführt und benötigt jeweils die Zeit O(log(n)) ... also benötigt diese Version die Zeit O(m*log(m) + m*log(n)) 4/2, Folie 31 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Algorithmische Idee 1) 2) setze E‘ = ∅ und V‘ = { 1 } solange |V‘| < n ist • • bestimme eine Kante e = { u,v } mit dem kleinsten Gewicht, für die u ∈ V‘ und v ∉ V‘ gilt setze E‘ = E‘ ∪ { e } und V‘ = V‘ ∪ { v }, ... Anmerkung über die Korrektheit dieses Verfahrens müssen wir nicht reden, da sicher gestellt ist, dass die ausgewählte Kante e immer eine sichere Kante ist (/* wähle den Schnitt (V‘,V \ V‘) */) 4/2, Folie 32 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 © 2011 Prof. Steffen Lange - HDa/FbI 4 6 2 4 3 - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 33 4 3 2 5 3 1 4 5 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 © 2011 Prof. Steffen Lange - HDa/FbI 4 6 2 4 3 - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 34 4 3 2 5 3 1 4 5 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 © 2011 Prof. Steffen Lange - HDa/FbI 4 6 2 4 3 - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 35 4 3 2 5 3 1 4 5 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 © 2011 Prof. Steffen Lange - HDa/FbI 4 6 2 4 3 - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 36 4 3 2 5 3 1 4 5 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 © 2011 Prof. Steffen Lange - HDa/FbI 4 6 2 4 3 - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 37 4 3 2 5 3 1 4 5 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 © 2011 Prof. Steffen Lange - HDa/FbI 4 6 2 4 3 - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 38 4 3 2 5 3 1 4 5 7 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Anmerkungen • bei der Realisierung wird man ein wenig anders vorgehen (/* um die Menge der Kanten, die als neu aufzunehmende Kante infrage kommen, geschickt zu „verwalten“ */) Zugrunde liegende Datenstrukturen • • • • 4/2, Folie 39 die zu G gehörende Adjazenzliste A[1..n] eine Menge M, in der sich die nicht zu V‘ gehörenden Knoten gemerkt werden ein Array P[1..n] (/* in dem sich für die einzelnen Knoten der Vorgänger „gemerkt“ wird; diese Informationen liefern dann die Kantenmenge E‘ */) eine Array K[1..n] (/* in dem sich für die einzelnen Knoten v „gemerkt“ wird; welches minimale Gewicht eine Kante von einem Knoten u in V‘ zu v „aktuell“ hat */) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Realisierung 1) 2) 3) 4/2, Folie 40 setze P[j] = 0 und K[j] = +∞ für alle j = 1,...,n setze K[1] = 0 und M = V while M ≠ ∅ do • bestimme ein u ∈ V, für das K[u] minimal ist und setze M = M \ { u } • for all v ∈ A[u] do if v ∈ V und w({u,v}) < K[v] then setze P[v] = u und K[v] = w({u,v}) © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 4 6 2 4 3 © 2011 Prof. Steffen Lange - • P[1] = 0, K[1] = 0 • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 1, K[5] = 6 5 7 5 4 6 4 1 3 6 5 4/2, Folie 41 4 3 2 5 3 1 HDa/FbI 4 5 7 - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 4 6 2 4 3 © 2011 Prof. Steffen Lange - 5 • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 1, K[5] = 6 • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 7 5 4 6 4 1 3 6 5 4/2, Folie 42 4 3 2 5 3 1 HDa/FbI 4 5 7 - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 4 6 2 4 3 © 2011 Prof. Steffen Lange - 5 • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 3, K[6] = 4 P[7] = 3, K[7] = 4 7 5 4 6 4 1 3 6 5 4/2, Folie 43 4 3 2 5 3 1 HDa/FbI 4 5 7 - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 4 6 2 4 3 © 2011 Prof. Steffen Lange - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 44 4 3 2 5 3 1 HDa/FbI 4 5 7 - • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 3, K[6] = 4 P[7] = 3, K[7] = 4 • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 5, K[6] = 3 P[7] = 3, K[7] = 4 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 4 6 2 4 3 © 2011 Prof. Steffen Lange - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 45 4 3 2 5 3 1 HDa/FbI 4 5 7 - • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 5, K[6] = 3 P[7] = 3, K[7] = 4 • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 5, K[6] = 3 P[7] = 6, K[7] = 1 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 4 6 2 4 3 © 2011 Prof. Steffen Lange - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 46 4 3 2 5 3 1 HDa/FbI 4 5 7 - • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 5, K[6] = 3 P[7] = 6, K[7] = 1 • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 5, K[6] = 3 P[7] = 6, K[7] = 1 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Beispiel 1 1 6 2 2 3 6 5 1 1 6 3 4 6 2 4 3 © 2011 Prof. Steffen Lange - 5 7 5 4 6 4 1 3 6 5 4/2, Folie 47 4 3 2 5 3 1 HDa/FbI 4 5 7 - • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 5, K[6] = 3 P[7] = 6, K[7] = 1 • • • • • • • P[1] = 0, K[1] = 0 P[2] = 1, K[2] = 1 P[5] = 2, K[5] = 3 P[3] = 2, K[3] = 2 P[4] = 3, K[4] = 5 P[6] = 5, K[6] = 3 P[7] = 6, K[7] = 1 Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Realisierung 1) 2) 3) setze P[j] = 0 und K[j] = +∞ für alle j = 1,...,n setze K[1] = 0 und M = V while M ≠ ∅ do • bestimme ein u ∈ V, für das K[u] minimal ist und setze M = M \ { u } • for all v ∈ A[u] do if v ∈ V und w({u,v}) < K[v] then setze P[v] = u und K[v] = w({u,v}) ... Schritt 1) benötigt die Zeit O(n) ... Schritt 3) wird höchstens n mal durchgeführt und benötigt zum Testen, ob M ≠ ∅ gilt, und zum Finden von u jeweils die Zeit O(n) ... in Schritt 3) wird für das Anpassen der Werte in den Arrays P und und K insgesamt die Zeit O(m) benötigt ... also benötigt diese Version die Zeit O(n + n2 + m) 4/2, Folie 48 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung Kapitel 4: Minimal spannende Bäume Das Verfahren von Prim Anmerkungen • • wenn der gegebene Graph „deutlich“ weniger als n2 viele Kanten hat, so kann man noch geschickter vorgehen statt M als Menge zu speichern, wird M „geschickt“ als Prioritätswarteschlange „verwaltet“ (/* die Prioritäten werden durch die Werte im Array K festgelegt */) ... dann kann man einen Knoten u mit dem minimalen Wert im Array K in Zeit O(log(n)) finden (/* man muss jedoch in Kauf nehmen, das jede Anpassung der Werte im Array K auch die Zeit O(log(n)) kostest, da damit implizit die Prioritätswarteschlange modifiziert wird */) 4/2, Folie 49 © 2011 Prof. Steffen Lange - HDa/FbI - Graphen und Optimierung