finale Version des Vorlesungsskripts - ZIB

finale Version des Vorlesungsskripts - ZIB finale Version des Vorlesungsskripts - ZIB

23.06.2013 Aufrufe

Eingabe: Graph G = (V, E) mit Kantengewichten c(e) für alle e ∈ E. Ausgabe: Maximaler Wald T ⊆ E mit minimalem Gewicht c(T ). 5.2 Optimale Bäume und Wälder 1. (Sortieren): Numeriere die m Kanten des Graphen G, so dass gilt c(e1) ≤ c(e2) ≤ . . . ≤ c(em). 2. Setze T := ∅. 3. FOR i = 1 TO m DO: Falls T ∪ {ei} keinen Kreis enthält, setze T := T ∪ {ei}. 4. Gib T aus. △ Aus Satz (5.8) und unseren Überlegungen zur Reduktion des Waldproblems auf das Baumproblem und umgekehrt folgt: (5.10) Satz. Algorithmus (5.9) liefert einen maximalen Wald T (d. h. für jede Zusammenhangskomponente G ′ = (V ′ , E ′ ) von G ist T ∩ E ′ ein aufspannender Baum), dessen Gewicht c(T ) minimal ist. Ist G zusammenhängend, so ist T ein aufspannender Baum von G minimalen Gewichts c(T ). △ Die Laufzeit von Algorithmus (5.7) bzw. (5.9) kann man wie folgt abschätzen. Mit den gängigen Sortierverfahren der Informatik (z. B. HEAP-SORT) kann man die Kanten von E in O(k log 2 k) bzw. O(m log 2 m) Schritten in der geforderten Weise ordnen. In Schritt 3 ruft man k- bzw. m-mal ein Unterprogramm auf, das überprüft, ob eine Kantenmenge einen Kreis besitzt oder nicht. Durch Benutzung geeigneter Datenstrukturen kann man einen derartigen Aufruf in höchstens O(n) Schritten abarbeiten. Daraus folgt, dass Schritt 3 in höchstens O(mn) Schritten ausgeführt werden kann. Dies ist auch die Gesamtlaufzeit des Verfahrens. Mit speziellen “Implementierungstricks” kann die Laufzeit von Schritt 3 auf O(m + n log n) gesenkt und damit die Gesamtlaufzeit sogar auf O(m log m) Schritte reduziert werden. In der Literatur wird Algorithmus (5.9) häufig Kruskal-Algorithmus genannt. Einen gewichtsminimalen aufspannenden Baum kann man übrigens auch mit folgendem Verfahren finden. (5.11) “Dualer” Greedy-Algorithmus. Eingabe: Zusammenhängender Graph G = (V, E) mit Kantengewichten c(e) für alle e ∈ E. Ausgabe: Aufspannender Baum T ⊆ E minimalen Gewichts c(T ). 1. (Sortieren): Numeriere die m Kanten des Graphen G, so dass gilt c(e1) ≥ c(e2) ≥ . . . ≥ c(em). 2. Setze T := E. 3. FOR i = 1 TO m DO: 83

5 Bäume und Wege Falls T \ {ei} zusammenhängend ist, setze T := T \ {ei}. 4. Gib T aus. △ Der Korrektheitsbeweis für Algorithmus (5.11) bleibt einer Übungsaufgabe überlassen. Wie bereits erwähnt, gibt es eine Vielzahl weiterer Verfahren zur Bestimmung minimaler aufspannender Bäume. Ein gemeinsames Skelett für mehrere dieser Algorithmen kann wie folgt skizziert werden. (5.12) Algorithmus META-MST. Eingabe: Zusammenhängender Graph G = (V, E) mit Kantengewichten c(e) für alle e ∈ E. Ausgabe: Aufspannender Baum T von G minimalen Gewichts. △ 1. (Initialisierung): FOR ALL i ∈ V DO: Setze Vi := {i} und Ti := ∅. 2. DO |V | − 1 TIMES: (a) Wähle eine nicht-leere Menge Vi. (b) Wähle eine Kante uv ∈ E mit u ∈ Vi, v ∈ V \ Vi und c(uv) ≤ c(pq) für alle pq ∈ E mit p ∈ Vi, q ∈ V \ Vi. (c) Bestimme j, so dass v ∈ Vj. (d) Setze Vi := Vi ∪ Vj; Vj := ∅. (e) Setze Ti := Ti ∪ Tj ∪ {uv}; Tj := ∅. 3. Gib diejenige Kantenmenge Ti mit Ti = ∅ aus. Algorithmus (5.9) ist ein Spezialfall von Algorithmus (5.12). Überlegen Sie sich wieso! (5.13) Satz. Algorithmus (5.12) bestimmt einen minimalen aufspannenden Baum. △ Beweis. Wir zeigen durch Induktion über p = |T1| + . . . + |Tn|, dass G einen minimalen aufspannenden Baum T enthält mit Ti ⊆ T für alle i. Ist p = 0, so ist nichts zu zeigen. Sei uv eine Kante, die bei einem Durchlauf von Schritt 2 in (b) gewählt wurde. Nach Induktionsvoraussetzung sind alle bisher bestimmten Mengen Ti in einem minimalen aufspannenden Baum T enthalten. Gilt uv ∈ T , so sind wir fertig. Ist uv ∈ T , so enthält T ∪ {uv} einen Kreis. Folglich muss es eine Kante rs ∈ T geben mit r ∈ Vi, s ∈ V \ Vi. Aufgrund unserer Wahl in (b) gilt c(uv) ≤ c(rs). Also ist T := (T \{rs})∪{uv} ebenfalls ein minimaler aufspannender Baum und der neue Baum T erfüllt unsere Bedingungen. Die Korrektheit des Algorithmus folgt aus dem Fall p = n − 1. ✷ 84

