Es wird oft gesagt, dass die Hash-Tabellensuche in konstanter Zeit abläuft: Sie berechnen den Hash-Wert, der Ihnen einen Index für eine Array-Suche gibt. Dabei werden Kollisionen ignoriert. im schlimmsten Fall landet jedes Objekt im selben Bucket und die Suchzeit wird linear ( ).
Gibt es Bedingungen für die Daten, die dazu führen können, dass die Hash-Tabellensuche wirklich ? Ist das nur im Durchschnitt, oder kann eine Hash-Tabelle Worst-Case-Lookup haben?O ( 1 )
Anmerkung: Ich komme hier aus der Perspektive eines Programmierers. Wenn ich Daten in einer Hash-Tabelle speichere, handelt es sich fast immer um Zeichenfolgen oder einige zusammengesetzte Datenstrukturen, und die Daten ändern sich während der Lebensdauer der Hash-Tabelle. Ich schätze zwar Antworten über perfekte Hashes, aber sie sind niedlich, aber anekdotisch und aus meiner Sicht nicht praktisch.
PS Follow-up: Für welche Art von Daten sind Hash-Tabellen-Operationen O (1)?
Antworten:
Es gibt zwei Einstellungen, unter denen Sie Worst-Case-Zeiten erhalten können.O(1)
Wenn Ihr Setup statisch ist, erhalten Sie durch FKS-Hashing die Worst-Case- -Garantien. Aber wie Sie angegeben haben, ist Ihre Einstellung nicht statisch.O(1)
Wenn Sie Cuckoo-Hashing verwenden, sind Abfragen und Löschvorgänge im schlimmsten Fall , aber das Einfügen wird nur mit erwartet. Kuckuck-Hashing funktioniert ganz gut, wenn Sie eine Obergrenze für die Gesamtzahl der Einfügungen haben und die Tabellengröße auf ungefähr 25% größer einstellen.O ( 1 )O(1) O(1)
Es stehen weitere Informationen hier .
quelle
Diese Antwort fasst Teile von TAoCP Vol. 3, Kapitel 6.4 zusammen.
Angenommen, wir haben eine Menge von Werten , von denen wir n in einem Array A der Größe m speichern wollen . Wir verwenden eine Hash-Funktion h : V → [ 0 .. M ) ; typischerweise ist M ≪ | V | . Wir nennen α = nV n A m h:V→[0..M) M≪|V| denBelastungsfaktorvonA. Hier nehmen wir das natürlichem=M an; in praktischen Szenarien haben wirm«M, aber, und bis hinunter zur Karte hatmihnen.α=nm A m=M m≪M m
Verkettung
Lineare Abtastung
Double Hashing
Beachten Sie, dass das Entfernen von Elementen aus und das Erweitern von Tabellen für die jeweiligen Methoden unterschiedliche Schwierigkeitsgrade aufweist.
Hashtable
quelle
quelle
quelle