Es klingt so, als ob alles wahr sein könnte:
- Ihre Schlüssel sind Zeichenfolgen.
- Einfügungen werden einmal durchgeführt.
- Suchvorgänge werden häufig durchgeführt.
- Die Anzahl der Schlüssel-Wert-Paare ist relativ gering (z. B. weniger als ein K oder so).
In diesem Fall können Sie eine sortierte Liste über eine dieser anderen Strukturen ziehen. Dies würde beim Einfügen schlechter abschneiden als die anderen, da eine sortierte Liste beim Einfügen O (N) gegenüber O (1) für eine verknüpfte Liste oder Hash-Tabelle und O (Protokoll 2) istN) für einen ausgeglichenen Binärbaum. Die Suche in einer sortierten Liste ist jedoch möglicherweise schneller als jede dieser anderen Strukturen (ich werde dies kurz erläutern), sodass Sie möglicherweise die Nase vorn haben. Wenn Sie alle Einfügungen auf einmal ausführen (oder anderweitig keine Suche benötigen, bis alle Einfügungen abgeschlossen sind), können Sie die Einfügungen in O (1) vereinfachen und am Ende eine viel schnellere Sortierung durchführen. Darüber hinaus benötigt eine sortierte Liste weniger Speicher als jede dieser anderen Strukturen. Dies ist jedoch wahrscheinlich nur dann von Bedeutung, wenn Sie viele kleine Listen haben. Wenn Sie eine oder mehrere große Listen haben, übertrifft eine Hash-Tabelle wahrscheinlich eine sortierte Liste.
Warum können Suchvorgänge mit einer sortierten Liste schneller sein? Nun, es ist klar, dass es schneller ist als eine verknüpfte Liste, mit der O (N) -Suchzeit der letzteren. Bei einem Binärbaum bleiben Suchvorgänge nur dann O (log 2 N), wenn der Baum perfekt ausgeglichen bleibt. Wenn Sie den Baum im Gleichgewicht halten (z. B. rot-schwarz), erhöhen Sie die Komplexität und die Einfügezeit. Darüber hinaus ist jedes Element sowohl mit verknüpften Listen als auch mit Binärbäumen ein separat zugewiesener 1- Knoten. Dies bedeutet, dass Sie Zeiger dereferenzieren und wahrscheinlich zu potenziell stark variierenden Speicheradressen springen müssen, was die Wahrscheinlichkeit eines Cache-Fehlers erhöht.
Wie für Hash - Tabellen, sollten Sie vielleicht lesen ein paar von anderen Fragen hier auf Stackoverflow, aber die wichtigsten Sehenswürdigkeiten befinden sich hier:
- Eine Hash-Tabelle kann im schlimmsten Fall zu O (N) degenerieren.
- Die Kosten für das Hashing sind ungleich Null und können in einigen Implementierungen erheblich sein, insbesondere bei Zeichenfolgen.
- Wie in verknüpften Listen und Binärbäumen ist jeder Eintrag ein Knoten, der mehr als nur Schlüssel und Wert speichert und in einigen Implementierungen auch separat zugewiesen wird, sodass Sie mehr Speicher verwenden und die Wahrscheinlichkeit eines Cache-Fehlers erhöhen.
Wenn Sie sich wirklich für die Leistung einer dieser Datenstrukturen interessieren, sollten Sie sie natürlich testen. Sie sollten kein Problem damit haben, gute Implementierungen für die meisten gängigen Sprachen zu finden. Es sollte nicht zu schwierig sein, einige Ihrer realen Daten auf jede dieser Datenstrukturen zu werfen und zu sehen, welche am besten funktioniert.
- Es ist möglich, dass eine Implementierung ein Array von Knoten vorab zuweist, was bei dem Cache-Miss-Problem helfen würde. Ich habe dies in keiner wirklichen Implementierung von verknüpften Listen oder Binärbäumen gesehen (natürlich nicht, dass ich jeden gesehen habe), obwohl Sie sicherlich Ihre eigenen rollen könnten. Sie hätten jedoch immer noch eine etwas höhere Wahrscheinlichkeit eines Cache-Fehlers, da die Knotenobjekte notwendigerweise größer als die Schlüssel / Wert-Paare wären.