Eine ausgewogene BST ist vorzuziehen, wenn Sie Ihre Datenstruktur aus der Latenz Spikes und Hash-Kollisionen Angriffen schützen müssen.
Das erstere geschieht, wenn ein Array-backed-Struktur wächst eine Größe verändert wird, wobei die letztere ist eine unvermeidliche Eigenschaft des Algorithmus als Projektion von unendlichen Raum bis zu einem begrenzten ganzzahligen Bereich Hashing.
Ein weiteres Problem in .NET ist, dass es LOH, und mit einem ausreichend großen Wörterbuch, das Sie laufen in eine LOH Fragmentierung. In diesem Fall können Sie einen BST verwenden, einen Preis von größerer algorithmischer Komplexität der Klasse.
Kurz gesagt, mit einem BST durch die Zuteilung Haufen gesichert Sie worst case O (log (N)) Zeit mit hashtable Sie O (N) worst case Zeit.
BST kommt zu einem Preis von O (log (N)) durchschnittliche Zeit, schlechter Cache-Lokalität und mehr Heapzuweisungen, aber es Latenz garantiert hat und von Wörterbuch-Attacken und Speicherfragmentierung geschützt.
Bemerkenswert, dass BST ist auch ein Thema auf anderen Plattformen zu Speicherfragmentierung, einen Verdichtungs Garbage Collector nicht verwenden.
Wie für die Speichergröße ist die .NET Dictionary`2 Klasse mehr Speicher effizient, weil es Daten als Off-Heap verknüpften Liste gespeichert, die nur Wert speichert und Informationen gegenüber. BST hat Objekt-Header zu speichern (wie jeder Knoten eine Klasseninstanz auf dem Heap ist), zwei Zeiger, und einige Augmented Baumdaten für ausgeglichene Bäume. Zum Beispiel müßte ein rot-schwarz-Baum einen boolean interpretiert als Farbe (rot oder schwarz). Dies ist zumindest 6 Maschine Worten, wenn ich mich nicht irre. So kann jeder Knoten in einem Rot-Schwarz-Baum auf 64-Bit-System ist ein Minimum von:
3 Worte für die header = 24 Byte 2 Worte für die untergeordneten Zeiger = 16 Bytes 1 Wort für die Farbe = 8 Bytes mindestens 1 Wort für den Wert 8+ Bytes = 16 + 24 + 8 + 8 = 56 Bytes (8 Bytes wenn der Baum verwendet einen übergeordneten Knoten pointer).
Zugleich würde die minimale Größe des Wörterbucheintrag nur 16 Byte sein.