Sie können O(1)
erreichen, wenn Sie N Einträge ein Array und Hash der Schlüssel zu diesem N Werte vorbelegt.
Aber wenn Sie mehr als N Einträge gespeichert haben, gibt es eine Kollision. Für jeden Schlüssel im Array haben Sie also eine Werteliste. Also ist es nicht mehr genau O(1)
. Das Scannen der Liste selbst wird O(m)
sein, wobei m die durchschnittliche Anzahl der Kollisionen ist.
Example with hash = n mod 3
0 --> [0,a] [3,b] ...
1 --> [1,a] [4,b] [7,b] ...
2 --> [2,a] [5,b] ...
Zu einem Zeitpunkt, wird es einig schlecht, dass Sie mehr Zeit durchlaufen die Liste des Wertes für einen möglichen Schlüssel als mit einer anderen Struktur mit O(log n)
Lookup Zeit damit verbringen, wobei n die Gesamtzahl der Einträge ist.
Sie könnten natürlich N so groß, dass das Array/Hash schneller als der B-Baum wäre. Aber das Array hat eine feste vorbelegte Größe. Wenn also N = 1000 ist und Sie 3 Werte speichern, haben Sie 997 Steckplätze im Array verschwendet.
So ist es im Wesentlichen ein Performance-Raum Kompromiss. Für kleine Werte, array
und Hashing ist ausgezeichnet. Für große Werte sind B-Tree
am effizientesten.
Ein Wörterbuch könnte sortiert werden. Es muss einfach nicht sein. –
@Henk: korrigiert, um dies zu verdeutlichen. – Quassnoi
@Henk: Ich denke, Wörterbücher beziehen sich auf Hashtables mit O (1) Zugriff. Ein Dictionary könnte sortiert werden, aber um das zu tun, haben Sie entweder eine lineare Struktur (d. H. O (N) -Abfragen) oder eine Baumstruktur (O (logN)) darunter. –