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