• Keine Ergebnisse gefunden

Kapitel 8 Graphenalgorithmen

N/A
N/A
Protected

Academic year: 2022

Aktie "Kapitel 8 Graphenalgorithmen"

Copied!
248
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Kapitel 8

Graphenalgorithmen

Minimaler Spannbaum

Union-find-Problem

Kürzeste Wege

(2)

Graphenalgorithmen

Rückblick

Graphen

Modelle für Objekte und Beziehungen untereinander

Personen - Bekanntschaften

Bahnhöfe - Zugverbindungen

Ereignisse - Abhängigkeiten

Schachstellungen - Erreichbarkeit

(3)

Graphenalgorithmen

Rückblick

gerichteter Graph ungerichteter Graph

(4)

Graphenalgorithmen

Minimaler Spannbaum

Anwendung: Bestimmung möglichst kostengünstiger Verkehrs- oder

Versorgungsnetze

(5)

Graphenalgorithmen

Minimaler Spannbaum - Definitionen

Definition

Sei G=(V,E,c) ein ungerichteter zusammenhängender Graph mit Kantenbewertung, also (V,E) ungerichteter zusammenhängender Graph und c: E→IN eine

Kostenfunktion. Ein Spannbaum B für G ist ein Baum, der alle Knoten von G enthält, zusammenhängend ist

und dessen Kantenmenge E'⊆E ist. Die Kosten c(B) des Spannbaums sind die Summe der Kosten seiner Kanten.

Genauer: B=(V,E',c) ist Spannbaum für G=(V,E,c), falls E'⊆E und B zusammenhängend ist: c(B)=Σe∈E' c(e).

Gesucht: Spannbaum zu G mit minimalen Kosten.

(6)

Graphenalgorithmen

Minimaler Spannbaum - Beispiel

(7)

Graphenalgorithmen

Minimaler Spannbaum - Beispiel

5

7

1 2 1 4

1

6

(8)

Graphenalgorithmen

Minimaler Spannbaum - Beispiel

5

7

1 2 1 4

1

6

(9)

Graphenalgorithmen

Minimaler Spannbaum - Beispiel

7

1 2 1 4

Kosten: 1+1+4+2+7=15

(10)

Graphenalgorithmen

Minimaler Spannbaum - Vorgehen

Zentrales Algorithmenmuster: greedy- Verfahren (greedy=gierig):

Wähle Lösungsschritte so, daß sie sich mit jedem Schritt der Lösung näherbringen und nimm nie einen Schritt zurück.

Hier: ein Rechenschritt=Wahl einer Kante und Hinzufügen zum Spannbaum(-fragment)

Kante wird nie wieder entfernt

Sobald Baum Spannbaum, fertig.

(11)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Korrektheit des Verfahrens beruht auf Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der Knotenmenge V. Sei {u,w} eine Kante in G mit minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}. Dann gibt es einen minimalen Spannbaum für G, der {u,w}

enthält.

(12)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

(13)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

(14)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

U

(15)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

U W

(16)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

U W

c

(17)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

U W

c c'

(18)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

U W

c c'

c''

(19)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

U W

c c'

c'' c'''

(20)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

U W

c c'

c'' c''' u

w

(21)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Lemma

Sei G=(V,E) ein Graph und {U,W} eine

Zerlegung der

Knotenmenge V. Sei {u,w}

eine Kante in G mit

minimalen Kosten unter allen Kanten {{u',w'} | u'∈U, w'∈W}.

Dann gibt es einen

minimalen Spannbaum für G, der {u,w} enthält.

U W

c c'

