Ich habe eine Frage mit hash_map
und map
in C ++. Ich verstehe, dass dies map
in STL ist, aber hash_map
kein Standard ist. Was ist der Unterschied zwischen den beiden?
117
Sie werden auf sehr unterschiedliche Weise implementiert.
hash_map
(unordered_map
in TR1 und Boost; verwenden Sie diese stattdessen) Verwenden Sie eine Hash-Tabelle, in der der Schlüssel in einen Slot in der Tabelle gehasht und der Wert in einer mit diesem Schlüssel verknüpften Liste gespeichert wird.
map
wird als ausgeglichener binärer Suchbaum implementiert (normalerweise ein rot / schwarzer Baum).
A unordered_map
sollte eine etwas bessere Leistung für den Zugriff auf bekannte Elemente der Sammlung bieten, hat jedoch map
zusätzliche nützliche Eigenschaften (z. B. wird es in sortierter Reihenfolge gespeichert, die das Durchlaufen von Anfang bis Ende ermöglicht). unordered_map
wird beim Einfügen und Löschen schneller sein als a map
.
hash_map
war eine häufige Erweiterung, die von vielen Bibliotheksimplementierungen bereitgestellt wurde. Genau aus diesem Grund wurde es umbenannt,unordered_map
als es als Teil von TR1 zum C ++ - Standard hinzugefügt wurde. map wird im Allgemeinen mit einem ausgeglichenen Binärbaum wie einem rot-schwarzen Baum implementiert (Implementierungen variieren natürlich).hash_map
undunordered_map
werden im Allgemeinen mit Hash-Tabellen implementiert. Somit wird die Reihenfolge nicht eingehalten.unordered_map
Einfügen / Löschen / Abfragen ist O (1) (konstante Zeit), wobei Map O (log n) ist, wobei n die Anzahl der Elemente in der Datenstruktur ist. Sounordered_map
geht es schneller, und wenn Sie sich nicht um die Reihenfolge der Artikel kümmern, sollten Sie es vorziehenmap
. Manchmal möchten Sie die Reihenfolge aufrechterhalten (sortiert nach dem Schlüssel) und dafürmap
wäre die Wahl.quelle
Einige der Hauptunterschiede liegen in den Komplexitätsanforderungen.
A
map
benötigtO(log(N))
Zeit für Einfügungen und Suchvorgänge, da es als Rot-Schwarz-Baum- Datenstruktur implementiert ist .A
unordered_map
benötigt eine 'durchschnittliche' ZeitO(1)
für Einfügungen und Fundstücke, darf jedoch eine Worst-Case-Zeit von habenO(N)
. Dies liegt daran, dass es mithilfe der Hash Table- Datenstruktur implementiert wird.Normalerweise ist
unordered_map
es also schneller, aber abhängig von den Tasten und der von Ihnen gespeicherten Hash-Funktion kann es viel schlimmer werden.quelle
Die C ++ - Spezifikation gibt nicht genau an, welchen Algorithmus Sie für die STL-Container verwenden müssen. Es gibt jedoch bestimmte Einschränkungen für ihre Leistung, die die Verwendung von Hash-Tabellen für ausschließen
map
und andere assoziative Container ausschließen. (Sie werden am häufigsten mit rot / schwarzen Bäumen implementiert.) Diese Einschränkungen erfordern für diese Container eine bessere Leistung im ungünstigsten Fall, als Hash-Tabellen liefern können.Viele Leute wollen jedoch wirklich Hash-Tabellen, daher sind Hash-basierte STL-assoziative Container seit Jahren eine häufige Erweiterung. Folglich fügten sie
unordered_map
und so zu späteren Versionen des C ++ - Standards hinzu.quelle
map
im Allgemeinen ein ausgewogener Baum ist, deroperator<()
als Mittel zur Standortbestimmung verwendet wird.map
wird implementiert vonbalanced binary search tree
(normalerweise arb_tree
), da alle Mitglieder inbalanced binary search tree
sortiert sind, so ist map;hash_map
wird von. implementiert,hashtable
da alle Mitglieder inhashtable
unsortiert sind, sodass die Mitglieder inhash_map(unordered_map)
nicht sortiert sind.hash_map
ist keine C ++ - Standardbibliothek, aber jetzt wurde sie inunordered_map
(Sie können sich vorstellen, dass sie umbenannt wurde) umbenannt und wird in C ++ - Standardbibliothek, da C ++ 11 diese Frage sieht. Unterschied zwischen hash_map und unordered_map?für mehr Details.Im Folgenden werde ich eine Kernschnittstelle aus dem Quellcode geben, wie die Karte mit zwei Typen implementiert ist.
Karte:
Der folgende Code soll nur zeigen, dass Map nur ein Wrapper von
balanced binary search tree
ist. Fast alles, was seine Funktion ist, ist nur das Aufrufen derbalanced binary search tree
Funktion.hash_map
::hash_map
wird implementiert,hashtable
dessen Struktur ungefähr so ist:Im folgenden Code werde ich den Hauptteil von geben
hashtable
und dann gebenhash_map
.Wie
map's
nur ein Mitglied istrb_tree
, ist dashash_map's
einzige Mitgliedhashtable
. Es ist der Hauptcode wie folgt:Das folgende Bild zeigt, wenn eine hash_map 53 Buckets hat und einige Werte einfügt, ihre interne Struktur.
Das folgende Bild zeigt einen Unterschied zwischen map und hash_map (unordered_map). Das Bild stammt von Wie wähle ich zwischen map und unordered_map ? ::
quelle
Ich weiß nicht, was es gibt, aber hash_map benötigt mehr als 20 Sekunden, um () 150K vorzeichenlose Ganzzahlschlüssel und Float-Werte zu löschen. Ich laufe nur und lese den Code eines anderen.
So enthält es hash_map.
Ich habe dies hier gelesen https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap
zu sagen, dass clear () die Ordnung von O (N) ist. Das ist für mich sehr seltsam, aber so ist es nun mal.
quelle