„External Memory Minimaler Spannbaum“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[ungesichtete Version][ungesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Flkrueger (Diskussion | Beiträge)
Flkrueger (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
Ein '''externer minimaler Spannbaum''' bezeichnet in der Informatik einen minimalen Spannbaum, der für einen in den Sekundärspeicher ausgelagerten Graphen berechnet wurde. Letzteres ist für Graphen nötig, deren Anzahl Knoten und Kanten zu groß ist, als das sie gleichzeitig vollständig in den Hauptspeicher passen.
Ein '''externer minimaler Spannbaum''' bezeichnet in der Informatik einen minimalen Spannbaum, der für einen in den Sekundärspeicher ausgelagerten Graphen berechnet wurde. Letzteres ist für Graphen nötig, deren Anzahl Knoten und Kanten zu groß ist, als das sie gleichzeitig vollständig in den Hauptspeicher passen.


Als Berechnungsmodell zieht man das External Memory Modell heran. Es besteht aus Haupt-und Sekundärspeicher, wobei ersterer eine Kapazität von <math>M</math> hat und Datenblöcke der Größe <math>B</math> zwischen ersterem und letzterem hin- und hergeschoben werden können. Das Lesen/Schreiben eines Blocks in vom (in den) Sekundärspeicher in den (vom) Hauptspeicher, bezeichnet man als '''I/O''' (= ''Input/Output'').
Als Berechnungsmodell zieht man das External Memory Modell heran. Es besteht aus Haupt-und Sekundärspeicher, wobei ersterer eine Kapazität von <math>M</math> hat und Datenblöcke der Größe <math>B</math> zwischen ersterem und letzterem hin- und hergeschoben werden können. Das Lesen/Schreiben eines Blocks in vom (in den) Sekundärspeicher in den (vom) Hauptspeicher, bezeichnet man als '''I/O''' (= ''Input/Output'').


== Semiexterne Berechnung ==
== Semiexterne Berechnung ==
Zeile 44: Zeile 44:


Insgesamt sind dafür <math>\lceil \log_2(\frac{|V| \cdot B}{|E|})\rceil</math> Phasen nötig. Eine einzelne Phase lässt sich mit <math>O(sort(|E|))</math> I/Os implementieren<ref>{{Literatur |Autor=Lars Arge, Gerth Stølting Brodal, Laura Toma |Titel=On external-memory MST, SSSP and multi-way planar graph separation |Hrsg= |Sammelwerk=Journal of Algorithms |Band=53 |Nummer=2 |Auflage= |Verlag= |Ort= |Datum=2004-11-01 |ISBN= |ISSN=0196-6774 |DOI=10.1016/j.jalgor.2004.04.001 |Seiten=192-193 |Online=http://www.sciencedirect.com/science/article/pii/S0196677404000641 |Abruf=2019-07-18}}</ref>, sodass sich insgesamt <math>O(sort(|E|)) \cdot \max{\{1, \log_2(\frac{|V| \cdot B}{|E|})\}}</math> I/Os ergeben <ref>{{Literatur |Autor= |Titel=Algorithms for Memory Hierarchies |Hrsg= |Sammelwerk=Lecture Notes in Computer Science |Band= |Nummer= |Auflage= |Verlag= |Ort= |Datum=2003 |ISBN= |ISSN=0302-9743 |DOI=10.1007/3-540-36574-5 |Seiten=81 |Online=https://link.springer.com/book/10.1007/3-540-36574-5 |Abruf=2019-07-18}}</ref> . Das Maximum findet sich in der Komplexität wieder, weil mindestens eine Sortierphase nötig ist.
Insgesamt sind dafür <math>\lceil \log_2(\frac{|V| \cdot B}{|E|})\rceil</math> Phasen nötig. Eine einzelne Phase lässt sich mit <math>O(sort(|E|))</math> I/Os implementieren<ref>{{Literatur |Autor=Lars Arge, Gerth Stølting Brodal, Laura Toma |Titel=On external-memory MST, SSSP and multi-way planar graph separation |Hrsg= |Sammelwerk=Journal of Algorithms |Band=53 |Nummer=2 |Auflage= |Verlag= |Ort= |Datum=2004-11-01 |ISBN= |ISSN=0196-6774 |DOI=10.1016/j.jalgor.2004.04.001 |Seiten=192-193 |Online=http://www.sciencedirect.com/science/article/pii/S0196677404000641 |Abruf=2019-07-18}}</ref>, sodass sich insgesamt <math>O(sort(|E|)) \cdot \max{\{1, \log_2(\frac{|V| \cdot B}{|E|})\}}</math> I/Os ergeben <ref>{{Literatur |Autor= |Titel=Algorithms for Memory Hierarchies |Hrsg= |Sammelwerk=Lecture Notes in Computer Science |Band= |Nummer= |Auflage= |Verlag= |Ort= |Datum=2003 |ISBN= |ISSN=0302-9743 |DOI=10.1007/3-540-36574-5 |Seiten=81 |Online=https://link.springer.com/book/10.1007/3-540-36574-5 |Abruf=2019-07-18}}</ref> . Das Maximum findet sich in der Komplexität wieder, weil mindestens eine Sortierphase nötig ist.

=== Randomisiert ===
Anstatt den deterministischen Verfahren kann man die Berechnung auch [[Randomisierter Algorithmus|randomisiert]] durchführen. Im Folgenden wird ein solcher Algorithmus von Dementiev et al.<ref>{{Literatur |Autor=Roman Dementiev, Peter Sanders, Dominik Schultes, Jop Sibeyn |Titel=Engineering an External Memory Minimum Spanning Tree Algorithm |Sammelwerk=Exploring New Frontiers of Theoretical Informatics |Verlag=Springer US |Datum=2004 |Reihe=IFIP International Federation for Information Processing |ISBN=9781402081415 |DOI=10.1007/1-4020-8141-3_17 |Seiten=195–208 |Online=https://link.springer.com/chapter/10.1007/1-4020-8141-3_17 |Abruf=2019-07-25}}</ref> beschrieben.

Die Idee ist es die Anzahl Knoten solange zu reduzieren, bis man auf dem verbleibenden Graphen einen semiexternen Algorithmus ausführen kann. Die Reduktion wird auch durch Kantenkontraktion, wie oben beschrieben, umgesetzt. Dabei wird iterativ ein zufälliger Knoten ausgewählt und nur dessen leichteste Kante kontrahiert, nachdem sie in den minimalen Spannbaum aufgenommen wurde.

== Literatur ==
== Literatur ==



Version vom 25. Juli 2019, 10:49 Uhr

Ein externer minimaler Spannbaum bezeichnet in der Informatik einen minimalen Spannbaum, der für einen in den Sekundärspeicher ausgelagerten Graphen berechnet wurde. Letzteres ist für Graphen nötig, deren Anzahl Knoten und Kanten zu groß ist, als das sie gleichzeitig vollständig in den Hauptspeicher passen.

Als Berechnungsmodell zieht man das External Memory Modell heran. Es besteht aus Haupt-und Sekundärspeicher, wobei ersterer eine Kapazität von hat und Datenblöcke der Größe zwischen ersterem und letzterem hin- und hergeschoben werden können. Das Lesen/Schreiben eines Blocks in vom (in den) Sekundärspeicher in den (vom) Hauptspeicher, bezeichnet man als I/O (= Input/Output).

Semiexterne Berechnung

Eine Einschränkung zur Definition aus der Einleitung, bilden semiexterne Algorithmen zur Berechnung minimaler Spannbäume. Jene Algorithmen verarbeiten ungerichtete Graphen , von denen nur die Knoten in den Hauptspeicher passen. Formal ist das durch die Beziehung[1]


gegeben, wobei eine Konstante ist.

Der Algorithmus von Kruskal lässt sich leicht als semiexterne Variante[2] umsetzen. Dazu muss man die Kanten zunächst nach aufsteigendem Gewicht extern sortieren, was sich mithilfe von (die Sortierschranke) I/Os realisieren lässt. Die Union-Find-Struktur lässt sich vollständig im Hauptspeicher verwalten, wodurch sich insgesamt I/Os ergeben.

Externe Berechnung

Falls die Knotenmenge ebenfalls zu groß für den Hauptspeicher ist, so lässt sich ein minimaler Spannbaum durch externe Algorithmen berechnen.

Algorithmus von Prim

Ein bekannter Vertreter ist der Algorithmus von Prim, den man für gewöhnlich im Hauptspeicher ausführt. Man kann ihn durch eine kleine Modifikation[3] extern ausführen, wozu es einer externen Prioritätswarteschlange bedarf. Diese speichert die Kanten des Graphen, wobei als Priorität deren Gewichte genommen werden. Der Algorithmus wählt iterativ die Kante geringsten Gewichts aus, was durch eine extractMin()-Operation der Warteschlange bewerkstelligt wird. Den Ablauf kann man einfach in Pseudocode gießen (es ist zu beachten, dass die gerichteten Kanten von betrachtet werden):

G = (V,E): Graph
c: Gewichtsfunktion der Kanten
s  V(G): Startknoten
Adj: adjazenten Knoten eines Knoten
Inc: inzidente Kanten eines Knoten 

external_prim(G,c,s):
01  T  // T = (V,E): Knoten und Kanten des zu berechnenden MST
02  Q  leere externe Prioritätswarteschlange
03  für alle e  Adj(s)
04      Q.insert(e, c(e))
05  solange Q nicht leer
06      (u,v) Q.extractMin()
07      wenn v nicht Teil von T
08          V(T)  V(T) {v}
09          E(T)  E(T) {(u,v)}
10          für alle e  Inc(v) \ {(v,u)} // denn (u,v) ist schon aufgenommen worden
11              Q.insert(e, c(e))        
12  return T

Hier ist die wichtige Annahme, wodurch die I/O-Effizienz zustande kommt, dass die Kantengewichte paarweise verschieden sind. Damit kann man die Überprüfung in Zeile 7, ob der v Knoten bereits im Spannbaum enthalten ist, leicht realisieren. Man muss dazu lediglich überprüfen, ob die nächste Kante minimalen Gewichts gleich (u,v) (aus Zeile 6) ist, was nur eine zusätzliche extractMin()-Operation der Warteschlange Q erfordert. Denn jeder Knoten fügt seine inzidenten Kanten in Q ein und falls v schon Teil des Spannbaums sind, so befindet sich die Kante (v,u) ebenfalls in Q. Darin muss diese Kante aber der unmittelbare Nachfolger von (u,v) sein, da nach Annahme keine zwei Kanten das selbe Gewicht haben.

Die gesamte I/O-Komplexität beträgt . Zunächst wird für jeden Knoten dessen adjazente Knoten ausgelesen, was bei Umsetzung per Adjazenzliste I/Os erfordert (der zweite Summand ist die Scanschranke I/Os ). Der Algorithmus verarbeitet alle Kanten von und führt pro Kante höchstens zwei Operationen der Warteschlange aus. Wenn man davon ausgeht, dass die Warteschlange Operationen mit I/Os unterstützt, dann lässt sich die Gesamtkomplexität mit I/Os bemessen.

Kantenreduktion

Ein anderer Ansatz ist es, iterativ Kanten des minimalen Spannbaumes zu identifizieren, sodass man diese entfernen kann. Das führt man solange fort, bis der resultierende Graph ausreichend dicht ist. Ist der Graph ausreichend dicht, so fällt die Komplexität für das Berechnen des minimalen Spannbaumes auf dem verbleibenden Graphen insgesamt nicht mehr ins Gewicht [4].

Beispiel einer Kantenkontraktion: die Kante wurde kontrahiert. Die neue Kante war vorher .

Konkret will man die Anzahl Knoten auf mindestens reduzieren, um dann auf dem resultierenden Graphen den Algorithmus von Prim laufen zu lassen, wodurch sich die Komplexität von letzterem zu I/Os vereinfacht.

Die Reduktion entstammt dem Algorithmus von Borůvka, weswegen der folgende Ablauf auch Boruvka-Phase genannt wird: für jeden Knoten wählt man die leichteste adjazente Kante aus, welche Teil des minimalen Spannbaums sein muss. Anschließend kontrahiert man jede solche Kante, sodass sich die Anzahl Knoten mindestens halbiert. Bei der Kontraktion können neue Kanten entstehen, sodass man für diese Verweise auf dessen ursprüngliche Kante speichern muss. Letzteres ist nötig, um am Ende einen minimalen Spannbaum für den ursprünglichen Graphen konstruieren zu können.

Insgesamt sind dafür Phasen nötig. Eine einzelne Phase lässt sich mit I/Os implementieren[5], sodass sich insgesamt I/Os ergeben [6] . Das Maximum findet sich in der Komplexität wieder, weil mindestens eine Sortierphase nötig ist.

Randomisiert

Anstatt den deterministischen Verfahren kann man die Berechnung auch randomisiert durchführen. Im Folgenden wird ein solcher Algorithmus von Dementiev et al.[7] beschrieben.

Die Idee ist es die Anzahl Knoten solange zu reduzieren, bis man auf dem verbleibenden Graphen einen semiexternen Algorithmus ausführen kann. Die Reduktion wird auch durch Kantenkontraktion, wie oben beschrieben, umgesetzt. Dabei wird iterativ ein zufälliger Knoten ausgewählt und nur dessen leichteste Kante kontrahiert, nachdem sie in den minimalen Spannbaum aufgenommen wurde.

Literatur

  • Otakar Borůvka: O jistém problému minimálním. S.37-58, ([1]).
  • Alok Aggarwal, Jeffrey Vitter: The Input/Output Complexity of Sorting and Related Problems., ACM, New York 1988, S.1116-1127 ([2]).
  • Autor: Titel. Verlag, Ort Jahr, ISBN.
  • Autor: Titel. Verlag, Ort Jahr, ISBN, S. X–Y.
  • Herausgeber (Hrsg.): Titel (= Reihe. Band). x. Auflage. Verlag, Ort Jahr, ISBN.
  • Autor: Titel. In: Herausgeber (Hrsg.): Sammelwerk (= Reihe. Band). Verlag, Ort Jahr, ISBN, S. X–Y ([http:// online]).
  • Autor X, Autor Y: Titel. Untertitel. In: Zeitschrift. Band/Jahrgang, Nr. X, Jahr, ISSN 0000-0000, S. X–Y ([http:// PDF; 1,1 MB]).
  • Autor: Titel. Herausgegeben von Herausgeber. Verlag, Ort Jahr, ISBN.

Einzelnachweise

  1. Algorithms for Memory Hierarchies. In: Lecture Notes in Computer Science. 2003, ISSN 0302-9743, S. 65, doi:10.1007/3-540-36574-5 (springer.com [abgerufen am 18. Juli 2019]).
  2. Abello, Buchsbaum, Westbrook: A Functional Approach to External Graph Algorithms. In: Algorithmica. Band 32, Nr. 3, 1. März 2002, ISSN 1432-0541, S. 8, doi:10.1007/s00453-001-0088-5 (doi.org [abgerufen am 18. Juli 2019]).
  3. Lars Arge, Gerth Stølting Brodal, Laura Toma: On external-memory MST, SSSP and multi-way planar graph separation. In: Journal of Algorithms. Band 53, Nr. 2, 1. November 2004, ISSN 0196-6774, S. 190–191, doi:10.1016/j.jalgor.2004.04.001 (sciencedirect.com [abgerufen am 18. Juli 2019]).
  4. Algorithms for Memory Hierarchies. In: Lecture Notes in Computer Science. 2003, ISSN 0302-9743, S. 77, doi:10.1007/3-540-36574-5 (springer.com [abgerufen am 18. Juli 2019]).
  5. Lars Arge, Gerth Stølting Brodal, Laura Toma: On external-memory MST, SSSP and multi-way planar graph separation. In: Journal of Algorithms. Band 53, Nr. 2, 1. November 2004, ISSN 0196-6774, S. 192–193, doi:10.1016/j.jalgor.2004.04.001 (sciencedirect.com [abgerufen am 18. Juli 2019]).
  6. Algorithms for Memory Hierarchies. In: Lecture Notes in Computer Science. 2003, ISSN 0302-9743, S. 81, doi:10.1007/3-540-36574-5 (springer.com [abgerufen am 18. Juli 2019]).
  7. Roman Dementiev, Peter Sanders, Dominik Schultes, Jop Sibeyn: Engineering an External Memory Minimum Spanning Tree Algorithm. In: Exploring New Frontiers of Theoretical Informatics (= IFIP International Federation for Information Processing). Springer US, 2004, ISBN 978-1-4020-8141-5, S. 195–208, doi:10.1007/1-4020-8141-3_17 (springer.com [abgerufen am 25. Juli 2019]).