2011-01-16 14 views
1

Ich habe eine Datenstruktur mit 15 unsigned sehnen, ich habe eine Hash-Funktion mit hash_combine wie folgt definiert:Wie zähle ich Schlüsselkollisionen bei der Verwendung von boost :: unordered_map?

friend std::size_t hash_value(const TUPLE15& given) 
    { 
     std::size_t seed = 0; 

     boost::hash_combine(seed, val1); 
     boost::hash_combine(seed, val2); 
     ... 
     return seed; 
    } 

ich legen Sie eine große Anzahl von Werten in einem boost :: unordered_map aber die Leistung ist nicht gut genug . Wahrscheinlich könnte ich es mit einer alternativen Hashing-Funktion besser machen. Um dies zu bestätigen, muss ich überprüfen, wie viele Kollisionen ich erhalte. Wie mache ich das?

Antwort

1

Wie vergleicht man die Anzahl der Tupel mit der Anzahl der eindeutigen Hash-Werte?

set<size_t> hash_values; 
BOOST_FOREACH(const TUPLE15& tuple, tuples) 
    hash_values.insert(hash_value(tuple)); 
size_t collisions = tuple_map.size() - hash_values.size(); 

oder

size_t collisions = 0; 
for (size_t bucket = 0; bucket != tuples.bucket_count(); ++bucket) 
    if (tuples.bucket_size(bucket) > 1) 
     collisions += tuples.bucket_size(bucket) - 1; 
+0

Ihr zweites Beispiel zählt die Anzahl der Schaufeln enthält, Kollisionen in Bezug auf die tatsächliche Anzahl der Kollisionen im Gegensatz ... ändern Sie ihn auf 'Kollisionen + = tuples.bucket_size (Eimer) -1 ; '? – gospes

+0

@gospes: Du hast Recht, ich habe es jetzt behoben. Vielen Dank. –

Verwandte Themen