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!


  • Mod

    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)).


Anmelden zum Antworten