Ich habe einen gerichteten Graphen mit Millionen von Ecken und Kanten. Es wird eine Reihe von Vertices angegeben, angenommen, sie heißen "START_POINTS". Eine weitere Gruppe von Vertices, "END_POINTS" genannt, wird ebenfalls angegeben. Das Problem besteht darin herauszufinden, welche END_POINTS von welchen START_POINTS aus erreicht werden können. HierEffiziente Suche in einem gerichteten Graphen
ein Beispiel:
START_POINTS: S1 S2 S3 S4 S5 S6 S7 ...
END_POINTS : E1 E2 E3 E4 E5 E6 E7 ...
Der Algorithmus sollte folgende Lage sein, sagen:
S1 can reach to E1, E2, E6
S2 can reach to E9, E10
S3 cannot reach any END_POINT
S4 can reach to .....
....
Einige der END_POINTS vielleicht nicht von jedem START_POINT erreicht werden.
Jetzt ist die Frage: Was ist der effizienteste Weg, um es zu implementieren?
Ich habe versucht, von jedem START_POINT eins nach dem anderen zu starten und die erreichbaren END_POINTS mit Tiefensuche (oder BFS, es ändert die Laufzeit viel) zu finden. Es kostet jedoch viel Zeit, da es so viele START_POINTS gibt (es gibt auch viele END_POINTS).
Die Suche kann optimiert werden, da sich die verfolgten Pfade von START_POINTS stark überschneiden. Man muss sich merken, welche Pfade welche END_POINTS erreichen können. Was ist der effizienteste Weg, dies zu erreichen? Dies könnte ein bekanntes Problem sein, aber ich konnte noch keine Lösung finden.
EDIT am 6. Januar:
Ich versuchte highBandWidth Idee (in einer Weise, ähnlich dem, was Keith Randall vorgeschlagen) zu implementieren: Für jeden Knoten, wenn dieser Knoten wird Punkt nicht beginnen oder enden, schließen Sie alle Eingänge zu Ausgängen, dann entfernen Sie den Knoten.
foreach NODE in NODES
Skip if NODE is START_POINT or END_POINT
foreach OUTPUT_NODE of NODE
Disconnect NODE from INPUT_NODE
end
foreach INPUT_NODE of NODE
Disconnect NODE from INPUT_NODE
foreach OUTPUT_NODE of NODE
Connect INPUT_NODE to OUTPUT_NODE
end
end
Remove NODE from NODES
end
Das beginnt sehr schnell und wird schnell sehr langsam, vor allem weil die Eingabe/Ausgabe-Zählungen verbleibenden Knoten sehr groß werden und für Schleifen verschachtelt tötet die Leistung. Irgendeine Idee, wie es effizienter gemacht werden kann?
Ich werde diese Methode implementieren und mit den Ergebnissen zurückkommen. – Yilmaz