Was ist schneller, um ein Objekt in einer Hashtabelle oder in einer sortierten Liste zu finden?
Schneller ein Element zu finden, in einer hashtable oder in einer sortierten Liste?
InformationsquelleAutor der Frage Dhana | 2009-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Algorithmus Komplexität ist eine gute Sache zu wissen, und hashtables sind bekannt 0(1) während einer sortierten Vektor (in deinem Fall Schätze ich, dass es besser ist, ein sortiertes array als eine Liste) 0(log n) Zugriffszeit.
Aber Sie sollten wissen, dass die Komplexität der notation gibt Ihnen die Zugriffszeit für N gehen unendlich. Das bedeutet, dass, wenn Sie wissen, dass Ihre Daten wird weiter wachsen,Komplexität der notation gibt Sie einen Hinweis auf den Algorithmus zu wählen.
Wenn Sie wissen, dass Ihre Daten behalten eine eher geringe Länge beispielsweise mit nur ein paar Einträge in deinem array/Hash-Tabelle, müssen Sie gehen mit Ihrem beobachten und zu Messen. Haben Sie So einen test.
Beispielsweise in ein anderes problem: Sortieren von Arrays. Für ein paar Einträge bubble-sort, während O(N^2) kann schneller sein als .. der schnellen Sorte, es ist zwar (n log n) ..
Auch, entsprechend auf andere Antworten, und je nach Ihrem Element, Sie müssen versuchen zu finden die beste hash-Funktion für Ihre hashtable-Instanz. Sonst kann es führen zu dramatisch schlechte performance für die Suche in Ihrem Hash-Tabelle (wie schon in Hank ' Gay ' s Antwort).
Edit: Haben einen Blick auf diese Artikel zu verstehen,die Bedeutung von Big O notation .
InformationsquelleAutor der Antwort yves Baumes
Unter der Annahme, dass durch 'sortierte Liste' du meinst 'random-zugänglich, sortiert-Kollektion". Eine Liste hat die Eigenschaft, dass Sie nur durchqueren es mit den Elementen, die in einer O(N) Komplexität.
Den schnellsten Weg zu finden, ein element in einer sortierten Wendeschneidplatten Sammlung ist durch N-fache Suche, O(logN), während eine Hash-Tabelle ohne Stößen hat eine finden, die Komplexität von O(1).
InformationsquelleAutor der Antwort xtofl
Wenn der hashing-Algorithmus ist extrem langsam (und/oder schlecht), wird die Hashtabelle schneller sein wird.
UPDATE: Als Kommentatoren haben darauf hingewiesen, Sie konnte auch immer schlechter Leistung aus zu vielen Kollisionen nicht, weil dein hash-Algorithmus ist schlecht, sondern einfach, weil die hashtable nicht groß genug ist. Die meisten Bibliothek-Implementierungen (zumindest in high-level-Sprachen) wird automatisch vergrößert, Ihre hashtable-hinter den kulissen—die Ursache langsamer als erwartet Leistung auf die Einlage löst das Wachstum—aber wenn Sie Ihre eigenen Rollen, es ist definitiv etwas zu prüfen.
InformationsquelleAutor der Antwort Hank Gay
Den
get
Betrieb in einerSortedList
istO(log n)
während der gleichen operation e eine HashTable istO(1)
. So, normalerweisedieHashTable
wäre viel schneller. Aber dies hängt von einer Reihe von Faktoren:InformationsquelleAutor der Antwort bruno conde
Es kommt ganz auf den Umfang der Daten, die Sie gespeichert haben.
Vorausgesetzt, Sie haben genug Speicher um sich werfen (also die hash-Tabelle groß genug), die hash-Tabelle suchen Sie die target-Daten in einen festen Betrag der Zeit, aber die Notwendigkeit, um den hash zu berechnen fügen Sie einige (auch fixe) Gemeinkosten.
Suche in einer sortierten Liste nicht haben, dass hashing Aufwand, aber die Zeit benötigt, um die Arbeit zu tun, tatsächlich Auffinden der target-Daten erhöhen sich die Liste wächst.
So, im Allgemeinen, eine sortierte Liste wird in der Regel schneller für kleine Datenmengen. (Für sehr kleine Datenmengen, die Häufig geändert und/oder selten gesucht, ein unsortierte Liste kann sogar noch schneller, da es vermeidet den overhead, tun die Sortierung.) Da die Datenmenge immer größer wird, das Wachstum von der Liste der such-Zeit überschattet die fixen Gemeinkosten der Vermischung, und die hash-Tabelle wird schneller.
Wo dieser Haltepunkt ist, wird variieren, je nach Ihren spezifischen hash-Tabelle und sortiert-Liste-such-Implementierungen. Tests und benchmark-performance über eine Reihe von typisch-großen Daten-sets zu sehen, welche eigentlich besser in Ihrem Fall zu. (Oder, wenn der code läuft schon "schnell genug" ist, nicht. Nur je nachdem, was Sie noch komfortabler mit und Mach dir keine sorgen über das optimieren von etwas, was nicht noch optimiert werden müssen.)
InformationsquelleAutor der Antwort Dave Sherohman
In einigen Fällen, es hängt von der Größe der Sammlung (und zu einem geringeren Grad, die Umsetzung details). Wenn Ihre Liste ist sehr klein, 5-10 Gegenstände, vielleicht, ich denke, die Liste wäre schneller. Ansonsten xtofl hat er Recht.
InformationsquelleAutor der Antwort Jan
HashTable wäre effizienter für die Liste, die mehr als 10 Artikel. Hat die Liste weniger als 10 Artikel, der overhead durch das hashing algo wird mehr sein.
In Fall müssen Sie ein schnell Wörterbuch, sondern auch brauchen, um die Elemente in geordneter Art und Weise verwenden, die OrderedDictionary. (.Net 2.0 aufwärts)
InformationsquelleAutor der Antwort Rashmi Pandit