Wenn Sie damit durchkommen können, sollten Sie immer einen Hash über einen binären Suchbaum bevorzugen. Hashes hat einen höheren Speicheraufwand als Bäume, aber der gesamte von ihnen verwendete Speicher kann in einem großen Block zugewiesen werden. Für Bäume erfordert jeder hinzugefügte Knoten eine separate Zuweisung, die eine hohe Fragmentierung verursacht und für die Leistung schlecht ist. Ähnlich wie Sie lieber 1000 Bytes aus 1 Datei als 1 Byte aus 1000 verschiedenen Dateien lesen würden.
Der Fall, in dem Hashes nicht funktioniert, ist bei der Bestellung von Angelegenheiten. Angenommen, Sie schreiben einen Speicherzuordner und Sie speichern freie Speicherblöcke in einer Datenstruktur. Schlüssel sind die Größen der Blöcke und die Werte sind die Zeiger auf sie.
Eine Anforderung für Speicher umfasst, durch diese Datenstruktur zu suchen und den kleinsten Block zu finden, der die Anforderung erfüllt. Wenn Sie beispielsweise Blöcke mit den Schlüsseln 10, 20, 30 haben und eine Anforderung für 20 Byte Speicher eingeht, wählen Sie den zweiten Block aus. Ein hashmap kann das leicht tun.
Aber was ist, wenn die Anfrage für 22 Bytes ist? Da es keinen Schlüssel mit dem Wert 20 gibt, müssen Sie die ganze Hashmap iterieren, um den richtigen Schlüssel (30) zu finden, der eine O (n) -Operation ist. Wenn Sie jedoch einen Baum verwendet haben, dann ist "O der kleinste Schlüssel, der größer als ein bestimmter Schlüssel ist" eine Operation O (log n).
möglich Duplikat von [Binärbäume vs verknüpfte Listen vs Hash-Tabellen] (http://StackOverflow.com/Questions/371136/Binary-Trees-VS-linked-Lists-VS-hash-Tables) –