• Keine Ergebnisse gefunden

Grundlagen der Algorithmen und Datenstrukturen Kapitel 11

N/A
N/A
Protected

Academic year: 2022

Aktie "Grundlagen der Algorithmen und Datenstrukturen Kapitel 11"

Copied!
21
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Grundlagen der Algorithmen und Datenstrukturen

Kapitel 11

Christian Scheideler + Helmut Seidl SS 2009

(2)

Minimaler Spannbaum

Zentrale Frage: Welche Kanten muss ich nehmen, um mit minimalen Kosten alle Knoten zu verbinden?

2

1

1

3 3

2

2

4 3

5 2

(3)

Minimaler Spannbaum

Eingabe:

• ungerichteter Graph G=(V,E)

• Kantenkosten c:E!IR+ Ausgabe:

• Teilmenge T µ E, so dass Graph (V,T) verbunden und c(T)=e 2 T c(e) minimal

• T formt immer einen Baum (wenn c positiv).

• Baum über alle Knoten in V mit minimalen Kosten: minimaler Spannbaum (MSB)

(4)

Minimaler Spannbaum

Lemma 11.1: Sei (S,T) eine Partition von V (d.h. S [ T = V und S \ T = ;) und e={s,t}

eine Kante mit minimalen Kosten mit s2S und t2T. Dann gibt es einen minimalen

Spannbaum (MSB) T, der e enthält.

s t

S e T

(5)

Minimaler Spannbaum

Beweis von Lemma 11.1:

• Betrachte beliebigen MSB T´

• e={s,t}: (S,T)-Kante minimaler Kosten

• Ersetzung von e´ durch e führt zu Baum T´´, der höchstens Kosten von MSB T´ hat, also MSB ist

s t

S T

e

in T´

(6)

Minimaler Spannbaum

Lemma 11.2: Betrachte beliebigen Kreis C in G und sei e Kante in C mit maximalen Kosten. Dann ist jeder MSB in G ohne e auch ein MSB in G.

2 5

3 4 1 5

3 2

e

(7)

Minimaler Spannbaum

Beweis von Lemma 11.2:

• Betrachte beliebigen MSB T in G

• Angenommen, T enthalte e

• : zu Tv, : zu Tw

- es gibt e´ von Tv nach Tw

- e ! e´ ergibt MSB T´ ohne e

Tv e

v w

Tw

e

C

e maximal für C

(8)

Minimaler Spannbaum

Regel aus Lemma 11.1:

Wähle wiederholt Kante mit minimalen

Kosten, die verschiedene ZHKs verbindet, bis eine ZHK übrig

2

1

1

3 3

2

2

4 3

5 2

(9)

Minimaler Spannbaum

Regel aus Lemma 11.2:

Lösche wiederholt Kante mit maximalen Kosten, die Zusammenhang nicht gefähr- det, bis ein Baum übrig

2

1

1

3 3

2

2

4 3

2 5

(10)

Minimaler Spannbaum

Problem: Wie implementiert man die Regeln effizient?

Strategie aus Lemma 11.1:

• Setze T=; und sortiere die Kanten aufsteigend nach ihren Kosten

• Für jede Kante (u,v) in der sortierten Liste, teste, ob u und v bereits im selben Baum in T sind. Falls nicht, füge (u,v) zu T hinzu.

(11)

Minimaler Spannbaum

Beispiel: ( : Kanten im MSB)

2

1

1

3 3

2

2

4 3

5 2

s

(12)

Kruskal Algorithmus

Set<Edge> KruskalMST(V,E,c) { T = ;;

S = sort(E); // aufsteigend sortiert foreach ((u,v) 2 S)

if (u, v in verschiedenen Bäumen in T) T = T [ {(u,v)};

return T;

}

benötigt effiziente Datenstruktur

(13)

Union-Find Datenstruktur

• Knoten seien nummeriert von 0 bis n-1

• Feld int parent[n]

• Anfangs: parent[i] = i; für alle i

int find(int I) {

if (parent[i] == i) return i; // i Wurzel des Baums?

else { // nein:

i’ = find(parent[i]); // suche Wurzel des Baums parent[i] = i’; // lass i direkt darauf zeigen return i’; // gib Wurzel zurück

}}

(14)

Union-Find Datenstruktur

• Knoten seien nummeriert von 0 bis n-1

• Feld int parent[n]

• Anfangs: parent[i]=i; für alle i

void union(int i, int j) {

int k = find(i); int l = find(j); // suche Wurzeln // falls verschieden, dann zusammen

if (k!=l) parent[k] = l;

}

(15)

Kruskal Algorithmus

Set<Edge> KruskalMST(Nodes V,Edges E) { T = ;; S = sort(E); // aufsteigend sortiert

for (int i=1; i<|V|; i++) parent[i] = i;

foreach ((u,v)2 S)

if (find(u) != find(v)) { // nicht verbunden T = T [ {(u,v)};

union(u,v); // u und v in einen Baum }

return T;

}

(16)

Union-Find Datenstruktur

• Die Kosten von find() hängen von der Tiefe der Datenstruktur ab. Wiederholtes Finden wird billiger!

• Um Kosten weiter zu verringern, hängen wir stets den kleineren Baum unter den größeren:

void union(int i, int j) {

int k = find(i); int l = find(j); // suche Wurzeln // falls verschieden, dann zusammen

if (k!=l) if (size[k] <= size[l]) { parent[k] = l;

size[l] = size[k]+size[l];

} else { parent[l] = k; size[k] = size[k]+size[l];}

}

(17)

Union-Find Datenstruktur

• Die Kosten von find wachsen nun

amortisiert proportional wie log* n !!!

• Die Kosten von union haben sich dabei nur unwesentlich erhöht.

Insgesamt ergeben sich dann Kosten:

O(m log n +m log* n).

(18)

Minimaler Spannbaum

Problem: Wie implementiert man die Regeln effizient?

Alternative Strategie aus Lemma 11.1:

• Starte bei beliebigem Knoten s, MSB T besteht anfangs nur aus s

• Ergänze T durch günstigste Kante zu

äußerem Knoten w und füge w zu T hinzu bis T alle Knoten im Graphen umfasst

(19)

Minimaler Spannbaum

Beispiel:

2

1

1

3 3

2

2

4 3

5 2

s

(20)

Jarnik-Prim Algorithmus

void JarnikPrim(Node s) { double [] d={1,…,1};

Node [] parent = new Node [n];

d[s] =0.; parent[s] = s; // T anfangs nur aus s PQ<Node> q = <s>;

while (q !=<>) {

u = q.deleteMin(); // u: min. Distanz zu T in q foreach (e=(u,v) 2 E)

if (c(e) < d[v]) { // aktualisiere d[v] zu T

if (d[v] == 1) q.insert(v); // v schon in q?

If (v 2 q) {

d[v] = c(e); parent[v] =u;

q.decreaseKey(v);

}}}

(21)

Jarnik-Prim Algorithmus

Laufzeit:

TJP = O(n(TDeleteMin(n)+TInsert(n)) + m¢ TdecreaseKey(n))

Binärer Heap: alle Operationen O(log n), also TJP = O((m+n)log n)

Fibonacci Heap (nicht in Vorlesung behandelt):

• TDeleteMin(n)=TInsert(n)=O(log n)

• TdecreaseKey(n)=O(1)

• Damit TJP = O(n log n + m)

Referenzen

ÄHNLICHE DOKUMENTE

Eingabe: Zutaten, Algorithmus: Rezept, Ausgabe: Essen. •

• liefert Garantien für die Effizienz des Algorithmus (wichtig für Robustheit) Exakte Formeln für t(n) sehr aufwendig. Einfacher:

belle T der Größe m&gt;2en mittels einer zufälligen Hashfunktion h gespeichert werden, dann ist für jedes T[i] die erwartete Länge eines Laufes in T, der T[i] enthält, O(1)..

Mergen zweier Teilfolgen mittels 3 Blöcken im internen Speicher (rote Kästen):..

• Hashing kann verwendet werden, um Keys von n Knoten in den Bereich {0,. …,O(n)}

Dann gilt (über Induktion) für jeden Weg p, dass d[s]+c(p) ≥ d[w] für alle Knoten w. Falls sichergestellt ist, dass

• Für die Teilmengen, die das i-te Objekt nicht enthalten, ist der Wert der optimalen Lösung gleich V[i-1][w]. • Für die Teilmengen, die Objekt i enthalten, ist der Wert

Problem: Verwaltung freier Blöcke in einem gege- benen Adressraum {0,…,m-1} zur effizienten Allokation und