Wie std :: unordered_map implementiert ist
c++ unordered_map Kollision handling , die Größe und wiederzukäuen
Dies ist eine frühere Frage, geöffnet von mir und ich haben gesehen, dass ich haben eine Menge Verwirrung darüber, wie die unordered_map umgesetzt wird. Ich bin sicher, vielen anderen Menschen teilt, dass die Verwirrung bei mir. Auf der Grundlage der Informationen, die ich wissen, ohne das Lesen der standard:
Jeder unordered_map Implementierung speichert eine Link-Liste zu externen
Knoten in das array der buckets,... Nein, das ist überhaupt nicht die meisten
effiziente Implementierung der hash-Tabelle für die am häufigsten verwendet.
Leider eine kleine "Aufsicht" in der Spezifikation
unordered_map allem aber verlangt dieses Verhalten. Das erforderliche Verhalten ist
dass Iteratoren auf die Elemente müssen bleiben gültig, wenn Sie einfügen oder löschen
andere Elemente
Ich hatte gehofft, dass jemand vielleicht erklären, die Umsetzung und wie es entspricht dem c++ - standard-definition ( in Bezug auf die performance-Anforderungen ) und wenn es wirklich nicht der effizienteste Weg, um die Implementierung einer hash-map-Daten-Struktur, wie Sie verbessert werden kann ?
InformationsquelleAutor der Frage ralzaul | 2015-06-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Standard effektiv Mandate
std::unordered_set
undstd::unordered_map
- Implementierungen, Einsatz von open-hashing, was bedeutet, dass ein array von buckets, die jeweils den Kopf eines logischen (und in der Regel aktuelle) Liste. Diese Anforderung ist subtil: es ist eine Folge des Standard-max-load-Faktor 1.0 und die Garantie, dass die Tabelle nicht aufgewärmt, es sei denn, gewachsen über das load-Faktor: das wäre unpraktisch, ohne die Verkettung, wie die Kollisionen mit geschlossenen hashing überwältigend werden wie die Auslastung der Ansätze 1:(Um eine optimale iteration, ohne den Weg über einen leeren Eimer, der GCC-Implementierung füllt den Eimer mit Iteratoren in einem einzelnen einfach-verkettete Liste, die alle Werte: die Iteratoren zeigen Sie auf das element unmittelbar vor, dass Eimer ' s Elemente, so dass der nächste Zeiger kann es sein, rewired, wenn das löschen der Eimer ist der Letzte Wert.)
Bezug auf den text, den Sie zitieren:
Gibt es keine "Aufsicht"... was getan wurde, war sehr bewusst und mit vollem Bewusstsein. Es stimmt, dass andere Kompromisse haben könnten, getroffen worden, sondern das offene hashing /Verkettung ist ein vernünftiger Kompromiss, für den Allgemeinen Gebrauch, dass kommt einigermaßen elegant mit Kollisionen von mittelmäßigen hash-Funktionen, nicht zu verschwenderisch mit kleinen oder großen Schlüssel/Wert-Typen und verarbeitet beliebig viele
insert
/erase
Paare ohne stufenweise erniedrigender Leistung die Möglichkeit, viele geschlossene hashing-Implementierungen.Als Beweis für das Bewusstsein, von Matthew Austern Vorschlag hier:
Speziell für insert-only-Tabellen mit Daten klein genug, um speichern Sie direkt in den Eimer, eine bequeme sentinel-Wert für nicht verwendete Eimer und eine gute hash-Funktion, eine geschlossene hashing-Ansatz kann etwa eine Größenordnung schneller und mit drastisch weniger Speicher, aber das ist nicht für Allgemeine Zwecke.
Einen vollständigen Vergleich und Ausarbeitung der hash-Tabelle design-Optionen und Ihrer Auswirkungen ist off-topic für S. O. es ist viel zu breit, um die Adresse richtig hier.
InformationsquelleAutor der Antwort Tony Delroy