2009-07-23 11 views
2

Quelle est la mise en œuvre optimale (facile à maintenir, raisonnablement rapide, robuste) de la structure de données arborescente à trois niveaux? Je voudrais utiliser Dictionary ou SortedDictionary, car toutes les valeurs (nœuds) ont des clés uniques.Quelle est la meilleure structure de données pour les données arborescentes de profondeur fixe en C#?

Le premier niveau est censé contenir environ 300 éléments, chacun de ces éléments allant de zéro à dix (à peine plus de 100, habituellement moins de 10) au deuxième niveau et environ dix au troisième niveau. Les niveaux deux et trois sont étroitement liés donc ils devraient être probablement représentés par un seul objet. Toutes les relations sont 1: n

++-L1 
|++-L2 
||+--L3 
||+--...1 to 10 L3 items for each L2 
||+--L3 
|+--L2 
|+--...0 to 100, usually <10 L2 items for each L1 
|+--L2 
+--L1 
+--L1 
+--...about 300 L1 items 
+--L1 

Est-il préférable de créer un dictionnaire dans tous les 1er objet de niveau contenant des objets Level2 (un vrai arbre) ou est-il préférable de mettre tous les objets 2e niveau dans un seul répertoire?

Les objets ne sont pas très gros, ils contiennent seulement quelques chaînes et nombres. L'application est supposée être autonome (ne nécessitant pas de serveur SQL ou autre)

Ou est la représentation d'objet un mauvais choix et je devrais aller pour quelque chose de totalement différent?

+0

Avez-vous prévu de faire des recherches sur l'arbre? –

+0

Pas vraiment une recherche, mais je prévois d'ajouter un peu de filtrage (ce qui est probablement le même du point de vue de la structure de données ... – Lukas

Répondre

3

Pourquoi ne pas simplement créer une classe TreeNode?

class TreeNode 
{ 
    private string _name; 
    private int _someNumber; 
    private int _uniqueId; 
    private List<TreeNode> _childNodes; 

    public string Name{get{return _name;}} 
    public int SomeNumber{get{return _someNumber;}} 
    public int UniqueId{get{return _uniqueId;}} 
    public List<TreeNode> ChildNodes{get{return _childNodes;}} 

    public void TreeNode(string name, int someNumber, int uniqueId) 
    { 
    _name=name; 
    _someNumber=someNumber; 
    _uniqueId = uniqueId; 
    _childNodes = new List<TreeNode>(); 
    } 

    public void AddNode(TreeNode node) 
    { 
    _childNodes.Add(node); 
    } 

    // other code for deleting, searching, etc. 
} 
+0

Les nœuds n'ont pas beaucoup de données communes, mais les classes spécifiques au niveau pourraient hériter de cette vue générale. .. – Lukas

1

En fonction de la dynamique de votre arbre, une option qui peut être relativement simple et très efficace (bien que vous préférerez peut-être très simple et relativement efficace) serait un tableau de tableaux de tableaux (pas un seul tableau 3D). Si le nombre d'enfants de chaque nœud change beaucoup, alors ce serait mauvais ... allouer constamment de nouveaux sous-tableaux. Mais si vous calculez les enfants de chaque nœud une seule fois, et que vous y accédez par la suite, un tableau de tableaux de tableaux peut être très simple, facile, compact et rapide.

Questions connexes