Ich habe versucht, herauszufinden, wie ein O (n) Zeit Komplexität Algorithmus zu finden, den folgenden in Java zu lösen:Pfadrekonstruktion mit Hashing?
Wir gegeben sind ein Eingangspaar mit einem Startpunkt und Endpunkt, und wir Konstrukt muss einen Pfad, so daß der Beginn eines Eingang das Ende einer anderen Eingabe übereinstimmt (in diesem Fall alphabetisch)
EX: wenn ich eine Liste
PB
BM
OPhabe MZ
wo PB oder BM-Paare sind, P der Startpunkt und B ist das Ende
wobei I sollte
OP
PB
BM
als Ausgabe erstellen MZ
Und natürlich möchte ich um nach Zyklen zu suchen - in diesem Fall werde ich nur berichten, ob es einen Zyklus gibt.
Das erste Mal, als ich das versuchte, benutzte ich einen Swapping-Algorithmus, der O (N^2) war, indem ich im Grunde genommen zwei Einträge vertauschte und die Liste nach unten bewegte. Es gibt definitiv einen schnelleren Weg, dies zu tun, und ich verstehe semi-intuitiv, wie es geht, aber ich frage mich, ob jemand es etwas aufklären könnte.
Grundsätzlich gehe ich davon aus, dass Sie eine Art Hash/Key-Struktur erstellen müssen, in der Sie den Wert des Objekts selbst mit einem Schlüssel referenzieren können.
Zum Beispiel würden Sie zwei Sammlungen behalten, eine der Starts und eine der Enden. Sie können jede Eingabe verwenden und ein Objekt mit einem Start- und einem Endfeld erstellen und dann alle Start- und Endpunkte zu zwei Arrays hinzufügen. Dann müsste man für jeden Start grundsätzlich [start] finden und nach dem Auffinden das entsprechende Objekt zu einer Liste hinzufügen.
Meine einzige Sache ist, ich kann nicht genau herausfinden, wie man das in Java unter Verwendung einer Hash-Tabelle oder einer ähnlichen Datenstruktur implementiert. Muss ich die Start- und Endpunkte zu separaten Hash-Tabellen hinzufügen und dann die Startpunkte als Suchschlüssel verwenden?
Pseudocode an jemanden aus der Suche, die es in Python auf Github gelöst:
for inputs
parse input
add parse[1] to starts, add parse[2] to ends
for starts
find origin (a start not in ends) <--requires hash?
if no origin
cycle exists
for inputs
find ends[origin] <--requires hash?
origin = ends[origin] <-- so we can find the next one
fragt sich, ob jemand mir dies in Java zu einem Algorithmus übersetzen helfen könnte (andere effiziente Lösungen sehr willkommen, da ich daran interessiert bin Art der Problemlösung) oder allgemein aus Sicht der Datenstrukturen.
Wie sieht ein Zyklus aus? Aus Sicht der Datenstruktur haben Sie im Wesentlichen ein [gerichtetes Diagramm] (http://algs4.cs.princeton.edu/42directed/), wobei jeder Buchstabe ein Knoten/Scheitelpunkt ist und jedes Paar eine Kante ist. Was aus Ihrer Frage nicht klar ist, ist, ob irgendein Knoten mehrere verbundene Knoten haben kann: d.h. ist "PB, MB" (zwei ankommende Kanten an den gleichen Knoten) gültig? Ist 'P B, P M' (zwei ausgehende Kanten vom selben Eckpunkt) gültig? Sie sagen, Zyklen sind gültig, also denke ich, dass "P B, B P" gültig ist. Was ist mit nicht verbundenen Scheitelpunkten? "P B, M Z", "P B, B O, M Z" oder nur "P" (P ohne Kanten). –
Die Arten gültiger Eingaben haben großen Einfluss auf die Arten von Algorithmen, die angewendet werden können, und auf ihre Laufzeitkomplexität. Daher schlage ich vor, dass die Eingaben vollständig gültig sind, welche ungültig sind und welche Ausgabe Sie jeweils wünschen. –
das macht Sinn. gehen Sie im Grunde davon aus, dass Zyklen nicht existieren und dass jeder Startpunkt nur einen Endpunkt hat. Ich versuche zu trennen, einen Zyklus in ein separates Problem zu finden – frei