c'' c''' u

w

(22)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Beweis: Seien U, W, {u,w} wie im Lemma und

T=(V,Ē) ein minimaler Spannbaum für G, der {u,w}

nicht enthält. Dann gibt es mindestens eine Kante, die U mit W verbindet.

Fügt man {u,w} hinzu, so entsteht ein Graph T' mit einem Zyklus, der über {u,w} läuft.

U

W

u' w'

(23)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Beweis: Seien U, W, {u,w} wie im Lemma und

T=(V,Ē) ein minimaler Spannbaum für G, der {u,w}

nicht enthält. Dann gibt es mindestens eine Kante, die U mit W verbindet.

Fügt man {u,w} hinzu, so entsteht ein Graph T' mit einem Zyklus, der über {u,w} läuft.

U u W

w

u' w'

(24)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Beweis: Seien U, W, {u,w} wie im Lemma und

T=(V,Ē) ein minimaler Spannbaum für G, der {u,w}

nicht enthält. Dann gibt es mindestens eine Kante, die U mit W verbindet.

Fügt man {u,w} hinzu, so entsteht ein Graph T' mit einem Zyklus, der über {u,w} läuft.

U u W

w

u' w'

(25)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Beweis: Seien U, W, {u,w} wie im Lemma und

T=(V,Ē) ein minimaler Spannbaum für G, der {u,w}

nicht enthält. Dann gibt es mindestens eine Kante, die U mit W verbindet.

Fügt man {u,w} hinzu, so entsteht ein Graph T' mit einem Zyklus, der über {u,w} läuft.

U u W

w

u' w'

(26)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

Beweis: Seien U, W, {u,w} wie im Lemma und

T=(V,Ē) ein minimaler Spannbaum für G, der {u,w}

nicht enthält. Dann gibt es mindestens eine Kante, die U mit W verbindet.

Fügt man {u,w} hinzu, so entsteht ein Graph T' mit einem Zyklus, der über {u,w} läuft.

U u W

w

u' w'

(27)

Graphenalgorithmen

Minimaler Spannbaum - Korrektheit

u muß also noch auf einem anderen Weg mit w

verbunden sein, der mind. eine weitere Kante {u',w'}

enthält, die U mit W verbindet. Löscht man {u',w'}, so entsteht ein Spannbaum T'', dessen Kosten höchstens so hoch sind wie die von T, da {u,w} minimale Kosten hat. Also ist T'' minimaler Spannbaum, der {u,w}

enthält.

U u W

w

u' w'

(28)

Graphenalgorithmen

Spannbaum - Kruskal-Algorithmus

Algorithmus von Kruskal:

Beginne mit T=(V,∅)

Sortiere Kanten aufsteigend nach Gewichten

Nimm fortlaufend billigste Kante, die noch

verfügbar ist und die zwei Komponenten von T verbindet, zu hinzu, bis T nur noch eine

Komponente hat

(29)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(30)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(31)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(32)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(33)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(34)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(35)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(36)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(37)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(38)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(39)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(40)

Graphenalgorithmen

Kruskal-Algorithmus - Beispiel

5

7

1 2 1 4

1

6

(41)

Graphenalgorithmen

Spannbaum - Kruskal-Algorithmus

var P: Partition (Zerlegung) der Knoten von V Q: Heap von Kanten geordnet nach

Gewichten, Minimum an der Wurzel begin

P:={{x} | x∈V}; T:=(V,∅); n:=|V|;

initialisiere Q mit allen Kanten nach Kosten aufsteigend sortiert;

(42)

Graphenalgorithmen

Spannbaum - Kruskal-Algorithmus

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

finde Komponenten, in denen v und w liegen

vereinige Komponenten, bilde neue Partition

nimm {v,w} zu Spannbaum

(43)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

var P: Partition (Zerlegung) der Knoten von V Q: Heap von Kanten geordnet nach

Gewichten, Minimum an der Wurzel begin

P:={{x} | x∈V}; T:=(V,∅); n:=|V|;

initialisiere Q mit allen Kanten nach Kosten aufsteigend sortiert;

(44)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

var P: Partition (Zerlegung) der Knoten von V Q: Heap von Kanten geordnet nach

Gewichten, Minimum an der Wurzel begin

P:={{x} | x∈V}; T:=(V,∅); n:=|V|;

initialisiere Q mit allen Kanten nach Kosten aufsteigend sortiert;

O(n)

(45)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

var P: Partition (Zerlegung) der Knoten von V Q: Heap von Kanten geordnet nach

Gewichten, Minimum an der Wurzel begin

P:={{x} | x∈V}; T:=(V,∅); n:=|V|;

initialisiere Q mit allen Kanten nach Kosten aufsteigend sortiert;

(46)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

var P: Partition (Zerlegung) der Knoten von V Q: Heap von Kanten geordnet nach

Gewichten, Minimum an der Wurzel begin

P:={{x} | x∈V}; T:=(V,∅); n:=|V|;

initialisiere Q mit allen Kanten nach Kosten aufsteigend sortiert;

Aufbau eines Heaps mit |E|

Elementen:

O(|E|log|E|)

(47)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

(48)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

Löschen der Wurzel, Heap umorganisieren:

O(log|E|)

(49)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

(50)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

union-find-Problem:

union: O(1) find: O(log |E|)

(51)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

(52)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

|V| Schleifendurchläufe

(53)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

(54)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

while n>1 do begin

(Q,{v,w}):=deletemin(Q);

a:=find(P,v); b:=find(P,w);

if a≠b then begin

T:=T+{v,w};

P:=union(P,a,b);

n:=n-1 end

end

Gesamt:

O(|E| log |E|)=O(|E| log |V|)

(55)

Graphenalgorithmen

Kruskal-Algorithmus - Laufzeiten

Satz

Unter der Annahme der Laufzeiten für union und find benötigt der Kruskal-Algorithmus

zur Bestimmung eines minimalen Spannbaums für einen Graphen G=(V,E)

O(|E| log |V|) Zeit.

(56)

Graphenalgorithmen

Union-find-Problem

Klassisches und in vielen Zusammenhängen auftretendes Problem

Gesucht: effiziente Implementierung von Folgen von Operationen bestehend aus Vereinigung und Element-Abfrage auf Mengen

(57)

Graphenalgorithmen

Union-find-Problem - Grundlagen

Sei S eine Menge und P eine Partition (disjunkte Zerlegung) von S in Teilmengen:

P={p1,...,pn} mit pi∩pj=∅, i≠j,

pi=S.

Wichtige Operationen:

union(P,pi,pj):=pi∪pj und Erzeugung von P'

find(P,x):=i für x∈S und x∈pi.

Ziel: effiziente Implementierung von Folgen von union-/find-Operationen

(58)

Graphenalgorithmen

Union-find-Problem - Idee: Wurzelgraph

Idee: Implementiere Mengen durch sog.

Wurzelgraphen Definition

Ein Wurzelgraph ist ein gerichteter

Graph, dessen ungerichtete Version ein Baum ist. Alle (gerichteten) Kanten sind von den

Söhnen zu den Vätern gerichtet. Die Wurzel besitzt eine (gerichtete) Schlinge.

(59)

Graphenalgorithmen

Union-find-Problem - Wurzelgraph

7

8 2

4 6

{2,7,4,8,6}

(60)

Graphenalgorithmen

Union-find-Problem - Wurzelgraph

7

8 2

4 6

{2,7,4,8,6}

kanonisches Element

(61)

Graphenalgorithmen

Union-find-Problem - Wurzelgraph

2

8 4 6

7 {2,7,4,8,6}

(62)

Graphenalgorithmen

Union-find-Problem - Wurzelgraph

2 3

Partition: {{2,3},{4,6,5},{1,8,7,9,10},{0}}

6

4

5

8

1 7 9

10 0

(63)

Graphenalgorithmen

Union-find-Problem - Union

2 3

6

4

5

union(P,2,6)

(64)

Graphenalgorithmen

Union-find-Problem - Union

2 3

6

4

5

union(P,2,6)

(65)

Graphenalgorithmen

Union-find-Problem - Union

2 3

6

4

5

union(P,2,6)

(66)

Graphenalgorithmen

Union-find-Problem - Union

2 3

6

4

5

union(P,2,6)

(67)

Graphenalgorithmen

Union-find-Problem - Union

2 3

6

4

5

union(P,2,6)

(68)

Graphenalgorithmen

Union-find-Problem - Union

2 3

6

4

5

union(P,2,6)

(69)

Graphenalgorithmen

Union-find-Problem - Union

2 3

6

4

5

union(P,2,6)

(70)

Graphenalgorithmen

Union-find-Problem - Union

2 3

6

4

5 Laufzeit: O(1)

union(P,2,6)

(71)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

6

(72)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(73)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(74)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(75)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(76)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(77)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(78)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(79)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(80)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(81)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(82)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(83)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(84)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

6

(85)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

66

(86)

Graphenalgorithmen

Union-find-Problem - find

2 3

Laufzeit: O(h); h: Höhe des Baums, in dem x liegt 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

66

(87)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

66

(88)

Graphenalgorithmen

Union-find-Problem - find

2

3 4

5

8

1 7 9

10 0 find(P,x)

0 1 2 3 4 5 6 7 8 9 10

66

Wie hoch können die Bäume werden?

(89)

Graphenalgorithmen

Union-find-Problem - Algorithmen

var p: array[element] of element;

procedure union(p,a,b);

begin

p[b]:=a end;

function find(p,x): element;

var y: element;

begin y:=x;

while p[y]y do y:=p[y];

find:=y end.

(90)

Graphenalgorithmen

Union-find-Problem - Baumhöhe

Wie hoch können die Wurzelgraphen werden?

Trick:

Mache bei einer Vereinigung zweier Bäume a und b die Wurzel des größeren (höheren) Baums zur Wurzel des gesamten Baums (bei gleichen Größen bel. wählen)

Konsequenz: Bäume wachsen nicht.

Notwendig: Höhenvariable in jedem (Wurzel-)Knoten

(91)

Graphenalgorithmen

Union-find-Problem - Baumhöhe

Lemma:

Die Operation union garantiert die folgende Eigenschaft aller Wurzelgraphen: Ein Baum der Höhe h≥1 hat wenigstens 2h-1 Knoten.

Beweis:

Seien T1, T2 zwei Bäume mit den Größen g(T1) und g(T2), die vereinigt werden sollen; h1, h2

seien Höhen von T1 und T2. O.B.d.A. g(T1)≥g(T2).

(92)

Graphenalgorithmen

Union-find-Problem - Baumhöhe

Situation:

Nach Vor. gilt: Ti hat mind. 2h -1 Knoten, i=1,2.

T1 T2

h1 h2

T

i

(93)

Graphenalgorithmen

Union-find-Problem - Baumhöhe

Situation:

Nach Vor. gilt: Ti hat mind. 2h -1 Knoten, i=1,2.

T1 T2

h1 h2

T

i

Fall 1

(94)

Graphenalgorithmen

Union-find-Problem - Baumhöhe

Situation:

Nach Vor. gilt: Ti hat mind. 2h -1 Knoten, i=1,2.

T1 T2

h1 h1=h2

T

i

Fall 2

(95)

Graphenalgorithmen

Union-find-Problem - Baumhöhe

Fall 1: h(T)=max{h1,h2}=h1

Dann: g(T)=g(T1)+g(T2)≥2h -1+2h -1≥2h -1 Fall 2: h(T)=max{h1,h2}+1

Dann gilt wegen der Annahmen h(T)=h2+1.

Ferner: g(T1)≥g(T2)≥2h -1. Also g(T)=g(T1)+g(T2)≥2.2h -1=2h .

1 2 1

2

2 2

(96)

Graphenalgorithmen

Union-find-Problem - Baumhöhe

Folgerung:

Durch iterierte Vereinigung gilt bei einer Anfangsmenge von n Objekten in der

Grundmenge S, also n einzelnen Mengen

(Wurzelgraphen) mit je einem Objekt (Knoten):

Alle entstehenden Bäume haben Höhen h≤log2

n.

Folgerung: find(P,x) läuft in O(log n) Operationen.

(97)

Graphenalgorithmen

Union-find-Problem - Speicher

Bemerkung zum Speicher:

O(n log n) zusätzliche Bits für die Größe jedes Teilbaums.

Optimierung:

Speichere nicht Größen, sondern Höhen im Wurzelknoten: O(n log log n) zusätzliche Bits.

(98)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beobachtung:

Folgen von n find-Operationen benötigen Aufwand O(n log n).

Idee:

Verkürze bei jedem find die Länge der

durchlaufenen Wege auf 1, indem alle Knoten zu direkten Söhnen der Wurzel gemacht

werden.

(99)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

(100)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

(101)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

(102)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(103)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(104)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(105)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(106)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(107)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(108)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(109)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(110)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(111)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(112)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(113)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(114)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(115)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Beispiel:

2

8 4 6

3 7 9

11 5

9

find(11)→2

11

(116)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

Ergebnis [Tarjan/van Leeuwen 1975,1984]:

Der Aufwand für n find-Operationen reduziert sich auf

O(n.α(n)).

α ist die inverse Funktion der Ackermann- Funktion.

(α(n)=4 für alle praktisch auftretenden Werte n.)

(117)

Graphenalgorithmen

Union-find-Problem - Pfadkompression

α ist die inverse Funktion der Ackermann-Funktion A:

A(1,j)=2j, j1

A(i,1)=A(i-1,2), i≥2

A(i,j)=A(i-1,A(i,j-1)), i,j2.

α(n)=min {i1 | A(i,1)>log n}, α(n)≤3 für n<216

α(n)=4 für alle praktisch auftretenden Werte n.

(118)

Graphenalgorithmen

Kürzeste Wege

Aufgabe: Bestimmung aller kürzesten Wege von einem festen Knoten s (source) zu allen anderen Knoten eines ungerichteten Graphen G=(V,E,c) mit Kostenfunktion c: E→IR+.

single-source shortest paths problem

all-pairs shortest paths problem

Beachte: “IR+”. Nimmt man negative Kanten hinzu, können kürzeste Wege -∞ lang sein.

1 -3 -1

2 -1

(119)

Graphenalgorithmen

Kürzeste Wege

Aufgabe: Bestimmung aller kürzesten Wege von einem festen Knoten s (source) zu allen anderen Knoten eines ungerichteten Graphen G=(V,E,c) mit Kostenfunktion c: E→IR+.

single-source shortest paths problem

all-pairs shortest paths problem

Beachte: “IR+”. Nimmt man negative Kanten hinzu, können kürzeste Wege -∞ lang sein.

1 -3 -1

2 -1

(120)

Graphenalgorithmen

Kürzeste Wege

Aufgabe: Bestimmung aller kürzesten Wege von einem festen Knoten s (source) zu allen anderen Knoten eines ungerichteten Graphen G=(V,E,c) mit Kostenfunktion c: E→IR+.

single-source shortest paths problem

all-pairs shortest paths problem

Beachte: “IR+”. Nimmt man negative Kanten hinzu, können kürzeste Wege -∞ lang sein.

1 -3 -1

2 -1

-2

(121)

Graphenalgorithmen

Kürzeste Wege - Begriffe

Begriffe:

Weg: p=(v0,v1,...,vk), falls {vi,vi+1}∈E, i=0,...,k-1

Kosten: c(p)=∑i=0k-1c({vi,vi+1})

Abstand: d(v,v')=min{c(p) | p ist Weg von v nach v'}, falls es einen Weg von v nach v' gibt, sonst d(v,v')=

kürzester Weg sp(v,v'): Weg von v nach v' mit c(p)=d(v,v')

(122)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4

(123)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4 s

(124)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4 s

(125)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4 s

(126)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4 s

(127)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4 s

(128)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4 s

(129)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4 s

(130)

Graphenalgorithmen

Kürzeste Wege - Beispiel

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4 s

Kosten c(p)=12

(131)

Graphenalgorithmen

Kürzeste Wege - Lösungsidee

Idee:

Starte bei Knoten s eine kreisförmige

(äquidistante) Welle und halte fest, wann sie welchen Knoten erreicht.

(132)

Graphenalgorithmen

Kürzeste Wege - Optimalitätsprinzip

Optimalitätsprinzip:

Für jeden kürzesten Weg p=(v0,v1,...,vk) ist

jeder Teilweg p'= (vi,...,vj), 0≤i<j≤k, kürzester Weg von vi nach vj.

Nutzung für einen Greedy-Algorithmus (E.W. Dijkstra, 1959):

Baue kürzeste Teilwege durch Hinzunahme von Kanten zu kürzesten Wegen aus.

(133)

Graphenalgorithmen

Kürzeste Wege - Greedy-Beziehung

Greedy-Beziehung: Es gilt:

1. Für alle kürzesten Wege sp(s,v) und Kanten {v,v'} gilt:

c(sp(s,v))+c({v,v'})≥c(sp(s,v')) 2. Für wenigstens einen kürzesten Weg

sp(s,v) und eine Kante {v,v'} gilt:

c(sp(s,v))+c({v,v'})=c(sp(s,v'))

(134)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

(135)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

(136)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

(137)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

s

(138)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

s

Rand R

(139)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

s

Rand R

(140)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

s

Rand R

(141)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

s

Rand R

gewählt

(142)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Unterteile Knoten des Graphen in drei Gruppen:

gewählt: ein kürzester Weg von s ist bekannt

Rand R: ein Weg von s ist bekannt

unerreicht: klar.

s

Rand R

gewählt unerreicht

(143)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

Eingabe: G=(V,E,c) mit c: E→IR+, sV

Ausgabe: alle kürzesten Wege von s zu allen vV

for all v∈V\{s} do begin

v.Vorgänger:=undefiniert;

v.Abstand:=∞;

v.gewählt:=false end;

(144)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

s.Vorgänger:=s;

s. Abstand:=0;

s.gewählt:=true;

R:=∅;

add(R,s);

(145)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v) end;

(146)

Graphenalgorithmen

Kürzeste Wege - Algorithmus

procedure add(R,v);

for all {v,v'}∈E do

if not v'.gewählt and

(v.Abstand+c({v,v'})<v'.Abstand) then

v'.Vorgänger:=v;

v'.Abstand:=v.Abstand+c({v,v'});

R:=R+{v'}

end

(147)

Graphenalgorithmen

Kürzeste Wege - Implementierung

Schlüsselidee: Rand R als Heap implementieren

Einfügen: O(log |E|)=O(log |V|)

Minimum auswählen: O(1)+O(log |V|) für Umordnen des Heap

R:=∅: O(1)

Abfrage R=∅: O(1)

Sondersituation: Aktualisieren des Distanzwerts innerhalb add(R,v)

(148)

Graphenalgorithmen

Kürzeste Wege - Implementierung

Aktualisieren des Distanzwerts in R erlaubt der Heap nicht effizient

Ausweg: neues Tripel mit aktualisierten

Werten einfach zusätzlich in Heap einfügen; da dessen Distanzwert kleiner ist als der alte,

wird das korrekte Tripel ausgewählt

Achtung: Knoten aus veraltetem Tripel darf nicht noch einmal entfernt werden

(149)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

Eingabe: G=(V,E,c) mit c: E→IR+, sV

Ausgabe: alle kürzesten Wege von s zu allen vV

for all v∈V\{s} do begin

v.Vorgänger:=undefiniert;

v.Abstand:=∞;

v.gewählt:=false end;

O(|V|)

(150)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

s.Vorgänger:=s;

s. Abstand:=0;

s.gewählt:=true;

R:=∅;

add(R,s);

O(1)

(151)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v) end;

(152)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v) end;

O(1)

(153)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v) end;

(154)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v) end;

O(1)

(155)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v) end;

(156)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v)

end; O(log |V|)

(157)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v) end;

(158)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

while R≠ do begin

wähle vR mit v.Abstand minimal und entferne v aus R;

v.gewählt:=true;

add(R,v) end;

|E| mal

(159)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

procedure add(R,v);

for all {v,v'}∈E do

if not v'.gewählt and

(v.Abstand+c({v,v'})<v'.Abstand) then

v'.Vorgänger:=v;

v'.Abstand:=v.Abstand+c({v,v'});

R:=R+{v'}

end

(160)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

procedure add(R,v);

for all {v,v'}∈E do

if not v'.gewählt and

(v.Abstand+c({v,v'})<v'.Abstand) then

v'.Vorgänger:=v;

v'.Abstand:=v.Abstand+c({v,v'});

R:=R+{v'}

end O(log |V|)

(161)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

procedure add(R,v);

for all {v,v'}∈E do

if not v'.gewählt and

(v.Abstand+c({v,v'})<v'.Abstand) then

v'.Vorgänger:=v;

v'.Abstand:=v.Abstand+c({v,v'});

R:=R+{v'}

end

(162)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

procedure add(R,v);

for all {v,v'}∈E do

if not v'.gewählt and

(v.Abstand+c({v,v'})<v'.Abstand) then

v'.Vorgänger:=v;

v'.Abstand:=v.Abstand+c({v,v'});

R:=R+{v'}

end

wird in der Summe nur für |E| Kanten

ausgeführt

(163)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

procedure add(R,v);

for all {v,v'}∈E do

if not v'.gewählt and

(v.Abstand+c({v,v'})<v'.Abstand) then

v'.Vorgänger:=v;

v'.Abstand:=v.Abstand+c({v,v'});

R:=R+{v'}

end

(164)

Graphenalgorithmen

Kürzeste Wege - Laufzeit

Obiger Algorithmus läuft in Zeit O(|E| log |V|)

gut geeignet für dünne Graphen |E|≤c|V|

Alternativalgorithmus (s. Buch von Ottmann/

Widmayer) für dichte Graphen (|E|=O(|V|2) benötigt Zeit

O(|V|2)

(165)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

2

4

2 15

1 3 1

6

11

9 15

15 2 6

4

1 2

3

5 4

9 8

7 6

(166)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(167)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(168)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1)

(169)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1)

(170)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1) (2,2,1)

(171)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1) (2,2,1)

(172)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1) (2,2,1)(7,15,1)

(173)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1) (2,2,1)(7,15,1)

(174)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1) (2,2,1)(7,15,1)(6,9,1)

(175)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1) (2,2,1)(7,15,1)(6,9,1)

(176)

Graphenalgorithmen

Kürzeste Wege - Beispiel

gewählt Rand R

Darstellung:

(Knotennr, Distanz, Vorgänger)

(1,0,1) (2,2,1)(7,15,1)(6,9,1) (2,2,1)

Referenzen

ÄHNLICHE DOKUMENTE

Sei V die Menge aller Folgen in C, f¨ ur die nur endlich viele Folgenglieder ungleich

durch eine verbesserte Erschließung und Zusammenlegung •gesicherte rechtliche Verhältnisse • Unterstützung kommunaler Projekte Durch eine nachhaltige Bewirtschaftung

nisse der im Nachfolgenden zu beschreibenden Versuche zeigen, wie ich glaube, dass die Reihe der besser und sicherer wirkenden, als die bisherigen organischen De-

(a) Seien U, V Unterr¨ aume eines festen Vektorraumes. (Nicht zur Abgabe.)

Zum 01.01.2015 ist eine Anpassung der Lizenzbedingungen (Entfall der Creative Commons Lizenzbedingung „Keine Bearbeitung“) beabsichtigt, um eine Nachnutzung auch im Rahmen

Aufgabe 25 (Orthogonale Komplemente in ∞-dim.. Ist diese Darstellung f¨ ur V 6=

Das Abonnement verlängert sich automatisch um ein Jahr, wenn nicht 6 Wochen vor Jahresende (Eingang beim Verlag) schriftlich gekündigt wird.

Vorlesung: Signale und Systeme WS 2011 (Prof... Vorlesung: Signale und Systeme WS