Un BST équilibré est préférable si vous avez besoin pour protéger votre structure de données à partir des pics de latence et les attaques de collisions de hachage.
L'ancien qui se passe quand une structure soutenue matrice-pousse une obtient redimensionnée, ce dernier est une propriété inévitable de l'algorithme de hachage comme une projection de l'espace infini à une plage de nombre entier limité.
Un autre problème dans .NET est qu'il ya LOH, et avec un dictionnaire suffisamment grand vous exécutez dans une fragmentation de LOH. Dans ce cas, vous pouvez utiliser un BST, payer un prix de classe de complexité algorithmique plus grande.
En bref, avec un BST soutenu par le tas d'allocation que vous obtenez le pire des cas O (log (n)), avec Hashtable vous obtenez O (N) pire moment de cas.
BST vient à un prix de O (log (n)) moyenne, localité pire cache et plus allocations de tas, mais il a des garanties de temps d'attente et est protégée contre les attaques de dictionnaire et la fragmentation de la mémoire.
A noter que la BST est un sujet à la fragmentation de la mémoire sur d'autres plates-formes, ne pas utiliser un éboueur compactage.
En ce qui concerne la taille de la mémoire, la classe .NET Dictionary`2 est plus efficace de la mémoire, car il stocke les données comme une liste chaînée hors tas, qui ne stocke la valeur et l'information de décalage. BST doit stocker en-tête d'objet (comme chaque nœud est une instance de classe sur le tas), deux pointeurs, et quelques données sur les arbres pour les arbres équilibrés augmentée. Par exemple, un arbre rouge-noir aurait besoin d'un booléen interprété comme la couleur (rouge ou noir). Ceci est au moins 6 mots de la machine, si je ne me trompe pas. Ainsi, chaque noeud dans un arbre rouge-noir sur un système 64 bits est au minimum de:
3 mots pour l'en-tête = 24 octets 2 mots pour les pointeurs de l'enfant = 16 octets 1 mot pour la couleur = 8 octets au moins 1 mot pour la bytes = 24 + 16 + 8 + 8 = 56 octets de la valeur (+8 octets si l'arbre utilise un pointeur de nœud parent).
En même temps, la taille minimale de l'entrée du dictionnaire serait seulement 16 octets.