Un BST equilibrato è preferibile se è necessario per proteggere la vostra struttura di dati da picchi di latenza e attacchi collisioni hash.
Il primo avviene quando una struttura a matrice garantiti cresce una viene ridimensionata, il secondo è una proprietà inevitabile algoritmo di hashing come proiezione dallo spazio infinito ad una gamma limitata intero.
Un altro problema in .NET è che non c'è LOH, e con un dizionario sufficientemente grande si esegue in una frammentazione LOH. In questo caso è possibile utilizzare un BST, pagando un prezzo di grande classe di complessità algoritmica.
In breve, con un BST sostenuta dal mucchio di assegnazione che si ottiene momento peggiore caso O (log (N)), con tabella hash si ottiene O (N) momento peggiore caso.
BST ha un prezzo di O (log (N)) tempo medio, peggio località cache e più allocazioni di heap, ma ha garanzie di latenza ed è protetto dagli attacchi del dizionario e la frammentazione di memoria.
Da segnalare che la BST è anche un soggetto alla frammentazione della memoria su altre piattaforme, non utilizzando un garbage collector compattazione.
Per quanto riguarda la dimensione della memoria, la classe NET Dictionary`2 è più efficiente della memoria, perché memorizza dati come un elenco collegato off-mucchio, che memorizza solo valore e informazioni di sfasamento. BST deve memorizzare oggetto di intestazione (come ogni nodo è un'istanza di classe sul mucchio), due puntatori, e alcuni dati albero aumentata per gli alberi bilanciati. Ad esempio, un albero rosso-nero avrebbe bisogno di un valore booleano interpretato come colore (rosso o nero). Questo è almeno 6 parole della macchina, se non mi sbaglio. Così, ogni nodo in un albero rosso-nero sul sistema a 64 bit è un minimo di:
3 parole per l'intestazione = 24 byte 2 parole per i puntatori bambino = 16 byte 1 parola per il colore = 8 byte almeno 1 parola per il valore 8+ byte = 24 + 16 + 8 + 8 = 56 byte (+8 byte se l'albero utilizza un puntatore nodo padre).
Allo stesso tempo, la dimensione minima della voce del dizionario sarebbe appena 16 byte.