All-Pairs Almost Shortest Paths Ausarbeitung des Vortrags von Martin Holzer zum Seminar Kürzeste Wege“ ” bei Prof. Dr. Dorothea Wagner Universität Konstanz, WS 2001/02 Abstract Das All-Pairs Shortest Path Problem, kurz APSP-Problem, besteht im Auffinden der Distanzen aller Paare von Knoten in einem Grafen. Wird nun die Bedingung der Exaktheit dieser Distanzen etwas aufgeweicht und ein einseitiger additiver Fehler von maximal einem k ∈ N zugelassen, so spricht man vom All-Pairs Almost Shortest Path Problem, kurz APASP-Problem genannt. In diesem Papier wird nun eine Familie von Algorithmen APASPk vorgestellt 2 2 werden, welche (für gerades k ≥ 2) eine Laufzeit in Õ(min{n2− k+2 m k+2 , 2 n2+ 3k−2 }) haben und das APASP-Problem für einen Grafen mit einem einseitigen additiven Fehler von maximal k lösen, falls mit n und m die Kardinalität der Knoten bzw. Kanten bezeichnet wird. Wir bezeichnen mit einem k-Emulator zu einem ungewichteten Grafen einen gewichteten Grafen mit derselben Knotenmenge so, dass die Distanz zweier Knoten im Emulator um höchstens k größer ist als im Originalgraf. In diesem Papier wird gezeigt werden, dass jeder Graf mit n Knoten einen 2Emulator mit Õ(n3/2 ) Kanten hat, welcher in Õ(n5/2 ) Zeit konstruiert werden kann. Außerdem ist diese Schranke für die Kantenmenge asymptotisch scharf. Schließlich wird noch das folgende Ergebnis über Spanner gegeben werden: Jeder gewichtete Graf mit n Knoten hat einen 3-Spanner mit Õ(n3/2 ) Kanten, der in Õ(mn1/2 ) Zeit konstruiert werden kann. 1 Bezeichnungen Im Folgenden sollen einige Bezeichnungen und Schreibweisen, die im gesamten Papier verwendet werden, festgelegt werden: 1 • Mit G := (V, E) wird ein ungerichteter Graf bezeichnet, der — bis auf Weiteres — auch ungewichtet ist. In einigen wenigen Fällen, in denen G einen gewichteten Grafen bezeichnet, wird dies also explizit vermerkt sein. Des Weiteren wird die Kardinalität der Knotenmenge von G mit |V | =: n, entsprechend die der Kantenmenge mit |E| =: m bezeichnet. • Die (exakte) Distanz zwischen zwei Knoten u, v ∈ V wird als δ(u, v), die geschätzte Distanz dieses Knotenpaares als δ̂(u, v) notiert. Entsprechend wird die Matrix, die die geschätzten Distanzen aller Paare von Knoten eines Grafen beinhaltet, mit (δ̂(u, v))u,v bezeichnet. • deg(v) steht für den Grad des Knotens v ∈ V . • Schließlich soll mit Õ(f ) die Komplexität O(f polylog n) eines Algorithmus bezeichnet werden. Ein Beispiel hierfür ist: Õ(n2 ) = O(n2 (log n)1/2 ). 2 Einleitung Im Folgenden wird ein Algorithmus apaspk gegeben werden, der das APASPProblem für einen Grafen G mit einem additiven Fehler von maximal k − 1 löst, d. h. für die geschätzte Distanz zweier Knoten u, v ∈ V gilt: δ(u, v) ≤ δ̂(u, v) ≤ δ(u, v)+(k−1). Dieser, wie auch die folgenden Algorithmen apaspk und APASPk , basieren auf der Zerlegung des Grafen in sog. dominierende Knotenmengen und eine gewisse induzierte Menge von Kanten durch einen Algorithmus decompose, welcher zunächst gegeben werden soll. 3 Zerlegung eines Grafen Definition. Eine Knotenmenge D dominiert eine Knotenmenge U , falls jeder Knoten in U einen Nachbarn in D hat. Damit gilt dann das folgende — hier nicht bewiesene — n Lemma. Eine Knotenmenge D der Größe O( n log ), 1 ≤ s ≤ n, die alle s Knoten mit Grad mindestens s dominiert, kann deterministisch in O(m + n) Zeit gefunden werden. 2 Es soll jedoch ein auf dem Greedy-Prinzip basierender Algorithmus zur Gewinnung solcher dominierender Knotenmengen angegeben werden. Als Eingabe verlangt der Algorithmus einen Grafen G und einen Knotengrad s und liefert eine dominierende Menge D zusammen mit einer Menge E ∗ von Kanten zwischen dominierten und dominierenden Knoten zurück. dominate(G, s): D sei leere Menge Solange ein nicht-dominierter Knoten ex., füge D einen Knoten aus V , der die größte Anzahl noch nicht dominierter Knoten mit Grad mind. s dominiert, hinzu Konstruiere eine Kantenmenge E ∗ ⊆ E der Größe O(n) so, dass für jedes u ∈ V mit Grad mind. s eine Kante (u, w) ∈ E ∗ ex. mit w ∈ D Gib (D, E ∗ ) zurück Nun kann der eigentliche Zerlegungsalgorithmus formuliert werden: decompose(G, hs1 , s2 , . . . , sk−1 i): Für i ← 2 bis k: Ei ← {e = (u, v) ∈ E|deg(u) ≤ si−1 ∨ deg(v) ≤ si−1 } Für i ← 1 bis k − 1: (Di , Ei∗ ) ← dominate(G, si ) E1 ← E Dk ← S V E ∗ ← 1≤i<k Ei∗ Gib (hE1 , . . . , Ek , E ∗ i, hD1 , . . . , Dk i) zurück decompose nimmt als Eingabe einen (ungewichteten) Grafen G und eine absteigende Folge hs1 , s2 , . . . , sk−1 i von Knotengraden ( Schwellen‘). Zunächst ’ werden Kantenmengen Ei gebildet, wobei noch E1 := E ergänzt wird. Dabei besteht die Menge Ei aus solchen Kanten, die (mindestens einen) Knoten vom Grad höchstens si−1 berühren. Danach werden bezüglich der Folge der Knotengrade jeweils dominierende Mengen Di und Verbindungskanten Ei∗ 3 zwischen dominierten und dominierenden Knoten gefunden, wobei Dk := V ergänzt wird. Schließlich werden alle Kantenmenge Ei∗ zu einer Menge E ∗ vereinigt und zusammen mit den Ei sowie den Di zurückgegeben. Zu bemerken ist noch: die Folge der zurückgegebenen Kantenmengen ist absteigend: E = E1 ⊇ E2 ⊇ . . . ⊇ Ek . Mit Vi sei noch die Menge der Knoten mit Grad (echt) größer als si bezeichnet. Damit gilt: V1 ⊆ V2 ⊆ . . . ⊆ Vk = V , und die Menge Ei besteht genau aus solchen Kanten, die einen Knoten berühren, der nicht zu Vi−1 gehört. Die Laufzeit von decompose liegt in O(k(m + n)) (ohne Beweis). 4 Der Algorithmus apaspk Algorithmus apaspk (G) beinhaltet viele‘ Aufrufe des Algorithmus von Di’ jkstra auf gewichteten Grafen (obwohl Graf G ungewichtet ist). Diese Aufrufe werden im Folgenden für einen (gewichteten) Grafen H, eine Kantenbewertung — welche sowohl als Eingabe als auch als Ausgabe fungiert — (δ̂(u, v))u,v und einen Startknoten v mit dijkstra(H, δ̂, v) bezeichnet, was die Distanzen aller Knoten (und einen Baum mit kürzesten Wegen) von v aus liefert. dijkstra kann in O(m + n log n) Zeit implementiert werden; speziell hier kann eine Implementation in O(m + n) Zeit verwendet werden. Obwohl die Zahl der Aufrufe von dijkstra vergleichsweise groß ist, sind die übergebenen Grafen relativ dünn. Sie sind außerdem nicht notwendigerweise Subgrafen von G und variieren von Aufruf zu Aufruf. Das Gewicht einer Kante (u, v), δ̂(u, v), ist die momentan beste Schranke an die Distanz der Knoten im Originalgrafen und wird initial auf 1 gesetzt, falls (u, v) ∈ E, und auf +∞ sonst. Nun zu apaspk (G): Hier wird zunächst eine Folge von Knotengraden si bestimmt, bezüglich derer der Eingabegraf G dann mittels decompose zerlegt wird. Anschließend wird die Matrix δ̂ — wie eben beschrieben — initialisiert, und es wird für jeden Knoten aus jeder dominierenden Menge Di dijkstra ausgeführt. Rückgabe ist schließlich wieder δ̂. Bemerkt sei noch: Die Kanten aus Ei und E ∗ sind Originalkanten des 4 Grafen, während die Kanten {u} × V nicht notwendig in E enthalten sein müssen. Für i ← 1 bis − 1: ¡ mk¢1−i/k si ← n (log n)i/k (hE1 , E2 , . . . , Ek , E ∗ i, hD1 , D2 , . . . , Dk i) ← decompose(G, hs1 , s2 , . . . , sk−1 i) Für alle u, v ∈ V : falls (u, v) ∈ E: δ̂(u, v) ← 1 sonst δ̂(u, v) ← +∞ Für i ← 1 bis k: für jedes u ∈ Di : dijkstra((V, Ei ∪ E ∗ ∪ ({u} × V )), δ̂, u) Gib (δ̂(u, v))u,v zurück Analyse des Algorithmus Aussagen hinsichtlich der Laufzeit und der Exaktheit von apaspk (G) sind zusammengefasst im folgenden Satz. apaspk (k ≥ 2) läuft in O(kn2−1/k m1/k (log n)1−1/k ) = Õ(n2−1/k m1/k ) Zeit und für alle u, v ∈ V gilt: δ(u, v) ≤ δ̂(u, v) ≤ δ(u, v) + 2(k − 1). Beweis: Zunächst soll die Aussage über die Komplexität des Algorithmus gezeigt werden: Der Aufwand für die Zerlegung des Grafen ist offensichtlich in O(kn2 ), 2 und die Initialisierung der Matrix für die Kantengewichte Pk−1 benötigt O(n ) Zeit. Der Aufwand für alle dijkstra-Aufrufe beträgt O( i=1 |Di |·(|Ei |+n)). n Dies lässt sich unter Beachtung von |Di | = O( n log ), |Dk | = |V | = n, si |E1 | = |E| =Pm und |Ei | = nsi−1 (2 ≤ i ≤ k) zusammenfassen zu n log n n · m + k−2 · nsi−1 + n · nsk−1 ) = O(kn2−1/k , m1/k (log n)1−1/k ). O( n log i=2 s1 si Nun zum Beweis der Exaktheitsaussage: Sei δi (u, v) der Wert von δ̂(u, v) nach dem letzten Durchlauf von dijkstra von allen Knoten aus Di aus. Dann gilt die Behauptung: Für u ∈ Di und v ∈ V ist δ(u, v) ≤ δi (u, v) ≤ δ(u, v) + 2(i − 5 1). Diese Aussage, die mit Induktion nach i bewiesen werden soll, liefert mit Dk = V : Für alle u, v ∈ V ist δ̂(u, v) = δk (u, v) ≤ δ(u, v) + 2(k − 1). Sei Gi (u) := (V, Ei (u)) := (V, Ei ∪ E ∗ ∪ ({u} × V )) der Graf für dijkstra von u ∈ Di aus. Im Fall i = 1 ist E1 (u) ⊇ E, und somit gilt δ1 (u, v) = δ(u, v). Sei deshalb i > 1 und u ∈ Di , v ∈ V . Sei weiterhin p ein kürzester Pfad von u nach v. Wir unterscheiden zwei Fälle: Falls alle Kanten von p in Ei enthalten sind, so auch in Ei (u), und es gilt: δi (u, v) = δ(u, v). Im anderen Fall, d. h. falls es eine Kante auf p nicht aus Ei gibt, existiert ein Knoten aus Vi−1 auf p; w sei der letzte solche Knoten auf p. Mit p0 sei der Teilpfad von p zwischen w und v bezeichnet. Da alle Knoten auf p0 (außer w) nicht in Vi−1 sind, sind alle Kanten auf p0 aus Ei . Sei w0 ∈ Di−1 so, dass (w, w0 ) ∈ E ∗ . Gi (u) enthält (w, w0 ) und eine gewichtete Kante (u, w0 ) mit δi−1 (u, w0 ) = δi−1 (w0 , u) ≤ δ(w0 , u) + 2((i − 1) − 1) ≤ δ(u, w) + (2i − 3). Damit ergibt sich δi (u, v) ≤ δi−1 (u, w0 ) + δ(w, w0 ) + δ(w, v) ≤ δ(u, w) + (2i − 3) + 1 + δ(w, v) ≤ δ(u, v) + (2i − 1). ¤ Ohne Beweis sei noch das folgende Resultat vermerkt: Satz. Für alle 2 ≤ k = O(log n) ist für u, v ∈ V δ̂(u, v) ≤ min{δ(u, v) + 2(k−1), 3δ(u, v)−2}, d. h. der Streckfaktor zwischen exakten und geschätzten Distanzen ist max. 3. 5 Die Algorithmen apaspk und APASPk Algorithmus apaspk funktioniert analog zu apaspk , mit zwei Unterschieden: ¡ ¢1−1/k so werden als Knotengrade si = n1−1/k (log n)i/k statt si = m (log n)i/k n verwendet. Weiterhin beinhalten die Ei (u) mehr Kanten: Ã ! [ Ei (u) = Ei ∪ E ∗ ∪ ({u} × V ) ∪ Dj1 × Dj2 . i+j1 +j2 ≤2k+1 Wir geben ohne Beweis den 6 Satz. apaspk (k ≥ 2) läuft in O(k 2 n2+1/k (log n)1−1/k ) = Õ(n2+1/k ) Zeit und für alle u, v ∈ V gilt: δ(u, v) ≤ δ̂(u, v) ≤ δ(u, v) + 2(b k3 c + 1). Als schärfere Abschätzung lässt sich zeigen, dass apasp3 — genau wie apaspk — geschätzte Distanzen mit einem additiven Fehler von höchstens 2 berechnet. Allerdings läuft apaspk aber auf genügend dichten Grafen besser als apaspk , d. h. wenn m ≥ n5/3 . Bemerkenswert ist nun: Der momentan schnellste bekannte Algorithmus für Boolsche Matrixmultiplikation ist in O(n2.376 ), während die Laufzeit von apasp3 lediglich‘ Õ(n7/3 ) beträgt. ’ APASPk (für gerades k > 2) schließlich ist die Kombination aus apasp k +1 2 und apasp 3k−2 , wo der additive Fehler maximal k beträgt. 2 6 Emulatoren Wir erinnern zunächst noch einmal an die Definition von Emulatoren: Ein k-Emulator zu einem ungewichteten Grafen G = (V, E) ist ein gewichteter Graf G0 = (V, F ) so, dass gilt: δG (u, v) ≤ δG0 (u, v) ≤ δG (u, v) + k für alle u, v ∈ V . Der Unterschied zu den Hilfsgrafen Gk (u) ist der, dass bei Emulatoren ein einziger Graf für eine gute Approximation aller Distanzen gesucht ist. Die Konstruktion dünner‘ k-Emulatoren ist also schwerer als die Berechnung ’ von Distanzen mit Fehler k. Im Unterschied zu k-Spannern sind die Kanten aus F gewichtet; außerdem muss G0 nicht notwendig Subgraf von G sein. Es gilt der folgende Satz (o. B.). Zu jedem ungewichteten ungerichteten Grafen mit n Kanten gibt es einen 2-Emulator mit O(n3/2 (log n)1/2 ) Kanten, der in O(n2 log2 n) Zeit konstruiert werden kann. Ebenfalls nur stichpunktartig und ohne Beweis notieren wir den Satz. Graf G3 aus apasp3 ist 4-Emulator zu G. G3 enthält Õ(n4/3 ) Kanten. Bedauerlicherweise kann letzteres Resultat nicht verallgemeinert werden: 7 so können für k > 4 k-Emulatoren nicht analog durch apaspl gewonnen werden. Ein noch offenes Problem schließlich ist das folgende: Sei ek das Infimum so, dass jeder Graf mit n Knoten einen k-Emulator mit Õ(n1+ek ) Kanten hat. Nach Obigem gilt e2 ≤ 21 und e4 ≤ 31 . Die Frage besteht nun darin, ob ek → 0 für k → ∞. 7 Spanner Ein k-Spanner eines Grafen G = (V, E) ist ein Subgraf G0 = (V, E 0 ) von G so, dass gilt: δG0 (u, v) ≤ k · δG (u, v). Satz. Jeder gewichtete ungerichtete Graf G hat einen 3-Spanner mit O(n3/2 (log n)1/2 ) Kanten, der in Õ(m(n log n)1/2 ) Zeit konstruiert werden kann. Der Beweis dieses Satzes, der lediglich skizziert werden soll, stützt sich auf das Lemma (truncated Dijkstra; o. B.). Sei G ein gewichteter Graf. Die Adjazenzlisten der Knoten von G seien nach dem Kantengewicht geordnet. Sei v ∈ V und 1 ≤ s ≤ n. Kürzeste Wege von v zu s Knoten, die v am nächsten sind, können in O(s(s + log n)) Zeit gefunden werden. Zurück zur Beweisskizze: Für jeden Knoten v ∈ V und mit geeignetem s ∈ N wird truncated Dijkstra ausgeführt, was jeweils eine Menge N (v) der s nächsten Knoten zu v liefert. Weiterhin kann eine Menge D der Mächtigkeit n O( n log ) derart gefunden werden, dass für jedes v ∈ V ein u ∈ D ∩ N (v) s existiert. Für jedes u ∈ D wird der volle Dijkstra ausgefürt. Der 3-Spanner enthält nun alle Kürzeste-Wege-Bäume aus allen (d. h. den truncated und den vollen) Dijkstra-Durchläufen. 8 Ausblick Wir haben gezeigt: Alle Knotendistanzen in ungewichteten ungerichteten Grafen können mit einem additiven Fehler von max. 2 in Õ(n7/3 ) Zeit berechnet werden, d. h. schneller als der schnellste bekannte MatrixmultiplikationsAlgorithmus. 8 Weitere noch offene Probleme sind: Können Distanzen mit einem additiven Fehler von max. 2 zwischen allen Knotenpaaren eines Grafen in O(n7/3−ε ) Zeit, ε > 0, gefunden werden? Können Distanzen mit einem additiven Fehler von maximal k, k ≥ 2 fest, zwischen allen Knotenpaaren eines Grafen in Õ(n2 ) Zeit gefunden werden? 9 Literaturverzeichnis Dorit Dor, Shay Halperin und Uri Zwick: All-Pairs Almost Shortest Paths. SIAM Journal on Computing, 29(5):1740–1759, Oktober 2000. 9