Fachbereich IV, Informatik Softwarepraktikum C++, LEDA und STL Visualisierung minimal/maximal aufspannender Bäume Wintersemester 2004/2005 Dokumentation Algorithmen zur Lösung von MST - Problemen Nicolas Mertes Matrikel Nr. 697862 1 Inhaltsverzeichnis Inhaltsverzeichnis..................................................................................................... 2 0. VORWORT ............................................................................................................. 3 1. EINLEITUNG .......................................................................................................... 4 2. GRAPHEN .............................................................................................................. 5 2.1 Allgemeines....................................................................................................... 5 2.2 Definition (gerichteter Graph) ............................................................................ 5 2.2 Definition (ungerichteten Graph) ....................................................................... 5 2.3 Definition (Ausgangsgrad, Eingangsgrad) ......................................................... 6 2.3 Definition (benachbart, Weg, Länge, geschlossen) ........................................... 6 2.4 Definition (zusammenhängend)......................................................................... 6 2.5 Definition (Pfad, Kreis) ...................................................................................... 6 2.6 Definition (azyklisch) ......................................................................................... 6 3. BÄUME................................................................................................................... 7 3.1 Definition (zyklenfrei, Wald)............................................................................... 7 3.2 Definition (Baum)............................................................................................... 7 3.3 Definition (Netzwerk) ......................................................................................... 7 3.3 Definition (minimal /maximal erzeugender Baum) ............................................. 8 4. ALGORITHMEN ZUR LÖSUNG VON MSB PROBLEMEN ................................ 9 4.1 Allgemeines...................................................................................................... 9 4.2 Der Algorithmus von Kruskal ........................................................................... 9 4.2.1 Beschreibung und Verfahren......................................................................... 9 4.2.2 Algorithmus im Pseudocode........................................................................ 10 4.2.3 Beispiel zur Vorgehensweise ...................................................................... 11 4.2.4 Laufzeitanalyse ........................................................................................... 12 4.3 Der Algorithmus von Prim............................................................................... 12 4.3.1 Beschreibung und Verfahren....................................................................... 12 4.3.2 Algorithmus im Pseudocode........................................................................ 13 4.3.3 Beispiel zur Vorgehensweise ...................................................................... 13 4.3.4 Laufzeitanalyse ........................................................................................... 15 4.4 Der Algorithmus von Boruvka ........................................................................ 15 4.4.1 Beschreibung und Verfahren........................................................................ 15 4.4.2 Algorithmus im Pseudocode........................................................................ 15 4.4.3 Beispiel zur Vorgehensweise ...................................................................... 16 4.4.4 Laufzeitanalyse ........................................................................................... 17 Quellenverzeichnis ................................................................................................. 18 2 0. Vorwort Diese Dokumentation ist im Rahmen, des im Wintersemester 2004/2005, an der Universität Trier, stattgefundenen Softwarepraktikums C++, LEDA und STL entstanden. Die Hauptthematik unserer Gruppe widmete sich hier vor allem der Implementierung von Graphalgorithmen zur Berechnung von minimal / maximal aufspannenden Bäume. Aufgabe war es, mittel GraphWin®, einem Editor zur Erzeugung, Manipulation und Speicherung von Graphen, ein Programm zu entwickeln. Dieses sollte drei Algorithmen (Boruvka, Prim und Kruskal) zur Berechnung von minimalen / maximalen Netzwerken eines gegebenen Graphen implementieren. Ferner sollten die Ergebnisse der Berechnungen dieser Algorithmen schrittweise visualisiert werden. Die folgenden Abschnitte dieser Dokumentation widmen sich hierbei nicht unserer expliziten Implementierung der Algorithmen. Es sollen hier lediglich die theoretischen Grundlagen zu Graphen und die prinzipielle Vorgehensweise der Algorithmen von Boruvka, Prim und Kruskal vermittelt werden. 3 1. Einleitung Das erste Problem, welches mittels Graphentheorie gelöst wurde, war das berühmte Königsberger Brückenproblem : Die Stadt Königsberg in Preußen liegt am Zusammenfluss zweier Arme der Pregel. Die Stadt besitzt (1736) sieben Brücken, die die einzelnen Stadteile miteinander verbinden, die an den verschiedenen Ufern dieser Flussarme und auf einer Insel im Fluss liegen. Gefragt wird, ob es einem Spaziergänger möglich ist, die sieben Brücken von Königsberg genau einmal zu überqueren und an den Ausgangspunkt zurückzukehren. Leonard Euler löste 1736 dieses Problem allgemein, indem er die Situation als Graph darstellte, also einer Struktur, die nur aus Knoten und einzelnen Verbindungskanten zwischen diesen Knoten besteht. Modellierung des Abbildung 1 Königsberger Brückenproblem Er zieht dabei alle Örtlichkeiten der Stadt, die voneinander erreichbar sind, ohne dass dabei eine Brücke überquert werden muss, zu einem Knoten zusammen und verbindet diese mittels Kanten. Bezogen auf den dabei entstandenen Graphen lautet die Frage nun: Gibt es einen Weg, der von einem beliebigen Knoten des Graphen ausgeht, genau einmal über jede Kante des Graphen verläuft und zum Ausgangspunkt zurückführt? Auf der Basis des graphentheoretischen Modells von Königsberg kann Euler nun sehr einfach zeigen, dass es keinen Rundgang der gewünschten Art gibt: Auf solch einem Rundgang, bei dem jede Kante nur einmal abgelaufen würde, müsste nämlich die Anzahl der Ankünfte und Abgänge, dem so genannten Grad, in jedem Zwischenknoten gerade sein. Tatsächlich hat der Graph, der die Stadt Königsberg modelliert jedoch die Eigenschaft, dass jeder seiner Knoten einen ungeraden Grad besitzt. 4 2. Graphen 2.1 Allgemeines Um die in Abschnitt 4 vorgestellten Algorithmen zur Berechnung von minimal / maximal aufspannenden Bäumen verstehen zu können, bedarf es zunächst einiger theoretischen Grundlagen zum Thema Graphen. Im Folgenden soll nun erläutert werden, was man generell unter einem Graphen versteht. Ferner sollen weitere Begriffe, die damit in unmittelbarem Zusammenhang stehen und für das weitere Verstehen notwendig sind, definiert werden. 2.2 Definition (gerichteter Graph) Ein gerichteter Graph G = (V, E) ist eine Struktur, die aus zwei Bestandteilen besteht: Einer Menge V und einer Relation E V V über dieser Menge V. Die Elemente v der Menge V werden Knoten genannt, die Elemente e = (v,u) der Menge E sind die Kanten des Graphen. Die Kante e verbindet die Knoten u und v. u wird in diesem Zusammenhang auch Startknoten und u Endknoten von e genannt. Die Kante e hat hierbei eine Richtung von u nach v. Es gilt ferner: E {(u,v ) | u,v V } Zwei Knoten, die durch eine Kante miteinander verbunden sind, heißen adjazent. Abbildung 2 Gerichteter Graph 2.2 Definition (ungerichteten Graph) Ein ungerichteter Graph hat dieselbe Struktur wie ein gerichteter Graph. Er unterscheidet sich jedoch hinsichtlich der Kantenrichtungen. Hier ist die Richtung der Kanten egal. Verbindet eine Kante Knoten u mit Knoten v, so verbindet sie auch Knoten v mit Knoten u Kanten gehen also in beide Richtungen und sind somit ungerichtet. Es gilt daher für die Kantenmenge E: E {{u,v } | u,v V } 5 Abbildung 3 Ungerichteter Graph 2.3 Definition (Ausgangsgrad, Eingangsgrad) Sei G = (V, E) ein Graph und v ein Knoten von G. Der Ausgangsgrad outdeg(v) von v ist die Anzahl der Kanten, die v als Startknoten besitzen, der Eingangsgrad indeg(v) von v ist die Zahl der Kanten, die in v enden. Es gilt damit out deg(v ) | {u V : (v , u ) E } | und in deg(v ) | {u V : (u,v ) E } | . Ist G ein ungerichteter Graph so stimmen indeg(v) und oudeg(v) für alle v aus G überein und es wird kurz von Grad deg(v) gesprochen. 2.3 Definition (benachbart, Weg, Länge, geschlossen) Sei G = (V, E) ein Graph, und u und v seien zwei Knoten in G. 1. u und v heißen benachbart, wenn eine Kante von u nach v führt, wenn also (u,v ) E gilt. 2. Ein Weg von u nach v ist eine Folge jeweils benachbarter Knoten u0, u1, , un mit u=u0 und v=un. Die Länge des Weges ist n. Ein Weg der Länge 0 wird trivialer Weg genannt, er besteht aus einem Knoten. 3. Ein Weg heißt geschlossen, wenn seine beiden Endknoten gleich sind. 2.4 Definition (zusammenhängend) Zwei Knoten u und v eines ungerichteten Graphen G = (V, E) heißen zusammenhängend, wenn es in G einen Weg von u nach v gibt. 2.5 Definition (Pfad, Kreis) 1. Als Pfade werden Wege in einem Graphen bezeichnet, bei denen keine Kante zweimal durchlaufen wird. Ein geschlossener Pfad heißt Kreis. 2. Ein einfacher Pfad ist ein Pfad, bei dem kein Knoten mehrfach durchlaufen wird. Ein geschlossener Pfad, der mit Ausnahme seines Ausgangspunkts einfach ist, heißt einfacher Kreis. 2.6 Definition (azyklisch) Ein Graph G = (V, E) heißt azyklisch, wenn er keine Kreise hat. 6 3. Bäume In den verschiedenen Anwendungsgebieten der Informatik spielen Graphen, die keine geschlossenen Wege besitzen, eine herausragende Rolle. Mit diesen als Bäume bezeichneten Graphen wollen wir uns als nächstes beschäftigen. Aufbauend auf verschiedenen Definitionen wollen wir letztlich zu den minimal / maximal aufspannenden Bäumen kommen, die für das nächste Kapitel von besonderer Bedeutung sind. 3.1 Definition (zyklenfrei, Wald) 1. Ein Graph heißt zyklenfrei, wenn es keinen geschlossenen Weg der Länge gibt. 2. Ein ungerichteter Graph heißt Wald, wenn er zyklenfrei ist. 1 Abbildung 4 Wald mit zwei Komponenten 3.2 Definition (Baum) Ein ungerichteter Graph heißt Baum, wenn er zyklenfrei und zusammenhängend ist. Abbildung 5 Baum mit vier Knoten 3.3 Definition (Netzwerk) Unter einem Netzwerk versteht man einen Graphen G = (V, E), auf dem eine Kostenbzw. Gewichtsfunktion w : E definiert ist. Bei dieser Gewichtsfunktion wird jeder Kante e E ein numerischer Wert aus dem Wertebereich zugeordnet. 7 Abbildung 6 Beispiel eines Netzwerks mit Kantenkosten aus + 3.3 Definition (minimal /maximal erzeugender Baum) Sei Graph G = (V, E) ein Netzwerk mit Gewichtsfunktion w : E menge T der Kantenmenge E von G heißt w (T ) . Für jede Teil- w (e ) e T das Gewicht von T. Ein erzeugender Baum T von G heißt minimal erzeugender Baum, wenn sein Gewicht unter allen erzeugenden Bäumen minimal ist. Ein erzeugender Baum T von G heißt maximal erzeugender Baum, wenn sein Gewicht unter allen erzeugenden Bäumen maximal ist. Im folgenden Abschnitt wollen wir uns auf minimal erzeugende Bäume, deren Gewichtsfunktion nur positive Werte annimmt, konzentrieren. Hier gilt also für die Gewichtsfunktion w : E . 8 4. Algorithmen zur Lösung von MSB Problemen 4.1 Allgemeines Minimal erzeugende Bäume wurden erstmals von Boruvka im Jahre 1926 betrachtet. Kurz nach 1920 sollte das ländliche Süd-Mähren elektrifiziert werden. Für das zu konstruierende Netzwerk sollte eine möglichst ökonomische Lösung gefunden werden. Boruvka entdeckte schließlich einen Algorithmus, mit dem es möglich war, einen minimalen Spannbaum eines gewichteten Netzwerkes zu ermitteln. Boruvkas Arbeiten sind lange Zeit unbeachtet geblieben; häufig wird die Lösung des Problems, minimale Bäume zu finden, immer noch auf Kruskal und Prim zugeschrieben, obwohl beide Boruvka zitieren. Für die Suche nach minimal / maximal aufspannenden Bäumen finden sich besonders in heutiger Praxis überraschend viele Anwendungsbeispiele. Es stellen sich dabei oft die Fragen nach Einsparung und der Minimierung von Kosten, Wegen oder Verbindungen. Egal, ob beim Entwurf von Computernetzwerken, Fernmeldeverbindungen, Kanalisationen, Straßennetzen oder elektronischen Schaltungen, hier gilt es stets so viel Material wie möglich einzusparen, um somit kosteneffizient arbeiten zu können. In den nachfolgenden Abschnitten sollen verschiedene Algorithmen zur Berechnung minimal / maximal aufspannender Bäume näher untersucht werden. Hierbei werden diese Algorithmen nicht nur anhand konkreter Beispiele illustriert, eine gesonderte Betrachtung der einzelnen Laufzeiten soll hier ebenfalls Aufschluss über die Effizienz der einzelnen Vorgehensweisen geben. Ausgangslage für alle nachfolgenden Algorithmen ist, dass der zu behandelnde Graph, gewichtet, zusammenhängend und ungerichtet ist. 4.2 Der Algorithmus von Kruskal 4.2.1 Beschreibung und Verfahren Der erste Algorithmus, den wir hier näher unter die Lupe nehmen wollen, ist der Algorithmus von Kruskal. Dieser wurde erstmals 1930 von Jarnik entworfen, Kruskal selber griff ihn im Jahre 1956 wieder auf. Der Algorithmus von Kruskal arbeitet nach einen so genannten gierigen (engl.: greedy) Verfahren, was bedeutet, dass Entscheidungen die während des Verfahrens getroffen werden, nicht reversibel sind. Der Kruskal - Algorithmus operiert hierbei auf einer sortierten Kantenliste. Diese setzt sich aus allen Kanten zusammen, welche im Ausgangsgraph enthalten sind. Eine geeignete Datenstruktur zur Speicherung dieser Kanten ist eine Prioritätsschlange, welche die Kanten gemäß ihrer Kantengewichtung organisiert. Jede Kante dieser Liste wird betrachtet und wird anschließend entweder verworfen oder für die Konstruktion des entsprechenden minimalen Spannbaum ausgewählt. 9 Der minimale Spannbaum wird so sequentiell aus Teilbäumen aufgebaut. Das Verfahren ist in den nachfolgenden Zeilen erläutert: 1. Der Algorithmus startet zunächst mit einer leeren Kantenmenge. Jeder Knoten des Graphen wird als eigenständige Komponente angesehen. 2. Die Kanten des Graphen sind gemäß ihrer Kantengewichtung in einer Prioritätswarteschlange organisiert. 3. Aus dieser Prioritätswarteschlange wird nun die Kante mit geringster Gewichtung extrahiert. 4. Nun wird geprüft, ob die Knoten, die durch diese Kante verbunden werden, in unterschiedlichen Komponenten liegen. Wenn ja: Kante aus Warteschlange löschen, die entsprechenden Komponenten vereinigen und Kante in Ergebnisliste aufnehmen. Wenn nein: Kante nur aus Warteschlange löschen 5. Solange Prioritätswarteschlange nicht leer, gehe zu 3. 6. Ende 4.2.2 Algorithmus im Pseudocode Gegeben sei ein zusammenhängender, ungerichteter Graph G mit Knotenmenge V = 1,...,n und Gewichtsfunktion w : E . Dabei seien die Kanten von G nach aufsteigendem Gewicht geordnet, also E = {e1, , en} mit w(e1) ... w(en). Als Eingabe erhält der Algorithmus von Kruskal den Graphen G mit seiner entsprechenden Gewichtsfunktion w. Die Ausgabe ist der minimale Spannbaum T von G. Prozedur KRUSKAL(G,w;T) (1) (2) (3) (4) (5) (6) (7) T for k = 1 to n do Vi {i} od; bilde aus E eine Priority-Queue Q mit Prioritätsfunktion w; while Q do e:= DELETEMIN(Q); finde die Endpunkte u und v von e; finde die Komponenten Vu bzw. Vv, die u bzw. v enthalten (8) if Vu Vv then MERGE(Vu,Vv); T T e ; fi (9) od 10 4.2.3 Beispiel zur Vorgehensweise Das folgende Beispiel soll die Vorgehensweise des Algorithmus verdeutlichen. Ausgehend vom nachfolgenden Graphen soll ein minimaler Spannbaum erzeugt werden. Die Abbildungen sind hierbei der GraphWin - Visualisierung unserer Implementierung des Kruskal - Algorithmus entnommen. Kanten und Knoten die in den minimalen Spannbaum aufgenommen werden, sind rot unterlegt dargestellt. 1. Ausgangsgraph 2. Aus der Prioritätsschlange wird die Kante mit niedrigster Gewichtung genommen. Dies ist die Kante (1,2) mit w(1,2) = 10, die darauf aus der Schlange entfernt wird. 3. Die nächst kleinere Kante ist (3,4) mit w(3,4) = 15. Sie verbindet zwei Knoten unterschiedlicher Komponenten und wird daher auch in den minimalen Spannbaum aufgenommen. 4. Als nächstes wird die Kante (2,3) mit w(2,3) = 20 aufgenommen. 11 5. Als letztes wird die Kante (0,1) hinzugefügt. Alle Knoten sind somit verbunden und der minimale Spannbaum wurde somit generiert. 4.2.4 Laufzeitanalyse Die Laufzeit des Algorithmus hängt maßgeblich von Schritt 3 ab. Normalerweise kann zur Sortierung der Kanten des Graphen jeder Sortieralgorithmus verwendet werden. Die Laufzeit des Algorithmus ist hierbei entscheidend. Setzt man beispielsweise Bubblesort als Algorithmus ein, so werden die Kanten in Zeit O(|E|2) sortiert. Für den restlichen Algorithmus schätzt man O(|V2|) ab und erhält somit eine Gesamtlaufzeit von O(|V2|). Verwendet man jedoch in Schritt 3 die oben angesprochene Priority - Queue als Datenstruktur, so ist das Auffinden und Entfernen der minimalen Kante e in O(log E ) Schritten möglich. Die Vereinigung der zunächst n Komponenten der Partition kann in insgesamt O(n log n ) Schritten erfolgen. Der Graph G hat mindestens n-1 Kanten, da er zusammenhängend ist. Die Gesamtkomplexität beträgt somit O( E log E ) . 4.3 Der Algorithmus von Prim 4.3.1 Beschreibung und Verfahren Dieser Algorithmus geht im Wesentlichen auf Jarnik zurück und wurde von Dijkstra und Prim wieder entdeckt. Er ist auch unter dem Namen Prim Dijkstra - Algorithmus bekannt. Der Algorithmus von Prim liefert, ebenso wie der Kruskal - Algorithmus, durch ein gieriges Verfahren einen minimalen Spannbaum eines bewerteten ungerichteten Graphen. 12 Der Algorithmus geht zunächst von einem beliebigen Startpunkt aus, wobei alle angrenzenden Kanten untersucht werden. Er untersucht alle möglichen Pfade, die sich von diesem Startpunkt zu anderen Knotenpunkten finden lassen und nimmt dann den günstigsten. Dann untersucht er alle möglichen Pfade von beiden Knotenpunkten und sucht wiederum den günstigsten. Der Algorithmus führt hierbei n-1 Iterationen aus, wobei n die Anzahl der Knoten des Graphen ist. 4.3.2 Algorithmus im Pseudocode Gegeben sei ein zusammenhängender, ungerichteter Graph G mit Knotenmenge V = 1,...,n und Gewichtsfunktion w : E (über Adjazenzlisten Av). Als Eingabe erhält der Algorithmus von Prim den Graphen G mit seiner entsprechenden Gewichtsfunktion w. Die Ausgabe ist der minimale Spannbaum T von G. Prozedur PRIM(G,w;T) (1) w(1) , S ,T ; (2) for i = 2 to n do g(i) od; (3) while S V do (4) wähle ein i S\V, für das g(i) minimal ist, und setze S S i ; (5) (6) (7) (8) (9) (10) od if i 1 then T T e ; fi for e Ai E(S,V\S) do v sei Endpunkt von e in V\S; if g(v) > w(e) then g(v) w(e) und e(v) od e fi 4.3.3 Beispiel zur Vorgehensweise Zu Demonstration der Vorgehensweise des Prim-Algorithmus soll das in Abschnitt 4.2.3 angeführte Beispiel nochmals betrachtet werden. Hier sind ebenfall alle Kanten, die den späteren Minimalbaum bilden rot gefärbt. 13 1. Ausgangsgraph 2. Der Algorithmus startet bei Knoten 0. Er untersucht die angrenzenden Kanten (0,1) und (0,3). Dabei stellt er fest, dass die Kante (0,1) die kleinere Gewichtung (35 < 40) und nimmt daher diese in den Baum mit auf. 3. Jetzt werden die angrenzenden Kanten der Knoten 0 und 1 betrachtet. Hierbei ist die Kante (1,2) die kleinste (10 < 35 < 40). Diese wird nun in den Baum mit aufgenommen und daher rot markiert. 4. Hier werden nun die Kanten (0,3), (1,3), (2,3) und (2,4) betrachtet. (2,3) ist mit einer Gewichtung von 20 die kleinste und wird somit rot gefärbt. 5. Als letztes wird die Kante (3,4) aufgenommen. Der erzeugte Spannbaum ist somit fertig und mit dem vom Kruskal - Algorithmus erzeugten Baum identisch 14 4.3.4 Laufzeitanalyse Der Algorithmus, wie oben beschrieben, bestimmt einen minimal erzeugenden Baum in Zeit O(|V|2). Die while Schleife in Schritt 3 wird dabei |V| - mal durchlaufen. Bei jeder Iteration sind die notwendigen Vergleiche in Schritt 4 in maximal |V|-|S| Schritten möglich, woraus eine Zeitkomplexität von O(|V|2) resultiert. Durch Verwendung besserer Datenstrukturen (z.B. bei Verwendung von FibonacciHeaps als Speicher) kommt man mit einer Zeitkomplexität von O(| V | log | V | | E |) aus. 4.4 Der Algorithmus von Boruvka 4.4.1 Beschreibung und Verfahren Schließlich sei noch ein dritter Algorithmus zur Ermittlung eines minimalen Spannbaums eines gewichteten, ungerichteten Graphen erwähnt, der Algorithmus von Boruvka. Dieser stammt aus dem Jahre 1926 und ist aus Kruskals und Prims Algorithmus hervorgegangen. Er behandelt den Spezialfall, dass die Kantengewichte paarweise verschieden sind. Der Algorithmus betrachtet anfangs jeden Knoten als Baum bzw. isolierte Komponente. In jeder Iteration sucht sich jeder Knoten die Kante mit dem niedrigsten Wert, welche die aktuelle Komponente mit einer anderen Komponente verbindet. Diese Kante wird dann in den minimalen Spannbaum aufgenommen. Dabei werden Kanten so hinzugenommen, dass stets zwei Komponenten immer nur durch eine Kante verbunden werden und auftretende Kreise aufgelöst werden. Dieser Schritt wird solange wiederholt, bis nur noch eine Komponente existiert, die dann einen minimalen Spannbaum des Ausgangsgraphen bildet. 4.4.2 Algorithmus im Pseudocode Gegeben sei ein zusammenhängender, ungerichteter Graph G mit Knotenmenge , wobei verschiedene Kanten stets verV = 1,...,n und Gewichtsfunktion w : E schiedenes Gewicht haben. Als Eingabe erhält der Algorithmus von Prim den Graphen G mit seiner entsprechenden Gewichtsfunktion w. Die Ausgabe ist der minimale Spannbaum T von G. 15 Prozedur BORUVKA(G,w;T) (1) for i = 1 to n do Vi {i} od; (2) T ; M V1,...,Vn ; (3) while |T| < n-1 do (4) for U M do (5) finde eine Kante e = uv mit u U , v U und w(e) < w(e ) für alle Kanten e = u v mit v' U und v' U ; (6) finde die Komponente U , die v enthält (7) T T e ; (8) od (9) for U M do v sei Endpunkt von e in V\S; (10) MERGE (U,U ) (11) od (12) od 4.4.3 Beispiel zur Vorgehensweise Wie bereits in den vorherigen Beispielen soll hier ebenfalls wieder derselbe Ausgangsgraph genommen werden. 1. Ausgangsgraph 2. Der Algorithmus startet, nimmt in der ersten Iteration jeden Knoten unter die Lupe und ermittelt zu jedem die günstigste Kante. Die günstigste Kante von Knoten 0 ist (0,1) ist w(0,1) = 35, von Knoten 1 und 2 jeweils die Kante (1,2). Knoten 1 und 2 haben also jeweils die Kante (1,2) mit w(1,2)=10 als günstigste Kante gemeinsam. Diese wird in den minimalen Baum mit aufgenommen. 16 3. Als nächstes untersucht der Algorithmus alle ausgehenden Kanten von Knoten 3 und 4, stellt dabei fest, dass die Kante (3,4) mit w(3,4)=15 die günstigste beider Knoten ist. Daher werden Knoten 3 und 4 zu einer Komponenten vereinigt. 4. Vor der nächsten Iteration existieren bereits die Komponenten (0), (1,2) und (3,4). Diese werden nun über die möglichst günstigste Kante miteinander verbunden. Diese Kante ist (2,3) mit w(2,3)=20. Es ist somit die Komponente (1,2,3,4) entstanden. 5. Im letzten Schritt wird die günstigsten Kanten der Komponenten (0) und (1,2,3,4) ermittelt. Diese ist die Kante (0,1) mit w(0,1)=35. Diese Kante wird in den minimalen Spannbaum aufgenommen. Der minimale Baum wurde somit generiert. 4.4.4 Laufzeitanalyse Der Algorithmus von Boruvka bestimmt einen minimal aufspannenden Baum mit Zeitkomplexität O(| V 2 | log | V |) . Die Suche nach der Kante mit dem geringsten Gewicht, die mit jeder Komponente inzident ist, benötigt O(V 2 ) Vergleiche. Die Anzahl der Komponenten reduziert sich dabei in jeder Iteration um den Faktor zwei, die Anzahl der Zusammenhangskomponenten wird also mindestens halbiert. Folglich sind O(log | V |) Iterationen nötig, um den minimalen spannenden Baum zu finden. Es ergibt sich somit eine Laufzeit von O(| V 2 | log | V |) . 17 Quellenverzeichnis [1] Meinel, Christoph: Mathematische Grundlagen der Informatik, B.G. Teubner Verlag (2000) ISBN 3 - 519 - 02949 - 9 [2] Getferd, Florian: Minimal aufspannenden Bäume www.mathematik.uni-kl.de/~krumke/Teaching/SS2004/proseminar/Data/minspan_getfert.pdf [3] Seeliger, André.: Algorithmen für minimal aufspannende Bäume www.inf.hs-zigr.de/~wagenkn/ TI/Komplexitaet/ReferateSS00/seeliger.pdf [4] Augustin, Daniel.: Graphen www.vameo.de/uni/tutorium2/graphen.pdf 18