22
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4.

Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Embed Size (px)

Citation preview

Page 1: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Effiziente Algorithmen

Hartmut KlauckUniversität FrankfurtSS 0620.4.

Page 2: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Kürzeste Wege in gewichteten Graphen Gegeben sei ein Graph G als Adjazenzliste mit

Gewichten, d.h. für jede Kante (u,v) sei zusätzlich ein Gewicht W(u,v) gespeichert (wenn (u,v) keine Kante ist wird W(u,v)=1 gesetzt).

Wir suchen kürzeste Wege von einem Startknoten s zu anderen Knoten

Das Gewicht eines Weges von u nach v sei die Summe der Kantengewichte

Die Distanz von u und v sei das minimale Gewicht eines Weges von u nach v

Minimale Wege müssen nicht die wenigsten Kanten haben!

Page 3: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Varianten

Single-Source Shortest-Path:Finde von s aus kürzeste Pfade zu allen anderen Knoten

All-Pairs Shortest-Path:Finde die kürzesten Pfade zwischen allen Paaren von Knoten

Zuerst betrachte wir das SSSP Problem

Page 4: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Beobachtung

Wir betrachten Graphen ohne Zyklen negativer Länge

Betrachte einen minimalen Weg von s nach v

Dann gilt: Alle Teilwege beginnend ab s sind ebenfalls minimal

Idee für Algorithmen: Bestimme Wege mit weniger Kanten zuerst Wir benutzen Schätzungen d(v), zu

Anfang d(s)=0 und d(v)=1 sonst Erzeugen im Laufe des Algorithmus

bessere Schätzungen

Page 5: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Speicherung der Wege

Für jeden Knoten v speichern wir einen Vorgänger (v), zu Beginn ist dieser auf NIL gesetzt

Die Vorgänger sollen am Ende einen zur Wurzel s gerichteten Baum minimaler Wege bilden

Page 6: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Relaxierung einer Kante

Grundlegende Operation Relax(u,v,W)

• if d(v)>d(u)+W(u,v)then d(v):=d(u)+W(u,v); (v):=u

D.h. wenn es eine bessere Schätzung für v gibt, erneuere diese

Page 7: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Beobachtungen

Folgende Eigenschaften gelten für jede Folge von Relax Operationen 1. d(v) ¸ (s,v) zu jeder Zeit (per Induktion,

Übung)2. Somit: Knoten mit (s,v)=1 haben immer

d(v)=13. Sei s u v ein kürzester Pfad mit Endkante

(u,v) und d(u)=(s,u) zu einer Zeit. Nach Relaxierung der Kante (u,v) gilt d(v)=(s,v)• d(v)· d(u)+W(u,v) nach der Relaxierung

=(s,u)+W(u,v)=(s,v), wegen der Minimalität von Teilwegen

Page 8: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Dijkstras Algorithmus

Löst das single-source shortest-path problem Voraussetzung: W(u,v)¸ 0 für alle Kanten Idee: speichere Knoten so, dass Knoten mit

minimaler Distanzschätzung effizient ausgewählt werden können

Wähle einen solchen Knoten, relaxiere alle Kanten zu seinen Nachbarn

Bis alle Knoten ausgewählt Korrektheitsidee: für Knoten mit minimaler

Distanzschätzung ist diese bereits korrekt

Page 9: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Datenstruktur

Speichert n Knoten zusammen mit ihrem Distanzwert

Wir brauchen folgende Operationen: ExtractMin: Finde einen Knoten v mit

minimalem d(v), entferne ihn DecreaseKey(v,x): Ersetze die

Distanzschätzung von Knoten v durch x (x ist kleiner als bisherige Schätzung)

Initialisierung Diese Operationen reichen aus, um

Dijkstras Algorithmus zu implementieren

Page 10: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Dijkstras Algorithmus

Initialisiere (v)=NIL für alle v undd(s)=0, d(v)=1 sonst

S=; sei Menge der abgearbeiteten Knoten Q=V While Q;

