Tatsächlich sind einige der heutigen HashMap implentations in der Tat aus Arrays hergestellt, wie Sie vorschlagen. Lassen Sie mich skizzieren, wie das funktioniert:
Hash-Funktion Eine Hash-Funktion wandelt Ihre Schlüssel in einen Index für das erste Array (Array K) um. Eine Hash-Funktion wie MD5 oder eine einfachere, die normalerweise einen Modulo-Operator enthält, kann dafür verwendet werden.
Buckets Eine einfache Array-basierte Hashmap-Implementierung könnte Buckets verwenden, um Kollisionen zu bewältigen. Jedes Element ("Bucket") in Array K enthält ein Array (Array P) von Paaren. Wenn Sie ein Element hinzufügen oder abfragen, verweist die Hash-Funktion auf den richtigen Bucket in K, der Ihr gewünschtes Array P enthält. Sie durchlaufen dann die Elemente in P, bis Sie einen passenden Schlüssel gefunden haben, oder Sie weisen ein neues Element zu Ende P.
Mapping Schlüssel zum Eimer mit dem Hash Sie sollten sicherstellen, dass die Anzahl der Schaufeln (dh die Größe von K) eine Potenz von 2 ist, lassen Sie uns sagen, 2^b. Um den richtigen Bucket-Index für einen Schlüssel zu finden, berechnen Sie Hash (Schlüssel), behalten aber nur die ersten b Bits. Dies ist Ihr Index, wenn er in eine ganze Zahl umgewandelt wird.
Neuskalierung Rechnen Sie den Hash eines Schlüssels und finden Sie den richtigen Eimer ist sehr schnell. Aber sobald ein Eimer voller wird, müssen Sie mehr und mehr Elemente iterieren, bevor Sie zu dem richtigen kommen. Daher ist es wichtig, genügend Buckets zu haben, um die Objekte richtig zu verteilen, oder Ihre Hashmap wird langsam.
Da Sie im Allgemeinen nicht wissen, wie viele Objekte Sie im Voraus in der Hashmap speichern möchten, ist es wünschenswert, die Karte dynamisch zu vergrößern oder zu verkleinern. Sie können die Anzahl der gespeicherten Objekte zählen und nach dem Überschreiten eines bestimmten Schwellenwerts die gesamte Struktur neu erstellen, diesmal jedoch mit einer größeren oder kleineren Größe für Array K.Auf diese Weise werden einige der Buckets in K, die sehr voll waren, nun ihre Elemente auf mehrere Buckets verteilt, so dass die Performance besser wird.
Alternativen Sie können auch anstelle eines Arrays-of-Arrays, die eine zweidimensionale Matrix verwenden, oder Sie können Array P für eine verkettete Liste austauschen. Anstatt eine Gesamtanzahl gespeicherter Objekte zu behalten, können Sie auch einfach die Hash-Map neu erstellen (d. H. Reskalieren), sobald einer der Buckets mehr als eine konfigurierte Anzahl von Elementen enthält.
Eine Variation von dem, was Sie fragen, wird als 'Array-Hash-Tabelle' in der Hash table Wikipedia entry beschrieben.
Code Für Codebeispiele, werfen Sie einen Blick auf here.
Hoffe, das hilft.
Könnten Sie etwas genauer sein? Was willst du genau erreichen? Zielen Sie auf eine bestimmte Sprache oder nicht? – romaintaz
@romaintaz siehe oben für die Klarstellung – locoboy