Iterations reihenfolge von geschachtelten Vektoren ändern
-
Hallo!
Ich habe zwei Vektoren U und V.
Ich möchte nun jedes Element in U mit jedem Element in V vergleichen, und abbrechen falls mindestens ein Element in U auch in V ist.
Erste Lösung die mir dazu einfiel:bool found = false; for(int i=0; i < U.size(); i++) { for(int j=0; j < V.size(); j++) { if(U[i] == V[j]) { found = true; break; } } if(found) break; }
Dann habe ich festgestellt, dass ich viel schneller abbrechen kann (bedingt durch die Anordnung der Elemente in U und V), wenn ich die iterations Reihenfolge ändern würde, also statt der links stehenden (wie om fall oben) die rechts benutzen würde
Beispiel mit V.size() == 3 und U.size() == 3 (i, j) (i, j) (0, 0) (0, 0) (0, 1) (0, 1) (0, 2) (1, 0) (1, 0) (1, 1) (1, 1) (0, 2) (1, 2) (2, 0) (2, 0) (1, 2) (2, 1) (2, 1) (2, 2) (2, 2)
Also, wenn i und j jeweils möglichst dicht bei 0 sind ist ein Abbruch wahrscheinlicher. Wie kann ich erreichen, dass i und j wie rechts angezeigt durchlaufen werden?
Danke!
-
Dudeldu schrieb:
bedingt durch die Anordnung der Elemente in U und V
Soll das heißen, dass eine Ordnungsrelation definiert werden könnte, derzufolge die Vektoren geordnet sind?
-
Bin mir nicht sicher...
Ich stellt mal das Ganze Problem dar:
Ich habe d Drohnen. (Punkte mit x, y)
Ich habe z Zonen. (Kreise mit x, y, r)
Jede Zone benötigt n(z) Drohnen.
Ich habe z Gruppen mit s Schwärmen der Größe n(z). (Ein Schwarm ist eine Gruppe von Drohnen)
s ist die Anzahl von allen Schwärme mit Größe n(z).Gesucht ist die Gruppe von Schwärmen die zu allen Zonen können.
Dabei darf eine Drohne nicht in 2 oder mehr Schwärmen vorkommen.
-
Wie groß sind denn die Vektoren?
Du könntest die Daten (V) auch in einem std::set (oder std::map) speichern (Suche ist dann O(log N)).