web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de classe Tree <T> dans .NET?

La bibliothèque de classes de base dans .NET possède d'excellentes structures de données pour les collections (liste, file d'attente, pile, dictionnaire), mais curieusement, elle ne contient aucune structure de données pour les arbres binaires. Il s'agit d'une structure terriblement utile pour certains algorithmes, tels que ceux qui tirent parti de différents chemins de traversée. Je recherche une implémentation correctement écrite et gratuite.

Suis-je simplement aveugle et ne le trouve pas ... est-il enterré quelque part dans la BCL? Sinon, quelqu'un peut-il recommander une bibliothèque C # /. NET gratuite ou open-source pour les arbres binaires? De préférence celui qui utilise des génériques.

EDIT: Pour clarifier ce que je recherche. Je ne suis pas intéressé par les collections de dictionnaire ordonnées qui utilisent en interne un arbre. Je suis en fait intéressé par un arbre binaire - celui qui expose sa structure afin que vous puissiez faire des choses comme extraire des sous-arbres, ou effectuer une traversée post-fix sur les nœuds. Idéalement, une telle classe pourrait être étendue pour fournir les comportements d'arbres spécialisés (c.-à-d. Rouge/noir, AVL, équilibré, etc.).

82
LBushkin

Vous avez raison, il n'y a rien dans la BCL. Je soupçonne que cela est dû au fait que le choix d'utiliser ou non une arborescence est généralement un détail d'implémentation et est par ailleurs un moyen non conventionnel d'accéder aux données. Autrement dit, vous ne dites pas, "élément de recherche binaire # 37"; au lieu de cela, vous dites "récupérez-moi l'élément # 37".

Mais avez-vous jeté un coup d'œil à C5 ? C'est super pratique et ils ont plusieurs implémentations d'arborescence ( 1 , 2 , ).

29
John Feminella

Vous pouvez définir le vôtre:

public class MyTree<K, V> : Dictionary<K, MyTree<K, V>>
{
    public V Value { get; set; }
}

Ou sans clé:

public class MyTree<V> : HashSet<MyTree<V>>
{
    public V Value { get; set; }
}
67
Jason

Que souhaiteriez-vous d'une telle implémentation?

Arbre binaire? Rouge noir? Arbre Radix? B-arbre? R-tree? R * -arbre?

Un arbre est plus un modèle qu'une structure de données, et ils ont tendance à être utilisés là où les performances sont importantes (donc les détails d'implémentation comptent probablement aussi). Si la BCL incluait une sorte de classe d'arbre, vous n'auriez qu'à lancer la vôtre de toute façon

37
Alun Harford

Je crois que SortedDictionary comme insert de log (n), caractéristiques de récupération que vous attendez d'une structure de données d'arbre.

http://msdn.Microsoft.com/en-us/library/f7fta44c (VS.80) .aspx

14
Sean

SortedSet<T> est implémenté comme un arbre de recherche binaireref. SortedDictionary<TKey, TValue> utilise en interne SortedSet<T> donc c'est aussi un arbre de recherche binaire ref.

12
Matt Brunell

Non, il n'y a pas de "Tree<T>- comme "tapez dans la BCL (quelque chose qui m'a toujours aussi laissé perplexe) mais voici un bon article qui vous guidera dans l'implémentation de la vôtre en C #.

Je suppose que vous pourriez faire valoir que les structures de données arborescentes sont moins couramment utilisées dans le type d'applications pour lesquelles .NET est généralement utilisé (applications professionnelles, applications de déplacement de données, etc.). Pourtant, je suis d'accord avec vous, il est étrange que la BCL n'ait aucune implémentation du tout.

8
Andrew Hare

Cette série d'articles m'a été utile lorsque j'ai dû écrire le mien, en particulier les parties 3 et 4.

n examen approfondi des structures de données

1
Gulzar Nazim