Macht es Sinn, std::unordered_map<int, int> anstelle von std::map<int, int>?
Sollte std::unordered_map<int, int>
schneller als std::map`? Ich kümmern sich nicht darum, nur schnelle suchen, so dass ich dachte, ich sollte die Verwendung einer hashtable. Aber dann dachte ich, es werde versuchen, zusätzlich hash-mein Schlüssel oder so (die ich nicht brauchen)?
Und eine Verwandte Frage: ich brauche, um ein int
Wert von int
- Taste. Sollte ich unordered_map<int, int>
oder unordered_set<pair<int, int> >
(in dem Fall würde ich benötigen, um zu implementieren hash-Funktion für mein paar richtig)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Unterschied zwischen einem
map<T,K>
und einunordered_map<T,K>
ist, dass die erste Implementierung basiert auf einem Baum, während die zweite beruht auf einer hashmap.Dies bedeutet, dass die Komplexität für grundlegende Operationen (get und set) sind logarithmisch für eine
map
und Konstanten für einunordered_map
.Gibt es noch andere Aspekte in jedem Fall: ein
unordered_map
müssen möglicherweise eine Neuauflage, wenn seine Auslastung erreicht wird (und dies benötigt Zeit und kann unberechenbar sein), während ein normalermap
sich nicht um solche Probleme. Neben derunordered_map
konnte die Umsetzung verwenden Sie getrennte Verkettung mit den Eimern so, wenn es passiert, zu viele Kollisionen, Komplexität wird konstant+linear für den Abruf der Schlüssel.Ich würde vorschlagen, Sie einen benchmark für beide Strukturen mit einigen Daten, die mit einem Muster ähnlich wie die, die Sie brauchen, damit Ihre Wahl.
Brauchen Sie nicht zu definieren, Ihre eigenen
hash<int>
für dieunordered_map
wie es bereits umgesetzt.2<<(sizeof(int)*8)
so dass jeder int-Wert zugeordnet werden kann, die zu seiner eigenen Zelle, aber in diesem Fall eineint[2<<(sizeof(int)*8]
array würde reichen. Und die Probleme, um die Zwischenspeicherung der Daten, nicht die Daten-Struktur perfomance mehr.unordered_map
. Sicher sein, zu verstehen, Fallstricke und Vorsichtsmaßnahmen, bevor Sie dies tun, jedoch.