2014-03-28 7 views
5

set_difference Der Algorithmus erfordert die folgendenPerforming set_difference auf ungeordnete Sätze

Die Elemente in den Bereichen sind bereits nach dem gleichen Kriterium geordnet werden

die für Hash-Tabellen nicht der Fall ist.

Ich denke, eine Menge Differenz AB in Bezug auf die std::remove_copy der Implementierung, wo die Entfernung Kriterium

Gibt es eine Standard-valid-am schnellsten sichersten die Existenz eines Elements A in der Gruppe B sein würde Weg, es zu tun?

+3

Vielleicht ist es schneller (ich bin sicher, es ist sicherer), temporäre std :: set Objekte zu verwenden und die Hash-Tabelle Daten in die std :: set Objekte einzufügen. Rufen Sie dann set_difference() auf und geben Sie die Ergebnisse in die Hash-Tabelle zurück. Ich bin ein Befürworter dafür, dass die Dinge zuerst funktionieren und dann, wenn nötig, optimiert werden. – PaulMcKenzie

+1

Nun, wenn Sie wirklich eine temporäre Kopie erstellen möchten, verwenden Sie std :: vector und std :: sort, nicht std :: set. Es wird (viel!) Schneller und speicherfreundlicher sein. – ltjax

Antwort

4

Wenn Sie zwei Hash-Tabellen haben, sollte der effizienteste Weg sein, über einen von ihnen zu iterieren und jedes Element in der anderen Hash-Tabelle nachzuschlagen. Dann fügen Sie diejenigen, die Sie nicht finden, in einen dritten Behälter ein. Eine grobe Skizze könnte wie folgt aussehen:

std::vector<int> result; 
std::copy_if(lhs.begin(), lhs.end(), std::back_inserter(result), 
    [&rhs] (int needle) { return rhs.find(needle) == rhs.end(); }); 
+0

Ich bevorzuge rhs.count (Nadel) == 0; Mein Hauptkritikpunkt Ihrer Antwort ist jedoch, dass Sie Ihren Algorithmus nur mit Code angegeben haben, aber nicht angegeben haben, warum Sie denken, dass dies die schnellste verfügbare Methode ist. – CashCow

1

Wenn Sie 2 ungeordnete Mengen A und B die Länge Na und Nb haben und Sie eine Set-Differenz zu tun, das heißt, alle Elemente von A nicht in B erhalten, dann Da das Nachschlagen in B eine konstante Zeit ist, ist Ihre Komplexität, einfach über A zu iterieren und zu prüfen, ob es in B ist, O (Na).

Wenn A eine ungeordnete Menge und B ist eine Gruppe (oder sortiert Vektor usw.), dann würde jedes lookup log (Nb), so dass die volle Komplexität würde O (Na * log (Nb))

be Sorting Ein erster würde es machen (Na * log (Na)), dann Na + Nb zu sortieren, um die Zusammenführung durchzuführen. Wenn Na signifikant kleiner als Nb ist, ist Na * log (Nb) sowieso deutlich kleiner als Na + Nb und wenn Na zu Nb größer wird, dann wird es nicht schneller sein.

Deshalb denke ich, dass Sie nichts gewinnen, indem Sie A zuerst sortieren (indem Sie es zuerst sortieren, ich meine es in eine sortierte Sammlung zu verschieben).