Effiziente Algorithmen und Datenstrukturen I Kapitel 8 Krzeste

  • Slides: 83
Download presentation
Effiziente Algorithmen und Datenstrukturen I Kapitel 8: Kürzeste Wege Christian Scheideler WS 2008 3/2/2021

Effiziente Algorithmen und Datenstrukturen I Kapitel 8: Kürzeste Wege Christian Scheideler WS 2008 3/2/2021 Kapitel 8 1

Kürzeste Wege Zentrale Frage: Wie komme ich am schnellsten von A nach B? B

Kürzeste Wege Zentrale Frage: Wie komme ich am schnellsten von A nach B? B A 3/2/2021 Kapitel 8 2

Kürzeste Wege Zentrale Frage: Wie komme ich am schnellsten von A nach B? Fälle:

Kürzeste Wege Zentrale Frage: Wie komme ich am schnellsten von A nach B? Fälle: • Kantenkosten 1 • DAG, beliebige Kantenkosten • Beliebiger Graph, positive Kantenkosten • Beliebiger Graph, beliebige Kosten 3/2/2021 Kapitel 8 3

Einführung Kürzeste-Wege-Problem: • gerichteter Graph G=(V, E) • Kantenkosten c: E!IR • SSSP (single

Einführung Kürzeste-Wege-Problem: • gerichteter Graph G=(V, E) • Kantenkosten c: E!IR • SSSP (single source shortest path): Kürzeste Wege von einer Quelle zu allen anderen Knoten • APSP (all pairs shortest path): Kürzeste Wege zwischen allen Paaren 3/2/2021 Kapitel 8 4

Einführung 42 0 -1 5 -1 -1 0 +1 -1 -1 2 2 0

Einführung 42 0 -1 5 -1 -1 0 +1 -1 -1 2 2 0 s 0 -2 -3 -1 -2 -3 (s, v): Distanz zwischen s und v 1 (s, v) = -1 kein Weg von s nach v Weg bel. kleiner Kosten von s nach v min{ c(p) | p ist Weg von s nach v} 3/2/2021 Kapitel 8 5

Einführung 42 0 -1 5 -1 -1 0 +1 -1 0 -2 -3 2

Einführung 42 0 -1 5 -1 -1 0 +1 -1 0 -2 -3 2 0 s -1 2 -1 -2 -3 Wann sind die Kosten -1? Wenn es einen negativen Kreis gibt: s 3/2/2021 C v Kapitel 8 c(C)<0 6

Einführung Negativer Kreis hinreichend und notwendig für Wegekosten -1. Negativer Kreis hinreichend: s Weg

Einführung Negativer Kreis hinreichend und notwendig für Wegekosten -1. Negativer Kreis hinreichend: s Weg p Weg q C v c(C)<0 Kosten für i-fachen Durchlauf von C: c(p) + i¢c(C) + c(q) Für i! 1 geht Ausdruck gegen -1. 3/2/2021 Kapitel 8 7

Einführung Negativer Kreis hinreichend und notwendig für Wegekosten -1. Negativer Kreis notwendig: • l:

Einführung Negativer Kreis hinreichend und notwendig für Wegekosten -1. Negativer Kreis notwendig: • l: minimale Kosten eines einfachen Weges von s nach v • es gibt nichteinfachen Weg r von s nach v mit Kosten c(r)<l • r nicht einfach: Zerlegung in p. Cq, wobei C ein Kreis ist und pq einfacher Pfad • da c(r) < l 6 c(pq) ist, gilt c(C)<0 3/2/2021 Kapitel 8 8

Kürzeste Wege Graph mit Kantenkosten 1: Führe Breitensuche durch. 3 2 4 1 3

Kürzeste Wege Graph mit Kantenkosten 1: Führe Breitensuche durch. 3 2 4 1 3 3 1 4 s 2 2 3/2/2021 Kapitel 8 9

Kürzeste Wege in DAGs Reine Breitensuche funktioniert nicht. 2 1 4 2 1 1

Kürzeste Wege in DAGs Reine Breitensuche funktioniert nicht. 2 1 4 2 1 1 3 2 s 2 8 7 2 1 2 4 6 3/2/2021 1 1 3 1 2 9 5 1 Kapitel 8 10

Kürzeste Wege in DAGs Korrekte Distanzen: 2 1 4 2 1 1 3 2

Kürzeste Wege in DAGs Korrekte Distanzen: 2 1 4 2 1 1 3 2 s 2 5 4 2 1 2 4 4 3/2/2021 1 1 3 1 2 6 5 1 Kapitel 8 11

Kürzeste Wege in DAGs Strategie: nutze aus, dass Knoten in DAGs topologisch sortiert werden

Kürzeste Wege in DAGs Strategie: nutze aus, dass Knoten in DAGs topologisch sortiert werden können (alle b erfüllen a<b) Kanten a 4 2 2 1 3 s 3/2/2021 6 1 1 2 10 2 3 1 5 9 1 1 2 1 11 2 4 7 1 8 Kapitel 8 12

Kürzeste Wege in DAGs Strategie: betrachte dann Knoten in der Reihenfolge ihrer topologischen Sortierung

Kürzeste Wege in DAGs Strategie: betrachte dann Knoten in der Reihenfolge ihrer topologischen Sortierung und aktualisiere Distanzen zu s 4 1 2 1 s 3/2/2021 4 6 1 3 3 2 2 5 2 3 1 1 2 10 2 9 1 2 2 7 46 5 1 8 Kapitel 5 46 1 4 1 11 6 8 13

Kürzeste Wege in DAGs Strategie: 1. Topologische Sortierung der Knoten 2. Aktualisierung der Distanzen

Kürzeste Wege in DAGs Strategie: 1. Topologische Sortierung der Knoten 2. Aktualisierung der Distanzen gemäß der topologischen Sortierung Warum funktioniert das? ? 3/2/2021 Kapitel 8 14

Kürzeste Wege in DAGs Betrachte kürzesten Weg von s nach v. Dieser hat topologische

Kürzeste Wege in DAGs Betrachte kürzesten Weg von s nach v. Dieser hat topologische Sortierung (ti)i mit ti<ti+1 for alle i. t 1 s 0 t 2 c 1 d 1 c 2 t 3 t 4 t 5 d 2 d 3 d 4 c 3 c 4 v Besuch in topologischer Reihenfolge führt zu richtigen Distanzen (di = j<=i ci). 3/2/2021 Kapitel 8 15

Kürzeste Wege in DAGs Betrachte kürzesten Weg von s nach v. Dieser hat topologische

Kürzeste Wege in DAGs Betrachte kürzesten Weg von s nach v. Dieser hat topologische Sortierung (ti)i mit ti<ti+1 für alle i. t 1 s 0 t 2 c 1 d 1 c 2 t 3 t 4 t 5 d 2 d 3 d 4 c 3 c 4 v Bemerkung: kein Knoten auf dem Weg zu v kann Distanz < di zu s haben, da sonst kürzerer Weg zu v möglich wäre. 3/2/2021 Kapitel 8 16

Kürzeste Wege in Graphen Allgemeine Strategie: • Am Anfang, setze d(s): =0 und d(v):

Kürzeste Wege in Graphen Allgemeine Strategie: • Am Anfang, setze d(s): =0 und d(v): =1 für alle Knoten • besuche Knoten in einer Reihenfolge, die sicherstellt, dass mindestens ein kürzester Weg von s zu jedem v in der Reihenfolge seiner Knoten besucht wird • für jeden besuchten Knoten v, aktualisiere die Distanzen der Knoten w mit (v, w)2 E, d. h. setze d(w) : = min{d(w), d(v)+c(v, w)} 3/2/2021 Kapitel 8 17

Kürzeste Wege in DAGs Zurück zur Strategie: 1. Topologische Sortierung der Knoten 2. Aktualisierung

Kürzeste Wege in DAGs Zurück zur Strategie: 1. Topologische Sortierung der Knoten 2. Aktualisierung der Distanzen gemäß der topologischen Sortierung Wie führe ich eine topologische Sortierung durch? 3/2/2021 Kapitel 8 18

Kürzeste Wege in DAGs Topologische Sortierung: • Verwende eine FIFO Queue q • Anfangs

Kürzeste Wege in DAGs Topologische Sortierung: • Verwende eine FIFO Queue q • Anfangs enthält q alle Knoten, die keine eingehende Kante haben (Quellen). • Entnehme v aus q und markiere alle (v, w) 2 E. Falls alle Kanten nach w markiert sind und w noch nicht in q war, füge w in q ein. Wiederhole das, bis q leer ist. 3/2/2021 Kapitel 8 19

Kürzeste Wege in DAGs Beispiel: • : Knoten momentan in Queue q • Nummerierung

Kürzeste Wege in DAGs Beispiel: • : Knoten momentan in Queue q • Nummerierung nach Einfügereihenfolge 2 1 6 4 2 1 5 1 3 3 1 3/2/2021 2 2 1 1 10 9 2 1 2 4 7 11 8 Kapitel 20

Kürzeste Wege in DAGs Korrektheit der topologischen Nummerierung: Knoten wird erst dann nummeriert, wenn

Kürzeste Wege in DAGs Korrektheit der topologischen Nummerierung: Knoten wird erst dann nummeriert, wenn alle Vorgänger nummeriert sind. 2 1 6 4 2 1 5 1 3 3 1 3/2/2021 2 2 1 1 10 9 2 1 2 4 7 11 8 Kapitel 21

Kürzeste Wege in DAGs Laufzeit: Zur Bestimmung aller Knoten ohne eingehende Kante muss Graph

Kürzeste Wege in DAGs Laufzeit: Zur Bestimmung aller Knoten ohne eingehende Kante muss Graph einmal durchlaufen werden. Danach wird jeder Knoten und jede Kante genau einmal betrachtet, also Zeit O(n+m). 2 1 6 4 2 1 5 1 3 3 1 3/2/2021 2 2 1 1 10 9 2 1 2 4 7 11 8 Kapitel 22

Kürzeste Wege in DAGs Bemerkung: topologische Sortierung kann nicht alle Knoten nummerieren genau dann,

Kürzeste Wege in DAGs Bemerkung: topologische Sortierung kann nicht alle Knoten nummerieren genau dann, wenn Graph gerichteten Kreis enthält (kein DAG ist) Test auf DAG-Eigenschaft 2 1 6 4 2 1 5 1 3 3 1 3/2/2021 2 2 1 1 10 9 2 1 2 4 7 11 8 Kapitel 23

Kürzeste Wege in DAGs DAG-Strategie: 1. Topologische Sortierung der Knoten Laufzeit O(n+m) 2. Aktualisierung

Kürzeste Wege in DAGs DAG-Strategie: 1. Topologische Sortierung der Knoten Laufzeit O(n+m) 2. Aktualisierung der Distanzen gemäß der topologischen Sortierung Laufzeit O(n+m) Insgesamt Laufzeit O(n+m). 3/2/2021 Kapitel 8 24

Dijkstras Algorithmus Nächster Schritt: Kürzeste Wege für beliebige Graphen mit positiven Kanten. Problem: besuche

Dijkstras Algorithmus Nächster Schritt: Kürzeste Wege für beliebige Graphen mit positiven Kanten. Problem: besuche Knoten eines kürzesten Weges in richtiger Reihenfolge s w 0 d 1 d 2 d 3 d 4 v Lösung: besuche Knoten in der Reihenfolge der kürzesten Distanz zur Quelle s 3/2/2021 Kapitel 8 25

Dijkstras Algorithmus • Am Anfang, setze d(s): =0 und d(v): =1 für alle Knoten.

Dijkstras Algorithmus • Am Anfang, setze d(s): =0 und d(v): =1 für alle Knoten. Füge s in Priority Queue q ein, wobei die Prioritäten in q gemäß der aktuellen Distanzen d(v) definiert sind. • Wiederhole, bis q leer ist: Entferne aus q (delete. Min) den Knoten v mit niedrigstem d(v). Für alle (v, w)2 E, setze d(w) : = min{d(w), d(v)+c(v, w)}. Falls w noch nicht in q war, füge w in q ein. 3/2/2021 Kapitel 8 26

Dijkstras Algorithmus Beispiel: ( : aktuell, : fertig) 1 1 31 21 1 2

Dijkstras Algorithmus Beispiel: ( : aktuell, : fertig) 1 1 31 21 1 2 11 4 2 41 5 1 s 3/2/2021 2 41 3 3 51 Kapitel 8 1 51 2 27

Dijkstras Algorithmus Procedure Dijkstra(s: Node. Id) d=<1, …, 1>: Node. Array of IR [

Dijkstras Algorithmus Procedure Dijkstra(s: Node. Id) d=<1, …, 1>: Node. Array of IR [ {-1, 1} parent=<? , …, ? >: Node. Array of Node. Id d[s]: =0; parent[s]: =s q=<s>: Node. PQ while q = ; do u: =q. delete. Min() // u: min. Distanz zu s in q foreach e=(u, v) 2 E do if d[v] > d[u]+c(e) then // aktualisiere d[v] if d[v]=1 then q. insert(v) // v schon in q? d[v]: =d[u]+c(e); parent[v]: =u q. decrease. Key(v) // nur PQ q reparieren 3/2/2021 Kapitel 8 28

Dijkstras Algorithmus Korrektheit: • Angenommen, Algo sei inkorrekt. • Sei v der Knoten mit

Dijkstras Algorithmus Korrektheit: • Angenommen, Algo sei inkorrekt. • Sei v der Knoten mit kleinstem (s, v), der aus q entfernt wird mit d[v]> (s, v). • Sei p=(s=v 1, v 2, …, vk=v) ein kürzester Weg von s nach v. • Weil alle c(e)>0 sind, steigt minimales d[w] in q monoton an. Da d[vk-1]<d[vk], muss vk-1 vor vk aus q entfernt worden sein, und wegen der Annahme galt d[vk-1]= (s, vk-1) • Bei Entfernung von vk-1 hat Algo überprüft, ob d[vk-1] + c(vk-1, vk)<d[vk]. Das muss bei Annahme oben der Fall gewesen sein, aber dann hätte Algo d[v] auf d[vk-1] + c(vk -1, v)= (s, v) gesetzt, ein Widerspruch. 3/2/2021 Kapitel 8 29

Dijkstras Algorithmus Laufzeit: TDijkstra = O(n(TDelete. Min(n)+TInsert(n)) + m¢ Tdecrease. Key(n)) Binärer Heap: alle

Dijkstras Algorithmus Laufzeit: TDijkstra = O(n(TDelete. Min(n)+TInsert(n)) + m¢ Tdecrease. Key(n)) Binärer Heap: alle Operationen O(log n), also TDijkstra = O((m+n)log n) Fibonacci Heap: • TDelete. Min(n)=TInsert(n)=O(log n) • Tdecrease. Key(n)=O(1) • Damit TDijkstra = O(n log n + m) 3/2/2021 Kapitel 8 30

Monotone Priority Queues Einsicht: Dijkstras Algorithmus braucht keine allgemeine Priority Queue, sondern nur eine

Monotone Priority Queues Einsicht: Dijkstras Algorithmus braucht keine allgemeine Priority Queue, sondern nur eine monotone Priority Queue. Monotone Priority Queue: Folge der gelöschten Elemente hat monoton steigende Werte. Effiziente Implementierungen von monotonen Priority Queues möglich, falls Kantenkosten ganzzahlig. 3/2/2021 Kapitel 8 31

Bucket Queue Annahme: alle Kantenkosten im Bereich [0, C]. Konsequenz: zu jedem Zeitpunkt enthält

Bucket Queue Annahme: alle Kantenkosten im Bereich [0, C]. Konsequenz: zu jedem Zeitpunkt enthält q Distanzen im Bereich [d, d+C] für ein d. d+3 d+1 d C=8 d+2 d+1 d+8 d+5 3/2/2021 Kapitel 8 32

Bucket Queue Annahme: alle Kantenkosten im Bereich [0, C]. Konsequenz: zu jedem Zeitpunkt enthält

Bucket Queue Annahme: alle Kantenkosten im Bereich [0, C]. Konsequenz: zu jedem Zeitpunkt enthält q Distanzen im Bereich [d, d+C] für ein d. Bucket Queue: Array B aus C+1 Listen und Variable dmin für aktuell minimale Distanz (mod C+1) 0 3/2/2021 1 2 3 …. Kapitel 8 C 33

Bucket Queue 0 1 2 3 …. C • Jeder Knoten v mit momentaner

Bucket Queue 0 1 2 3 …. C • Jeder Knoten v mit momentaner Distanz d[v] wird in Liste B[d[v] mod (C+1)] gespeichert • Da momentane d[v]´s im Bereich [d, d+C] für ein d sind, haben alle v in einem B[d] dasselbe d[v]. 3/2/2021 Kapitel 8 34

Bucket Queue 0 1 2 3 …. C • Insert(v): fügt v in B[d[v]

Bucket Queue 0 1 2 3 …. C • Insert(v): fügt v in B[d[v] mod (C+1)] ein. Laufzeit O(1). • decrease. Key(v): entfernt v aus momentaner Liste und fügt v in B[d[v] mod (C+1)] ein. Falls in v Position in der Liste speichert, Laufzeit O(1). • delete. Min(): solange B[dmin]= , setze dmin: =(dmin+1) mod (C+1). Nimm dann einen Knoten u aus B[dmin] heraus. Laufzeit O(C). 3/2/2021 Kapitel 8 35

Bucket Queue 0 1 2 3 …. C • Insert(v), decrease. Key(v): Laufzeit O(1).

Bucket Queue 0 1 2 3 …. C • Insert(v), decrease. Key(v): Laufzeit O(1). • delete. Min(): Laufzeit O(C). • Laufzeit von Dijkstras Algo mit Bucket Queue: O(m+n¢C) 3/2/2021 Kapitel 8 36

Radix Heap -1 0 1 2 …. K • Insert(v), decrease. Key(v): Laufzeit O(1).

Radix Heap -1 0 1 2 …. K • Insert(v), decrease. Key(v): Laufzeit O(1). • delete. Min(): amortisierte Laufzeit O(log C). • Laufzeit von Dijkstras Algo mit Radix Heap: O(m + n log C) 3/2/2021 Kapitel 8 37

Bellman-Ford Algorithmus Nächster Schritt: Kürzeste Wege für beliebige Graphen mit beliebigen Kantenkosten. Problem: besuche

Bellman-Ford Algorithmus Nächster Schritt: Kürzeste Wege für beliebige Graphen mit beliebigen Kantenkosten. Problem: besuche Knoten eines kürzesten Weges in richtiger Reihenfolge s w 0 d 1 d 2 d 3 d 4 v Dijkstra Algo kann nicht mehr verwendet werden, da er im Allgemeinen nicht mehr Knoten in der Reihenfolge ihrer Distanz zu s besucht. 3/2/2021 Kapitel 8 38

Bellman-Ford Algorithmus Beispiel für Problem mit Dijkstra Algo: v 2 01 2 -1 1

Bellman-Ford Algorithmus Beispiel für Problem mit Dijkstra Algo: v 2 01 2 -1 1 s 3 31 1 -4 Knoten v hat falschen Distanzwert! 3/2/2021 Kapitel 8 39

Bellman-Ford Algorithmus Lemma 8. 1: Für jeden Knoten v mit (s, v) > -1

Bellman-Ford Algorithmus Lemma 8. 1: Für jeden Knoten v mit (s, v) > -1 zu s gibt es einfachen Weg (ohne Kreis!) von s nach v der Länge (s, v). Beweis: • Weg mit Kreis mit Kantenkosten >=0: Kreisentfernung erhöht nicht die Kosten • Weg mit Kreis mit Kantenkosten <0: Distanz zu s ist -1 ! 3/2/2021 Kapitel 8 40

Bellman-Ford Algorithmus Folgerung: (Graph mit n Knoten) Für jeden Knoten v mit (s, v)>

Bellman-Ford Algorithmus Folgerung: (Graph mit n Knoten) Für jeden Knoten v mit (s, v)> -1 gibt es kürzesten Weg der Länge <n zu v. Strategie: Durchlaufe (n-1)-mal sämtliche Kanten in Graph und aktualisiere Distanz. Dann alle kürzeste Wege berücksichtigt. s 0 Durchlauf 3/2/2021 d 1 1 d 2 2 d 3 3 Kapitel 8 d 4 v 4 41

Bellman-Ford Algorithmus Problem: Erkennung negativer Kreise -2 1 s 11 0 1 -1 1

Bellman-Ford Algorithmus Problem: Erkennung negativer Kreise -2 1 s 11 0 1 -1 1 1 01 2 -1 Einsicht: in negativem Kreis erniedrigt sich Distanz in jeder Runde bei mindestens einem Knoten 3/2/2021 Kapitel 8 42

Bellman-Ford Algorithmus Problem: Erkennung negativer Kreise -2 1 s 1 0 -1 -1 1

Bellman-Ford Algorithmus Problem: Erkennung negativer Kreise -2 1 s 1 0 -1 -1 1 0 -1 Zeitpunkt: kontinuierliche Distanzerniedrigung startet spätestens in n-ter Runde (dann Kreis mindestens einmal durchlaufen) 3/2/2021 Kapitel 8 43

Bellman-Ford Algorithmus Keine Distanzerniedrigung möglich: • Angenommen wir erreichen Zeitpunkt mit d[v]+c(v, w) >

Bellman-Ford Algorithmus Keine Distanzerniedrigung möglich: • Angenommen wir erreichen Zeitpunkt mit d[v]+c(v, w) > d[w] für alle Knoten w. • 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 den kürzesten Weg p nach w, d[w] > c(p) zu jedem Zeitpunkt ist, dann gilt am Ende d[w]= (s, w). 3/2/2021 Kapitel 8 44

Bellman-Ford Algorithmus Zusammenfassung: • Keine Distanzerniedrigung mehr möglich (d[v]+c(v, w) > d[w] für alle

Bellman-Ford Algorithmus Zusammenfassung: • Keine Distanzerniedrigung mehr möglich (d[v]+c(v, w) > d[w] für alle w): Fertig, d[w]= (s, w) für alle w • Distanzerniedrigung möglich selbst noch in n-ter Runde (d[v]+c(v, w)<d[w] für ein w): Dann gibt es negative Kreise, also Knoten w mit Distanz (s, w)=-1. Ist das wahr für ein w, dann für alle von w erreichbaren Knoten. 3/2/2021 Kapitel 8 45

Bellman-Ford Algorithmus Procedure Bellman. Ford(s: Node. Id) d=<1, …, 1>: Node. Array of IR

Bellman-Ford Algorithmus Procedure Bellman. Ford(s: Node. Id) d=<1, …, 1>: Node. Array of IR [ {-1, 1} parent=<? , …, ? >: Node. Array of Node. Id d[s]: =0; parent[s]: =s for i: =1 to n-1 do // aktualisiere Kosten für n-1 Runden forall e=(v, w) 2 E do if d[w] > d[v]+c(e) then // bessere Distanz möglich? d[w]: =d[v]+c(e); parent[w]: =v forall e=(v, w) 2 E do // in n-ter Runde noch besser? if d[w] > d[v]+c(e) then infect(w) Procedure infect(v) // setze -1 -Kosten von v aus if d[v]>-1 then d[v]: =-1 forall (v, w) 2 E do infect(w) 3/2/2021 Kapitel 8 46

Bellman-Ford Algorithmus Laufzeit: O(n¢m) Verbesserungsmöglichkeiten: • Überprüfe in jeder Aktualisierungsrunde, ob noch irgendwo d[v]+c[v,

Bellman-Ford Algorithmus Laufzeit: O(n¢m) Verbesserungsmöglichkeiten: • Überprüfe in jeder Aktualisierungsrunde, ob noch irgendwo d[v]+c[v, w]<d[w] ist. Nein: fertig! • Besuche in jeder Runde nur die Knoten w, für die Test d[v]+c[v, w]<d[w] sinnvoll (d. h. d[v] hat sich in letzter Runde geändert). 3/2/2021 Kapitel 8 47

All Pairs Shortest Paths Annahme: Graph mit beliebigen Kantenkosten, aber keine negativen Kreise Naive

All Pairs Shortest Paths Annahme: Graph mit beliebigen Kantenkosten, aber keine negativen Kreise Naive Strategie für Graph mit n Knoten: lass n-mal Bellman-Ford Algorithmus (einmal für jeden Knoten) laufen Laufzeit: O(n 2 m) 3/2/2021 Kapitel 8 48

All Pairs Shortest Paths Bessere Strategie: Reduziere n Bellman. Ford Anwendungen auf n Dijkstra

All Pairs Shortest Paths Bessere Strategie: Reduziere n Bellman. Ford Anwendungen auf n Dijkstra Anwendungen Problem: wir brauchen dazu nichtnegative Kantenkosten Lösung: Umwandlungsstrategie in nichtnegative Kantenkosten, ohne kürzeste Wege zu verfälschen (nicht so einfach!) 3/2/2021 Kapitel 8 49

All Pairs Shortest Paths Gegenbeispiel zur Erhöhung um Wert c: Vorher 2 v Kosten

All Pairs Shortest Paths Gegenbeispiel zur Erhöhung um Wert c: Vorher 2 v Kosten +1 überall 3 1 s v 2 s 1 -1 2 0 : kürzester Weg 3/2/2021 Kapitel 8 50

All Pairs Shortest Paths • Sei : V! IR eine Funktion, die jedem Knoten

All Pairs Shortest Paths • Sei : V! IR eine Funktion, die jedem Knoten ein Potenzial zuweist. • Die reduzierten Kosten von e=(v, w) sind: r(e) : = (v) + c(e) - (w) Lemma 8. 2: Seien p und q Wege in G. Dann gilt für jedes Potenzial : r(p)<r(q) genau dann wenn c(p)<c(q). 3/2/2021 Kapitel 8 51

All Pairs Shortest Paths Lemma 8. 2: Seien p und q Wege in G.

All Pairs Shortest Paths Lemma 8. 2: Seien p und q Wege in G. Dann gilt für jedes Potenzial : r(p)<r(q) genau dann wenn c(p)<c(q). Beweis: Sei p=(v 1, …, vk) ein beliebiger Weg und ei=(vi, vi+1) für alle i. Es gilt: r(p) = i r(ei) = i ( (vi) + c(e) - (vi+1)) = (v 1) + c(p) - (vk) 3/2/2021 Kapitel 8 52

All Pairs Shortest Paths Lemma 8. 3: Angenommen, G habe keine negativen Kreise und

All Pairs Shortest Paths Lemma 8. 3: Angenommen, G habe keine negativen Kreise und dass alle Knoten von s erreicht werden können. Sei (v)= (s, v) für alle v 2 V. Mit diesem ist r(e)>0 für alle e. Beweis: • nach Annahme ist (s, v) 2 IR für alle v • wir wissen: für jede Kante e=(v, w) ist (s, v)+c(e)> (s, w) (Abbruchbedingung!) • also ist r(e) = (s, v) + c(e) - (s, w)>0 3/2/2021 Kapitel 8 53

All Pairs Shortest Paths 1. Füge neuen Knoten s und Kanten (s, v) für

All Pairs Shortest Paths 1. Füge neuen Knoten s und Kanten (s, v) für alle v hinzu mit c(s, v)=0 (alle erreichbar!) 2. Berechne (s, v) nach Bellman-Ford und setze (v): = (s, v) für alle v 3. Berechne die reduzierten Kosten r(e) 4. Berechne für alle Knoten v die Distanzen (v, w) mittels Dijkstra Algo mit reduzierten Kosten auf Graph ohne Knoten s 5. Berechne korrekte Distanzen (v, w) durch (v, w)= (v, w)+ (w)- (v) 3/2/2021 Kapitel 8 54

All Pairs Shortest Paths a Beispiel: 2 2 b b 1 a 1 d

All Pairs Shortest Paths a Beispiel: 2 2 b b 1 a 1 d 1 c 1 -1 c -1 d 3/2/2021 Kapitel 8 55

All Pairs Shortest Paths Schritt 1: künstliche Quelle a 2 0 b 0 s

All Pairs Shortest Paths Schritt 1: künstliche Quelle a 2 0 b 0 s 1 0 0 1 c -1 d 3/2/2021 Kapitel 8 56

All Pairs Shortest Paths Schritt 2: Bellman-Ford auf s a 2 0 0 s

All Pairs Shortest Paths Schritt 2: Bellman-Ford auf s a 2 0 0 s (a)=0 1 b (b)=0 c (c)=-1 0 0 1 -1 d 3/2/2021 Kapitel 8 (d)=0 57

All Pairs Shortest Paths Schritt 3: r(e)-Werte berechnen a 2 Die reduzierten Kosten von

All Pairs Shortest Paths Schritt 3: r(e)-Werte berechnen a 2 Die reduzierten Kosten von e=(v, w) sind: r(e) : = (v) + c(e) - (w) 1 (a)=0 0 b (b)=0 c (c)=-1 0 d 3/2/2021 Kapitel 8 (d)=0 58

All Pairs Shortest Paths Schritt 4: berechne alle Distanzen (v, w) via Dijkstra 2

All Pairs Shortest Paths Schritt 4: berechne alle Distanzen (v, w) via Dijkstra 2 a b c d 3/2/2021 a 0 1 0 0 b 2 0 2 2 c 3 1 0 0 d 3 1 3 0 Kapitel 8 1 a (a)=0 0 b (b)=0 c (c)=-1 0 d (d)=0 59

All Pairs Shortest Paths Schritt 5: berechne korrekte Distanzen durch die Formel (v, w)=

All Pairs Shortest Paths Schritt 5: berechne korrekte Distanzen durch die Formel (v, w)= (v, w)+ (w)- (v) a b c d 3/2/2021 a 0 1 1 0 b 2 0 3 2 c 2 0 0 -1 d 3 1 4 0 Kapitel 8 a 2 1 (a)=0 1 b (b)=0 c (c)=-1 -1 d (d)=0 60

All Pairs Shortest Paths Laufzeit des APSP-Algorithmus: O(TBellman-Ford(n, m) + n¢TDijkstra(n, m)) = O(n

All Pairs Shortest Paths Laufzeit des APSP-Algorithmus: O(TBellman-Ford(n, m) + n¢TDijkstra(n, m)) = O(n ¢ m + n(n log n + m)) = O(n ¢ m + n 2 log n) unter Verwendung von Fibonacci Heaps. 3/2/2021 Kapitel 8 61

Transitive Hülle Problem: Konstruiere für einen gerichteten Graphen G=(V, E) eine Datenstruktur, die folgende

Transitive Hülle Problem: Konstruiere für einen gerichteten Graphen G=(V, E) eine Datenstruktur, die folgende Operation (speicher- und zeit-)effizient unterstützt: • Reachable(v, w): liefert 1, falls es einen gerichteten Weg von v nach w in G gibt und sonst 0 3/2/2021 Kapitel 8 62

Transitive Hülle Lösung 1: verwende APSP Algorithmus • Laufzeit zur Erstellung der DS: O(n

Transitive Hülle Lösung 1: verwende APSP Algorithmus • Laufzeit zur Erstellung der DS: O(n ¢ m + n 2 log n) • Speicheraufwand: O(n 2) • Laufzeit von Reachable(v, w): O(1) (nachschauen in Tabelle, ob (v, w)<1 ) 3/2/2021 Kapitel 8 63

Transitive Hülle Einsicht: Alle Knoten in einer starken ZHK haben dieselbe Menge erreichbarer Knoten.

Transitive Hülle Einsicht: Alle Knoten in einer starken ZHK haben dieselbe Menge erreichbarer Knoten. Daher reicht es, sie durch Repräsentanten zu vertreten. v w ZHK ZHK 3/2/2021 Kapitel 8 64

Transitive Hülle Lösung 2: verwende ZHK-Algorithmus • bestimme starke ZHKs e d i h

Transitive Hülle Lösung 2: verwende ZHK-Algorithmus • bestimme starke ZHKs e d i h g f c a 3/2/2021 b Kapitel 8 65

Transitive Hülle Lösung 2: verwende ZHK-Algorithmus • bestimme ZHK-Graph (Repräsentanten) e i c a

Transitive Hülle Lösung 2: verwende ZHK-Algorithmus • bestimme ZHK-Graph (Repräsentanten) e i c a 3/2/2021 b Kapitel 8 66

Transitive Hülle Lösung 2: verwende ZHK-Algorithmus • Wende APSP-Algo auf ZHK-Graph an e i

Transitive Hülle Lösung 2: verwende ZHK-Algorithmus • Wende APSP-Algo auf ZHK-Graph an e i c a 3/2/2021 b Kapitel 8 67

Transitive Hülle Reachable(v, w): • Bestimme Repräsentanten rv und rw von v und w

Transitive Hülle Reachable(v, w): • Bestimme Repräsentanten rv und rw von v und w • rv=rw: gib 1 aus • sonst gib Reachable(rv, rw) für ZHK-Graph zurück 3/2/2021 Kapitel 8 68

Transitive Hülle • Graph G=(V, E): n=|V|, m=|E| • ZHK-Graph G’=(V’, E’): n’=|V’|, m’=|E’|

Transitive Hülle • Graph G=(V, E): n=|V|, m=|E| • ZHK-Graph G’=(V’, E’): n’=|V’|, m’=|E’| Datenstruktur: • Berechnungszeit: O(n + m + n’¢m’ + (n’)2 log n’) • Speicher: O(n + (n’)2) Reachable(v, w): Laufzeit O(1) 3/2/2021 Kapitel 8 69

Transitive Hülle Ist es auch möglich, mit ~ O(n+m) Speicher für die Datenstruktur die

Transitive Hülle Ist es auch möglich, mit ~ O(n+m) Speicher für die Datenstruktur die Operation Reachable(v, w) effizient abzuarbeiten? Einsicht: Wenn für eine topologische Sortierung (tv)v 2 V’ der Repräsentanten gilt rv>rw , dann gibt es keinen gerichteten Weg von rv nach rw Was machen wir, falls rv<rw? 3/2/2021 Kapitel 8 70

Transitive Hülle Fall 1: Der ZHK-Graph ist eine gerichtete Liste a b c d

Transitive Hülle Fall 1: Der ZHK-Graph ist eine gerichtete Liste a b c d e f g Reachable(v, w) ergibt 1 , tv< tw 3/2/2021 Kapitel 8 71

Transitive Hülle Fall 1: Der ZHK-Graph ist eine gerichtete Liste Datenstruktur: O(n+m) Zeit, O(n)

Transitive Hülle Fall 1: Der ZHK-Graph ist eine gerichtete Liste Datenstruktur: O(n+m) Zeit, O(n) Speicher (speichere Repräsentanten zu jedem Knoten und gib Repr. Ordnungsnummern) Reachable(v, w): Laufzeit O(1) 3/2/2021 Kapitel 8 72

Transitive Hülle Fall 2: Der ZHK-Graph ist ein gerichteter Baum c e b d

Transitive Hülle Fall 2: Der ZHK-Graph ist ein gerichteter Baum c e b d a f h g 3/2/2021 Kapitel 8 73

Transitive Hülle Strategie: DFS-Durchlauf von Wurzel, Kanten mit dfsnum-Bereichen markieren c [3, 3] 2

Transitive Hülle Strategie: DFS-Durchlauf von Wurzel, Kanten mit dfsnum-Bereichen markieren c [3, 3] 2 [2, 6] b a [4, 6] g e 5 f 6 h 8 4 [7, 8] 7 3/2/2021 [5, 5] d 1 3 [8, 8] Kapitel 8 [6, 6] 74

Transitive Hülle Reachable(v, w): bestimme Repräsentanten rv und rw, teste ob rw in Intervall

Transitive Hülle Reachable(v, w): bestimme Repräsentanten rv und rw, teste ob rw in Intervall von ausgehender Kante von rv [3, 3] c 2 [2, 6] b a [4, 6] g e 5 f 6 h 8 4 [7, 8] 7 3/2/2021 [5, 5] d 1 3 [8, 8] Kapitel 8 [6, 6] 75

Transitive Hülle Kantenrichtungen zur Wurzel: c e b d a f h g Reachable(v,

Transitive Hülle Kantenrichtungen zur Wurzel: c e b d a f h g Reachable(v, w) ist 1 , Reachable(w, v) ist 1 für umgekehrte Richtungen 3/2/2021 Kapitel 8 76

Transitive Hülle Fall 2: Der ZHK-Graph ist ein gerichteter Baum Datenstruktur: O(n+m) Zeit und

Transitive Hülle Fall 2: Der ZHK-Graph ist ein gerichteter Baum Datenstruktur: O(n+m) Zeit und Speicher (speichere Repräsentanten zu jedem Knoten Kantenintervalle zu jedem Repräsentanten) Reachable(v, w): Laufzeit O(log d) (binäre Suche auf Intervallen), wobei d der maximale Grad im ZHK-Graph ist 3/2/2021 Kapitel 8 77

Transitive Hülle Fall 3: Der ZHK-Graph ist ein beliebiger DAG c i e b

Transitive Hülle Fall 3: Der ZHK-Graph ist ein beliebiger DAG c i e b d a f h g 3/2/2021 Kapitel 8 78

Transitive Hülle Auflösung der (roten) Kreuzkanten problematisch. Strategie: • Erzeuge künstliche Wurzel r, die

Transitive Hülle Auflösung der (roten) Kreuzkanten problematisch. Strategie: • Erzeuge künstliche Wurzel r, die Kanten zu allen Knoten mit Ingrad 0 hat • Führe DFS-Durchlauf von r durch, wobei bereits besuchte Knoten nochmal besucht werden dürfen (und damit mehrere DFS-Nummern erhalten). Siehe dazu die nächste Folie. • Bestimme Kantenintervalle beim ersten DFSDurchlauf eines Knotens 3/2/2021 Kapitel 8 79

Transitive Hülle DFS-Durchlauf: • Mit dem DFS-Durchlauf wird ein Marker M weitergereicht. Jeder Knoten

Transitive Hülle DFS-Durchlauf: • Mit dem DFS-Durchlauf wird ein Marker M weitergereicht. Jeder Knoten v setzt Mv: =; . • Anfangs ist M=; . • Wird ein Knoten v beim DFS-Durchlauf besucht, dann unterscheidet v zwischen drei Fällen: – M=; : Ist v noch nicht besucht worden, dann setzt v den DFSDurchlauf bei sich fort. Ist v schon besucht worden, dann setzt v M und Mv auf {u, v} und führt den DFS-Durchlauf mit diesem M bei sich fort. – Ist M=; und M=Mv, dann setzt v Mv auf {u, v} und führt den DFSDurchlauf mit M bei sich fort. – Sonst endet der DFS-Durchlauf bei v und wird zurückgereicht an den aufrufenden Knoten. 3/2/2021 Kapitel 8 80

Transitive Hülle Beispiel: 1 k [2, 8] 2 4 i [4, 4] c [5,

Transitive Hülle Beispiel: 1 k [2, 8] 2 4 i [4, 4] c [5, 8] 5 [3, 8] 3 [9, 18] b [10, 15] 9 M: {a, b} 10 a [17, 17] [16, 18] M: {g, c} g 16 3/2/2021 Kapitel 8 11 6 17 [6, 6] e [7, 7] 7 d 12 f 13 14 [8, 8] [18, 18] M: {g, h} h 8 18 15 81

Transitive Hülle Reachable(v, w): bestimme rv und rw und teste, ob es eine DFS-Nummer

Transitive Hülle Reachable(v, w): bestimme rv und rw und teste, ob es eine DFS-Nummer x von rw gibt, so dass x in einem Intervall einer ausgehenden Kante von rv ist. Laufzeit: O(d log n) mit binärer Suche auf sortierter Folge der DFS-Nummern Problem: Speicher für DS evtl. hoch (O(n 2)) 3/2/2021 Kapitel 8 82

Ausblick Weiter mit minimalen Spannbäumen… 3/2/2021 Kapitel 8 83

Ausblick Weiter mit minimalen Spannbäumen… 3/2/2021 Kapitel 8 83