Do 01.07.2010 - Lehrstuhl für Effiziente Algorithmen

Werbung
Grundlagen: Algorithmen und Datenstrukturen
Prof. Dr. Hanjo Täubig
Lehrstuhl für Effiziente Algorithmen
(Prof. Dr. Ernst W. Mayr)
Institut für Informatik
Technische Universität München
Sommersemester 2010
H. Täubig (TUM)
GAD
SS’10
1 / 389
Graphen
Übersicht
1
Graphen
Graphrepräsentation
Graphtraversierung
H. Täubig (TUM)
GAD
SS’10
347 / 389
Graphen
Graphrepräsentation
Adjazenzliste
1
1
5
2
4
3
2
3
2
1
3
4
5
3
... n=5
1
2
2
5
2
4
Unterschiedliche Varianten:
einfach/doppelt verkettet, linear/zirkulär
Vorteil:
Einfügen von Kanten in O(d) oder O(1)
Löschen von Kanten in O(d) (per Handle in O(1))
mit unbounded arrays etwas cache-effizienter
Nachteil:
Zeigerstrukturen verbrauchen relativ viel Platz und Zugriffszeit
H. Täubig (TUM)
GAD
SS’10
348 / 389
Graphen
Graphrepräsentation
Adjazenzliste + Hashtabelle
speichere Adjazenzliste (Liste von adjazenten Nachbarn bzw.
inzidenten Kanten zu jedem Knoten)
speichere Hashtabelle, die zwei Knoten auf einen Zeiger abbildet,
der dann auf die ggf. vorhandene Kante verweist
Zeitaufwand:
G.find(Key i, Key j): O(1) (worst case)
G.insert(Edge e): O(1) (im Mittel)
G.remove(Key i, Key j): O(1) (im Mittel)
Speicheraufwand:
H. Täubig (TUM)
O(n + m)
GAD
SS’10
349 / 389
Graphen
Graphrepräsentation
Implizite Repräsentation
Beispiel:
Gitter-Graph (grid graph)
definiert durch zwei Parameter k und `
= [1, . . . , k ] × [1, . . . , `]
n
o
E = ((i, j), (i, j 0 )) ∈ V 2 : |j − j 0 | = 1 ∪
n
o
((i, j), (i 0 , j)) ∈ V 2 : |i − i 0 | = 1
V
1,1
1,2
1,3
1,4
1,5
2,1
2,2
2,3
2,4
2,5
3,1
3,2
3,3
3,4
3,5
Kantengewichte könnten in 2 zweidimensionalen Arrays
gespeichert werden:
eins für waagerechte und eins für senkrechte Kanten
H. Täubig (TUM)
GAD
SS’10
350 / 389
Graphen
Graphtraversierung
Graphtraversierung
Problem:
Wie kann man die Knoten eines Graphen systematisch durchlaufen?
Grundlegende Strategien:
Breitensuche (breadth-first search, BFS)
Tiefensuche (depth-first search, DFS)
H. Täubig (TUM)
GAD
SS’10
351 / 389
Graphen
Graphtraversierung
Breitensuche
s
H. Täubig (TUM)
GAD
SS’10
352 / 389
Graphen
Graphtraversierung
Breitensuche
s
H. Täubig (TUM)
GAD
SS’10
353 / 389
Graphen
Graphtraversierung
Breitensuche
s
H. Täubig (TUM)
GAD
SS’10
354 / 389
Graphen
Graphtraversierung
Breitensuche
s
H. Täubig (TUM)
GAD
SS’10
355 / 389
Graphen
Graphtraversierung
Breitensuche
s
H. Täubig (TUM)
GAD
SS’10
356 / 389
Graphen
Graphtraversierung
Breitensuche
s
H. Täubig (TUM)
GAD
SS’10
357 / 389
Graphen
Graphtraversierung
Breitensuche
s
H. Täubig (TUM)
GAD
SS’10
358 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
359 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
360 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
361 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
362 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
363 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
364 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
365 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
366 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
367 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
368 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
369 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
370 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
371 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
372 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
373 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
374 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
375 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
376 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
377 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
378 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
379 / 389
Graphen
Graphtraversierung
Tiefensuche
s
H. Täubig (TUM)
GAD
SS’10
380 / 389
Graphen
Graphtraversierung
Breitensuche
d(v):
Distanz von Knoten v zu s (d(s) = 0)
3
2
4
1
3
3
4
1
2
0
2
H. Täubig (TUM)
GAD
SS’10
381 / 389
Graphen
Graphtraversierung
Breitensuche
parent(v):
Knoten, von dem v entdeckt wurde
parent wird beim ersten Besuch von §v gesetzt (⇒ eindeutig)
3
2
4
1
3
3
4
1
2
0
2
H. Täubig (TUM)
GAD
SS’10
382 / 389
Graphen
Graphtraversierung
Breitensuche
Kantentypen:
Baumkanten:
zum Kind
Rückwärtskanten:
Kreuzkanten:
zu einem Vorfahren
sonstige
3
2
4
1
3
3
4
1
2
0
2
H. Täubig (TUM)
GAD
SS’10
383 / 389
Graphen
Graphtraversierung
Breitensuche
void BFS(Node s) {
d[s] = 0;
parent[s] = s;
List<Node> q = hsi;
while (!q.empty()) {
u =q.popFront();
foreach ((u, v) ∈ E) {
if (parent[v] == null) {
q.pushBack(v);
d[v] = d[u]+1;
parent[v] = u;
}
}
}
}
H. Täubig (TUM)
GAD
SS’10
384 / 389
Herunterladen