Eingabe: Graph G = (V, E) mit Kantengewichten c(e) für alle e ∈ E.<br />

Ausgabe: Maximaler Wald T ⊆ E mit minimalem Gewicht c(T ).<br />

5.2 Optimale Bäume und Wälder<br />

1. (Sortieren): Numeriere die m Kanten <strong>des</strong> Graphen G, so dass gilt<br />

c(e1) ≤ c(e2) ≤ . . . ≤ c(em).<br />

2. Setze T := ∅.<br />

3. FOR i = 1 TO m DO:<br />

Falls T ∪ {ei} keinen Kreis enthält, setze T := T ∪ {ei}.<br />

4. Gib T aus. △<br />

Aus Satz (5.8) und unseren Überlegungen zur Reduktion <strong>des</strong> Waldproblems auf das<br />

Baumproblem und umgekehrt folgt:<br />

(5.10) Satz. Algorithmus (5.9) liefert einen maximalen Wald T (d. h. für jede Zusammenhangskomponente<br />

G ′ = (V ′ , E ′ ) von G ist T ∩ E ′ ein aufspannender Baum), <strong>des</strong>sen<br />

Gewicht c(T ) minimal ist. Ist G zusammenhängend, so ist T ein aufspannender Baum<br />

von G minimalen Gewichts c(T ). △<br />

Die Laufzeit von Algorithmus (5.7) bzw. (5.9) kann man wie folgt abschätzen. Mit<br />

den gängigen Sortierverfahren der Informatik (z. B. HEAP-SORT) kann man die Kanten<br />

von E in O(k log 2 k) bzw. O(m log 2 m) Schritten in der geforderten Weise ordnen. In<br />

Schritt 3 ruft man k- bzw. m-mal ein Unterprogramm auf, das überprüft, ob eine Kantenmenge<br />

einen Kreis besitzt oder nicht. Durch Benutzung geeigneter Datenstrukturen<br />

kann man einen derartigen Aufruf in höchstens O(n) Schritten abarbeiten. Daraus folgt,<br />

dass Schritt 3 in höchstens O(mn) Schritten ausgeführt werden kann. Dies ist auch die<br />

Gesamtlaufzeit <strong>des</strong> Verfahrens. Mit speziellen “Implementierungstricks” kann die Laufzeit<br />

von Schritt 3 auf O(m + n log n) gesenkt und damit die Gesamtlaufzeit sogar auf<br />

O(m log m) Schritte reduziert werden. In der Literatur wird Algorithmus (5.9) häufig<br />

Kruskal-Algorithmus genannt.<br />

Einen gewichtsminimalen aufspannenden Baum kann man übrigens auch mit folgendem<br />

Verfahren finden.<br />

(5.11) “Dualer” Greedy-Algorithmus.<br />

Eingabe: Zusammenhängender Graph G = (V, E) mit Kantengewichten c(e) für alle<br />

e ∈ E.<br />

Ausgabe: Aufspannender Baum T ⊆ E minimalen Gewichts c(T ).<br />

1. (Sortieren): Numeriere die m Kanten <strong>des</strong> Graphen G, so dass gilt<br />

c(e1) ≥ c(e2) ≥ . . . ≥ c(em).<br />

2. Setze T := E.<br />

3. FOR i = 1 TO m DO:<br />

83

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!