Comme d'autres l'ont souligné, vous n'avez pas à re-créer l'ensemble de la structure de données. Vous avez juste à re-créer des pièces qui ont changé de référence et des sous-arbres qui sont restés les mêmes. Grâce à l'immutabilité de la structure de données, vous pouvez réutiliser les sous-arbres, donc la copie de tout ce qui n'est presque jamais nécessaire. En fait, si vous avez besoin de cloner une structure de données mutable rarement, il pourrait avoir beaucoup plus d'impact.
En particulier, pour un ballanced arbres (comme les arbres rouge-noir) cela vous donne:
-
O(log N) le temps d'ajouter/supprimer les éléments de l'ensemble (le même que mutable mise en œuvre)
-
O(log N) de l'espace (nouvelles affectations) lors de l'ajout/suppression d'éléments (mutable aurait O(1))
Cela peut être bien sûr trop de frais généraux pour certaines applications, mais en fait elle n'est pas si mauvais que ça. En outre, l'allocation .NET garbage collector est très rapide (je pense, essentiellement en O(1)), donc ce n'est pas vraiment un problème. Plus d'allocation des moyens que GC a besoin pour fonctionner de plus en plus fréquemment, mais ce n'est pas aussi critique que cela puisse paraître - les ordinateurs ont beaucoup de mémoire de ces jours. L' .NET 4.0, permet en fait, dans de nombreux cas (voir aussi Jon Harrop la réponse ici)