u:=ExtractMin S:=S [ {u} und Q:=Q-{u} Für alle Nachbarn v von u:

Relax(u,v,W) • Relax benutzt DecreaseKey

Page 11: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Dijkstras Algorithmus

Page 12: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Arbeitsprogramm:

1. Beweise Korrektheit2. Implementiere die Datenstruktur3. Analysiere Laufzeit

Page 13: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

3)Laufzeit

Die Laufzeit wird dominiert durch höchstens n ExtractMin Operationen und höchstens m DecreaseKey Operationen

Page 14: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

2)

Werden später (!) eine Datenstruktur kennenlernen, die folgende Laufzeiten erlaubt: Amortisierte Zeit von ExtractMin ist

O(log n), d.h. Gesamtzeit für n Operationen O(n log n)

Amortisierte Zeit von DecreaseKey ist O(1), d.h. Gesamtzeit für m Operationen O(m)

Dies erlaubt Laufzeit von O(m+n log n)

Page 15: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Simple Implementierung

Speichere d(v) in einem Array DecreaseKey in O(1) ExtractMin in O(n)

Gesamtlaufzeit: O(n2) für ExtractMin und O(m) für DecreaseKey

Praktikabel für Adjazenzmatrizen

Page 16: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Korrektheit der Algorithmus Einige Beobachtungen

1. d(v) ¸ (s,v) zu jeder Zeit (per Induktion, Übung)

2. Somit: Knoten mit (s,v)=1 haben immer d(v)=1

3. Sei s u v ein kürzester Pfad mit Endkante (u,v) und d(u)=(s,u) zu einer Zeit. Nach Relaxierung der Kante (u,v) gilt d(v)=(s,v)

4. Wenn zu einer Zeit d(v)=1 für alle Knoten in V-S, dann sind diese Knoten alle nicht von s erreichbar

Page 17: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Korrektheit des Algorithmus Theorem: Dijkstras Algorithmus terminiert mit

d(v)=(s,v), d.h. die korrekten Distanzwerte werden berechnet. Invariante: Für alle v2 S gilt d(v)=(s,v) Zu Beginn ist S leer, daher stimmt die Invariante Zu zeigen ist, dass der nächste gewählte Knoten v

korrektes d(v) besitzt. Für s ist dies trivial wahr Für v s:

• Nur Knoten mit endlichem d(v) werden gewählt, oder die restlichen Knoten sind alle nicht von s erreichbar (und dann d(v) korrekt)

• Es gibt also einen (kürzesten) Weg von s nach v• Sei p ein solcher Pfad, und y der erste Knoten

ausserhalb von S auf diesem Pfad, x dessen Vorgänger

Page 18: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Korrektheit des Algorithmus

Behauptung: d(y)=(s,y), wenn v eingefügt wird Damit: d(v)· d(y)=(s,y)· (s,v). QED Zeigen Behauptung:

d(x)=(s,x) per Induktion Kante (x,y) wurde bereits relaxiert, d.h. nach

Beobachtung 3.) gilt d(y)=(s,y).

Page 19: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Korrektheit des Algorithmus Also ist zu jeder Zeit d(v) korrekt für alle

Elemente von S Am Ende des Algorithmus ist S=V, somit

sind alle Distanzen korrekt berechnet.

Noch zu zeigen: Auch die Wege selbst werden korrekt berechnet. Übung

Page 20: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Das single-source shortest-path Problem mit negativen Gewichten Gegeben Graph G, Gewichtsfunktion W

auf den Kanten, Startknoten s Ausgabe: Ein Bit, das anzeigt, ob ein

Zyklus negativer Länge von s erreichbar ist, wenn nicht, dann kürzeste Pfade von s zu allen anderen Knoten.

Page 21: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Bellman-Ford Algorithmus Initialisiere d(s)=0, d(v)=1 sonst For i=1 to n-1:

Relaxiere alle Kanten (u,v) Für jede Kante (u,v): wenn d(v)>d(u)

+W(u,v), Ausgabe: „es existiert ein negativer Zyklus“

Bemerkung: d(v) und (v) enthalten Distanz und Vorgänger

Page 22: Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS 06 20.4

Laufzeit

Der Algorithmus läuft offensichtlich in Zeit O(nm)