Informatik II

Werbung
Informatik II ‐ SS 2014
(Algorithmen & Datenstrukturen)
Vorlesung 17 (8.7.2014)
Minimale Spannbäume II
Union‐Find, Prioritätswarteschlangen
Fabian Kuhn
Algorithmen und Komplexität
Fabian Kuhn
Informatik II, SS 2014
Minimaler Spannbaum
Gegeben: Zus.‐hängender, ungerichteter Graph Kantengewichten ∶ →
, ,
mit
Minimaler Spannbaum ,
:
• Spannbaum mit kleinstem Gesamtgewicht
1
1
2
3
9
3
15
3
7
8
4
2
6
1
6
5
8
Fabian Kuhn
6
9
Informatik II, SS 2014
7
2
Basis‐MST‐Algorithmus
Invariante:
Algorithmus hat zu jeder Zeit eine Kantenmenge , so dass
Teilmenge eines minimalen Spannbaums ist.
Basis‐MST‐Algorithmus:
= ∅
while
ist kein Spannbaum do
,
für
Finde sichere Kante
= ∪
,
return
• Invariante ist eine gültige Schleifeninvariante
• Invariante + Abbruchbedingung ⟹
Fabian Kuhn
Informatik II, SS 2014
ist ein MST!
3
Wie findet man sichere Kanten?
• Invariante  es gibt immer mindestens eine sicher Kante
–
ist Teilmenge eines MST und kann daher zu einem MST erweitert werden
• Zuerst benötigen wir ein paar Begriffe…
Schnitt
,
∖
:
• Kante , ∈ ist eine Schnittkante bezüglich , ∖ , falls ein
Ende in und ein Ende in ∖ ist.
• Wir nennen Kante , eine leichte Schnittkante bez. , ∖ , falls sie das kleinste Gewicht von allen Schnittkanten hat
Fabian Kuhn
Informatik II, SS 2014
4
Sichere Kanten
Annahmen:
•
, ,
ist zus.‐h., unger. Graph mit Kantengewichten •
ist Teilmenge (Teilgraph) eines MST
Theorem: Sei , ∖ ein Schnitt, so dass keine Schnittkanten
enthält und sei , , ∈ , ∈ ∖ eine leichte Schnittkante
bezüglich , ∖ . Dann ist , eine sichere Kante für .
1
1
3
9
3
2
15
3
7
8
4
2
6
6
1
5
8
Fabian Kuhn
6
9
7
Informatik II, SS 2014
5
Kruskal’s MST‐Algorithmus
= ∅
while
ist kein Spannbaum do
,
ist Kante mit kleinstem Gewicht,
,
keinen Zyklus enthält
so dass ∪
= ∪
,
• Wir müssen zeigen, dass eine sichere Kante für
Fabian Kuhn
Informatik II, SS 2014
ist
6
Kruskal’s MST‐Algorithmus: Beispiel
1
3
13
6
10
23
4
14
21
2
7
28
31
16
17
9
19
25
12
8
20
18
Fabian Kuhn
11
Informatik II, SS 2014
7
Kruskal’s MST‐Algorithmus: Bemerkungen
Kruskal’s Algorithmus berechnet minimalen Spannbaum
• Die hinzugefügte Kante ist in jedem Schritt sicher
• Wir haben gesehen, dass der Basis‐Algorithmus korrekt ist
Kruskal’s Algorithmus ist ein typisches Beispiel eines sogenannten
Greedy Algorithmus
• Wir beginnen mit einer leeren Kantenmenge
• In jedem Schritt wird die im Moment beste Kante hinzugenommen
• Eine gewählte Kante wird nie wieder verworfen
• Wir werden noch kurz besprechen, wie man den Algorithmus effizient implementieren kann...
Fabian Kuhn
Informatik II, SS 2014
8
Implementierung Kruskal’s Algorithmus
Kruskal’s Algorithmus (Pseudo‐Code)
1.
= ∅
2. Sortiere Kanten aufsteigend nach Kantengewicht
3. for
= , ∈ (in sorted order) do
4.
if
and are in different components then
5.
= ∪
Fabian Kuhn
Informatik II, SS 2014
9
Implementierung Kruskal’s Algorithmus
Kruskal’s Algorithmus (Pseudo‐Code)
1.
= ∅
2. Sortiere Kanten aufsteigend nach Kantengewicht
3. for
= , ∈ (in sorted order) do
4.
if
and are in different components then
5.
= ∪
• Müssen Komponenten des durch
verwalten können
bestimmten Graphen effizient
• Laufzeit:
log für’s Sortieren, sowie die Gesamtzeit, um die Komponenten zu verwalten…
Fabian Kuhn
Informatik II, SS 2014
10
Union‐Find / Disjoint Sets Datentyp
Verwaltet eine Partition von Elementen
Operationen:
• create
• U.makeSet(x)
• U.find(x)
• U.union(S1, S2)
: erzeugt eine leere Union‐Find‐DS
: fügt Menge zur Partition hinzu
: gibt Menge mit Element zurück
: vereinigt die Mengen 1 und 2
• Details dazu werden in der Algorithmentheorie besprochen… Fabian Kuhn
Informatik II, SS 2014
11
Kruskal mit Union‐Find
Kruskal’s Algorithmus
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
= ∅
U = create new for all ∈ do
U.makeSet( )
Sortiere Kanten aufsteigend nach Kantengewicht
for all
= , ∈ (in sorted order) do
= U.find( ); = U.find( )
if then
= ∪
U.union( , )
Fabian Kuhn
Informatik II, SS 2014
12
Kruskal: Laufzeitanalyse
Beste Union‐Find Datenstruktur
• Laufzeit für Union‐Find‐Operationen auf Elementen
( makeSet‐Operationen):
⋅
•
,
, ist die Inverse der Ackermannfunktion und wächst extrem
langsam (für alle halbwegs vernünftigen , , ,
5)
Laufzeit Kruskal
• Kanten sortieren: ⋅ log
• Union‐Find‐Operationen: • Insgesamt: ⋅
,
⋅ log
– besser, falls Kantengewichte schneller sortiert werden können
Fabian Kuhn
Informatik II, SS 2014
13
MST Eindeutigkeit
• Im Allgemeinen ist der MST nicht eindeutig
Satz: Bei paarweise verschiedenen Kantengewichten ist der MST eindeutig.
Fabian Kuhn
Informatik II, SS 2014
14
Prim’s MST Algorithmus
• Sollte man wohl eigentlich Jarvík’s Algorithmus nennen
– wurde 1957 von Prim und bereits 1930 von Jarvík publiziert
• Eine zweite Implementierung des Basis‐Algorithmus
= ∅
while
ist kein Spannbaum do
Finde sichere Kante
,
für
= ∪
,
return
• Idee: ist immer ein zusammenhängender Teilbaum
– Starte bei einem beliebigen Knoten ∈
– Baum wächst von aus, indem immer eine leichte Schnittkante des durch
induzierten Schnitts hinzugefügt wird.
Fabian Kuhn
Informatik II, SS 2014
15
Sichere Kanten
Annahmen:
•
, ,
ist zus.‐h., unger. Graph mit Kantengewichten •
ist Teilmenge (Teilgraph) eines MST
Theorem: Sei , ∖ ein Schnitt, so dass keine Schnittkanten
enthält und sei , , ∈ , ∈ ∖ eine leichte Schnittkante
bezüglich , ∖ . Dann ist , eine sichere Kante für .
1
1
3
9
3
2
15
3
7
8
4
2
6
6
1
5
8
Fabian Kuhn
6
9
7
Informatik II, SS 2014
16
Prim’s MST‐Algorithmus
= ∅
while
ist kein Spannbaum do
,
ist Kante mit kleinstem Gewicht,
so dass ∈ und ∉
= ∪
,
• Wir müssen zeigen, dass eine sichere Kante für
Fabian Kuhn
Informatik II, SS 2014
ist
17
Prim’s MST‐Algorithmus: Beispiel
1
3
13
6
10
23
4
14
21
2
7
28
31
16
17
9
19
25
12
8
20
18
Fabian Kuhn
11
Informatik II, SS 2014
18
Implementierung von Prim’s Algorithmus
• Knoten, welche im Teilbaum
• Knoten : –
–
sind, heissen markiert
ist der nächste Nachbar von im durch
dist
,
(oder ∞ falls bestimmten Teilbaum
NULL)
for all ∈ ∖
do
= NULL
.marked = false; = ∞; = 0; = ∅
// Wir starten bei Knoten
while there are unmarked nodes do
= unmarked node with minimal for all neighbors of do
if ,
then
= ; = ,
.marked = true
if
then
= ∪
,
Fabian Kuhn
Informatik II, SS 2014
19
Prioritätswarteschlange
Heap / Priority Queue:
• Verwaltet eine Menge von (key,value)‐Paaren
Operationen:
• create
• H.insert(x, key)
• H.getMin()
• H.deleteMin()
: erzeugt einen leeren Heap : fügt Element x mit Schlüssel key ein
: gibt Element mit kleinstem Schlüssel zurück
: löscht Element mit kleinstem Schlüssel
(gibt Element mit kleinstem Schlüssel zurück)
• H.decreaseKey(x, newkey) : Falls newkey kleiner als der aktuelle Schlüssel von x ist, wird der Schlüssel
von x auf newkey gesetzt
Fabian Kuhn
Informatik II, SS 2014
20
Implementierung von Prim’s Algorithmus
for all ∈ ∖
do
.marked = false; = 0; = ∅
= NULL
= ∞; // Wir starten bei Knoten
while there are unmarked nodes do
= unmarked node with minimal for all neighbors ,
if = ; of do
then
= ,
.marked = true
if
then
= ∪
Fabian Kuhn
,
Informatik II, SS 2014
21
Implementierung von Prim’s Algorithmus
= new priority queue; = ∅
for all ∈ ∖
do
.insert( , ∞); = NULL
.insert( , 0)
while
is not empty do
= H.deleteMin()
for all neighbors of do
,
then
if
.decreaseKey( , = if
Fabian Kuhn
then
= ∪
,
)
,
Informatik II, SS 2014
22
Analyse von Prim’s MST‐Algorithmus
Anzahl Priority Queue Operationen
• create
• insert
• getMin / deleteMin
• decreaseKey
Gesamt‐Laufzeit
Fabian Kuhn
Informatik II, SS 2014
23
Prioritätswarteschlangen
Implementierung als Binärbaum mit Min‐Heap Eigenschaft
• Die Datenstruktur heisst deshalb oft auch Heap
• Ein Baum hat die Min‐Heap Eigenschaft, falls in jedem Teilbaum, die Wurzel den kleinsten Schlüssel hat
• getMin‐Operation: trivial!
• Baum wird immer so balanciert, wie möglich gehalten
Fabian Kuhn
Informatik II, SS 2014
24
Prioritätswarteschlangen: Einfügen
3
10
13
12
17
Fabian Kuhn
7
23
9
14
Informatik II, SS 2014
25
Prioritätswarteschlangen: Delete‐Min
3
10
7
13
11
17
Fabian Kuhn
14
23
9
16
Informatik II, SS 2014
26
Prioritätswarteschlangen: Decrease‐Key
3
10
7
13
11
17
Fabian Kuhn
14
16
23
17
9
24
Informatik II, SS 2014
27
Herunterladen