Wie teuer ist der Vergleich zweier ungeordneter Mengen für die Gleichheit?

8

Gegeben zwei std::set s, kann man einfach beide Sätze gleichzeitig durchlaufen und die Elemente vergleichen, was zu linearer Komplexität führt. Dies funktioniert nicht für std::unordered_set s, da die Elemente in beliebiger Reihenfolge gespeichert werden können. Wie teuer ist a == b für std::unordered_set ?

    
fredoverflow 12.04.2012, 06:33
quelle

2 Antworten

3

Komplexität von operator== und operator!= :

Lineare Komplexität im Durchschnitt. N 2 im schlimmsten Fall, wobei N die Größe des Behälters ist.

Weitere Details im Standard §23.2.5, Punkt 11:

Für unordered_set und unordered_map die Komplexität von operator== (d. h. die Anzahl der Aufrufe des == -Operators von value_type an das Prädikat von key_equal() , und der von hash_function() zurückgegebene Hasher ist im Mittelfall proportional zu N und im ungünstigsten Fall zu N <2>, wobei N ist a.size() .

    
Anonymous 12.04.2012, 06:41
quelle
9

Der schlimmste Fall ist O (n²).

Aber ungeordnete Mengen werden tatsächlich durch Hash angeordnet. So ist es möglich, die Hashes zu vergleichen (wenn dies nicht gelingt, können die Mengen nicht gleich sein) und dann zu überprüfen, dass dieselben Hashwerte (linear) gleiche Werte (O (n²) für verschiedene Werte mit demselben Hash) haben.

Im besten Fall ist das O (n).

Normalerweise tendiert die Komplexität zu O (n), wenn die Hash-Funktion "gut" ist (verschiedene Objekte - & gt; immer anderer Hash) und zu O (n²), wenn die Hash-Funktion "schlecht" ist (alles hat immer die gleiche) Hash-Wert)

    
Emilio Garavaglia 12.04.2012 06:43
quelle