Eine Hashmap ist ein festgelegtes assoziatives Array. Ihr Array von Eingabewerten wird also in Buckets zusammengefasst. In einem offenen Adressierungsschema haben Sie einen Zeiger auf einen Bucket, und jedes Mal, wenn Sie einem Bucket einen neuen Wert hinzufügen, finden Sie heraus, wo im Bucket freie Speicherplätze vorhanden sind. Es gibt verschiedene Möglichkeiten, dies zu tun: Sie beginnen am Anfang des Buckets und erhöhen den Zeiger jedes Mal und testen, ob er belegt ist. Dies wird als lineare Abtastung bezeichnet. Anschließend können Sie eine binäre Suche wie "Hinzufügen" durchführen, bei der Sie die Differenz zwischen dem Anfang des Buckets verdoppeln und bei jeder Suche nach einem freien Speicherplatz nach oben oder unten verdoppeln. Dies wird als quadratische Abtastung bezeichnet. OK. Das Problem bei beiden Methoden besteht nun darin, dass Sie Folgendes tun müssen, wenn der Bucket in die nächste Bucket-Adresse überläuft.
- Verdoppeln Sie jede Bucket-Größe - malloc (N Buckets) / ändern Sie die Hash-Funktion - Erforderliche Zeit: hängt von der malloc-Implementierung ab
- Übertragen / kopieren Sie alle früheren Bucket-Daten in die neuen Bucket-Daten. Dies ist eine O (N) -Operation, bei der N die gesamten Daten darstellt
OK. Aber wenn Sie eine verknüpfte Liste verwenden, sollte es kein solches Problem geben, oder? Ja, in verknüpften Listen haben Sie dieses Problem nicht. Wenn Sie bedenken, dass jeder Bucket mit einer verknüpften Liste beginnt, und wenn Sie 100 Elemente in einem Bucket haben, müssen Sie diese 100 Elemente durchlaufen, um das Ende der verknüpften Liste zu erreichen. Daher dauert es einige Zeit, bis List.add (Element E)
- Hash das Element zu einem Bucket-Normal wie in allen Implementierungen
- Nehmen Sie sich Zeit, um das letzte Element in der Bucket-O (N) -Operation zu finden.
Der Vorteil der Linkedlist-Implementierung besteht darin, dass Sie nicht die Speicherzuweisungsoperation und die O (N) -Übertragung / Kopie aller Buckets benötigen, wie im Fall der Open-Addressing-Implementierung.
Um die O (N) -Operation zu minimieren, konvertieren Sie die Implementierung in die eines binären Suchbaums, in dem Suchoperationen O (log (N)) sind, und fügen Sie das Element basierend auf seinem Wert an seiner Position hinzu. Das zusätzliche Merkmal eines BST ist, dass es sortiert kommt!