Externe Speichergrafik -Traversal
Externe Speichergrafik -Traversal ist eine Art von Art von Graph Traversal Optimiert für den Zugriff auf extern gespeicherte Speicher.
Hintergrund
Graph Traversal ist eine Unterprogramme in den meisten Graph -Algorithmen. Das Ziel eines Graph -Traversal -Algorithmus ist es, jeden Knoten eines Graphen zu besuchen (und / oder zu verarbeiten). Graph -Traversal -Algorithmen wie Breite-First-Suche und Tiefe-First-Suche, werden mit dem analysiert von Neumann Modell, das einheitlicher Speicherzugriffskosten annimmt. Diese Ansicht vernachlässigt die Tatsache, dass für riesige Instanzen ein Teil des Diagramms eher auf der Festplatte als auf dem internen Speicher liegt. Da der Zugriff auf die Festplatte langsamer ist als der Zugriff auf den internen Speicher, ist die Notwendigkeit einer effizienten Durchführung von Externer Speicher existiert.
Externes Speichermodell
Zum externe Speicheralgorithmen Das externe Speichermodell von Aggarwal und Vitter[1] wird zur Analyse verwendet. Eine Maschine wird durch drei Parameter angegeben: M, B und D.M ist die Größe des internen Speichers, B ist die Blockgröße einer Festplatte und D ist die Anzahl der parallelen Festplatten. Das Maß für die Leistung für einen externen Speicheralgorithmus ist die Anzahl der von ihm ausgeführten I/O -OS.
Externe Speicherbreite-erste Suche
Der Suchalgorithmus für Breite-First-Such beginnt an einem Wurzelknoten und durchquert jeden Knoten mit Tiefe. Wenn es in der aktuellen Tiefe keine nicht besuchten Knoten mehr gibt, werden Knoten in einer höheren Tiefe durchquert. Schließlich wurde jeder Knoten des Diagramms besucht.
Munagala und Ranade
Für eine ungerichtete Grafik Munagala und Ranade[2] schlug den folgenden externen Speicheralgorithmus vor:
Lassen Bezeichnen Sie die Knoten in der Breite-First-Suchstufe t und lassen Sie es Seien Sie der Vielfalt von Nachbarn von Level T-1. Für jedes t, kann aus konstruiert werden aus Indem Sie es in einen Satz umwandeln und zuvor besuchte Knoten davon ausschließen.
- Schaffen Durch den Zugriff auf die Adjazenzliste jedes Scheitelpunkts in . Dieser Schritt erfordert I/o.
- Nächste wird von Durch Entfernen von Duplikaten. Dies kann durch die Sortierung von erreicht werden , gefolgt von einer Scan- und Verdichtungsphase, die erforderlich ist I/o.
- wird durch einen parallelen Scan berechnet und und erfordert I/o.
Die Gesamtzahl der I/Os dieses Algorithmus folgt, dass dies berücksichtigt wird und und ist .
Eine Visualisierung der drei beschriebenen Schritte, die zur Berechnung erforderlich sind L(t) wird in der Abbildung rechts dargestellt.
Mehlhorn und Meyer
Mehlhorn und Meyer[3] schlug einen Algorithmus vor, der auf dem Algorithmus von Munagala und Ranade (MR) basiert und ihr Ergebnis verbessert.
Es besteht aus zwei Phasen. In der ersten Phase ist die Grafik vorverarbeitet, die zweite Phase führt eine Breite-First-Suche mit den in Phase 1 gesammelten Informationen durch.
Während der Vorverarbeitungsphase wird die Grafik in unzusammenhängende Untergraphen aufgeteilt mit kleinem Durchmesser. Es verteilt sich weiter, die Adjazenz listet entsprechend durch, indem eine externe Datei erstellt wird , wo Enthält die Adjazenzliste für alle Knoten in .
Die Breite-First-Suchphase ähnelt dem MR-Algorithmus. Zusätzlich verwaltet der Algorithmus eine sortierte externe Datei . Diese Datei wird mit initialisiert mit . Darüber hinaus tragen die Knoten aller erstellten Suchebene der Breite zuerst die Identifikatoren für die Dateien ihrer jeweiligen Untergraphen . Anstatt zufällige Zugriffe zum Konstrukt zu verwenden die Datei wird genutzt.
- Führen Sie einen parallelen Scan sortierter Liste durch und . Extrahieren Sie die Adjazenzlisten für Knoten , das kann in gefunden werden .
- Die Adjazenzlisten für die verbleibenden Knoten, die nicht gefunden werden konnten müssen abgerufen werden. Ein Scan vorbei ergibt die Partitionskennung. Nach dem Sortieren und Löschen von Duplikaten die jeweiligen Dateien kann zu einer temporären Datei verkettet werden .
- Die fehlenden Adjazenzlisten können extrahiert werden mit einem Scan. Als nächstes werden die verbleibenden Adjazenzlisten zusammengeführt mit einem einzigen Pass.
- wird durch einen einfachen Scan erstellt. Die Partitionsinformationen sind an jeden Knoten in beigefügt .
- Der Algorithmus geht wie der MR -Algorithmus fort.
Kanten können häufiger in gescannt werden , aber unstrukturierte I/Os, um Adjazenzlisten abzurufen, werden reduziert.
Die Gesamtzahl der I/A für diesen Algorithmus ist
Externe Speichertiefe-erste Suche
Der Tiefen-First-Suchalgorithmus untersucht vor dem Backcracing einen Diagramm entlang jedes Zweigs.
Zum gerichtet Diagramme Buchsbaum, Goldwasser, Venkatasubramanian und Westbrook[4] schlug einen Algorithmus mit vor I/o.
Dieser Algorithmus basiert auf einer Datenstruktur genannt gepufferter Repository -Baum (BRT). Es speichert eine Vielzahl von Elementen aus einem geordneten Universum. Elemente werden durch Schlüssel identifiziert. Ein BTR bietet zwei Vorgänge:
- Einfügen (t, x), was Artikel hinzufügt x zu T und braucht Amortisierte I/O. N ist die Anzahl der zu der BTR hinzugefügten Elemente.
- Extrakt (t, k), welche berichtet und löscht T Alle Elemente mit Schlüssel k. Es benötigt I/o, wo S ist die Größe des Sets von zurückgegeben von Extrakt.
Der Algorithmus simuliert einen internen Tiefen-ersten-Suchalgorithmus. Ein Stapel S von Knoten ist halten. Während einer Iteration für den Knoten v auf S Schieben Sie einen unbevölkerten Nachbarn auf S und iterieren. Wenn es keine nicht besuchten Nachbarn gibt v.
Die Schwierigkeit besteht darin, festzustellen, ob ein Knoten ohne dies nicht besucht wird I/o pro Kante. Um dies für einen Knoten zu tun v Eingehende Kanten (x, v) werden in eine BRT gestellt D, Wenn v wird zuerst entdeckt. Ferner ausgehende Kanten (v,x) werden in eine vorrangige Warteschlange versetzt P(v), gekämpft durch den Rang in der Adjazenzliste.
Für Scheitelpunkt u auf S alle Kanten (u,x) werden aus extrahiert aus D. Solche Kanten existieren nur, wenn x wurde seit dem letzten Mal entdeckt u war ganz oben auf S (oder seit Beginn des Algorithmus, wenn u ist das erste Mal darüber hinaus S). Für jede Kante (u,x) eine Löschung (x) Der Betrieb wird auf durchgeführt P(u). Endlich a Betrieb löschen an P (u) ergibt den nächsten nicht besuchten Knoten. Wenn P(u) ist leer, u ist ausgestoßen von S.
Pseudocode für diesen Algorithmus ist unten angegeben.
1 Verfahren BGVW-T-TEPTH-First Search (G, v): 2 Lass es S Sei ein Stapel, P[] eine vorrangige Warteschlange für jeden Knoten und D A BRT 3 S.drücken(v) 4 während S ist nicht leer 5 v = S.top () 6 wenn v ist nicht markiert: 7 Mark (v) 8 alle Kanten extrahieren (v, x) aus D, x: P[v].löschen(x) 9 wenn u = P[v] .delete-min () nicht null 10 S.drücken(u) 11 anders 12 S.pop () 13 Verfahren Kennzeichen(v) 14 Setzen Sie alle Kanten (x, v) hinein D 15 (v, x): stellen x hinein P[v]
Verweise
- ^ Aggarwal, Alok; Vitter, Jeffrey (1988). "Die Eingangs-/Ausgangskomplexität der Sortierung und verwandte Probleme". Kommunikation der ACM. 31 (9): 1116–1127. doi:10.1145/48529.48535.
- ^ Munagala, Kameshwar; Ranade, Abhiram (1999). "I/O-Komplexität von Graphalgorithmen". Verfahren des zehnten jährlichen ACM-SIAM-Symposiums über diskrete Algorithmen. Soda '99. Baltimore, Maryland, USA: Gesellschaft für industrielle und angewandte Mathematik. S. 687–694.
- ^ Mehlhorn, Kurt; Meyer, Ulrich (2002). "Externe Memory Breadth-First-Suche mit Sublinear I/O". Algorithmen - ESA 2002. ESA 2002. Rom, Italien: Springer Berlin Heidelberg. S. 723–735.
- ^ Buchsbaum, Adam L.; Goldwasser, Michael; Venkatasubramanian, Michael; Westbrook, Suresh (2000). "Auf externer Speichergrafik -Traversal". Verfahren des elften jährlichen ACM-SIAM-Symposiums über diskrete Algorithmen. Soda '00. San Francisco, Kalifornien, USA: Gesellschaft für industrielle und angewandte Mathematik. S. 859–860.