IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Recherche dans un n-ary tree


Sujet :

Algorithmes et structures de données

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut Recherche dans un n-ary tree
    Bonjour

    En C#, j'ai implémenté un n-ary tree. L'idée derrière est d'utiliser cette structure pour un inventaire.
    Voici sa représentation:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    using System;
    using System.Collections.Generic;
     
    namespace db.Collections
    {
        [Serializable]
        public abstract class ATree<ANode>
        {
            protected ATree()
            {
                Nodes = new List<ANode>();
            }
            protected ATree(ANode root):this(){
                Root = root;
            }
            public ANode Root{get;protected set;}
            public ICollection<ANode>Nodes{get;}
        }
    }
    Un noeud est définit tel que:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    using System;
    using System.Collections.Generic;
    using System.Linq;
     
    namespace db.Collections
    {
        [Serializable]
        public abstract class ANode
        {
            protected ANode() => Children = new LinkedList<ANode>();
            protected ANode(object id) : this() => Id = id;
            public object Id{get;set;}
            public ICollection<ANode>Children{get; protected set;}
            public ANode Parent{get; protected set;}
            public void AddChild(ANode node) 
            {
                Children.Add(node);
                node.Parent = this;
            }
            public abstract ANode FindNode(object toFind, ANode node);
            public abstract bool IsSameId(object id);
            /// <summary>
            /// Find all parents of current ANode.
            /// </summary>
            /// <return>IEnumerable<ANode> as all list of parents from origin to current ANode</return>
            public IEnumerable<ANode>GetNodePath(){
                ICollection<ANode>parents = new List<ANode>();
                ANode current = this;
                while(current.Parent!=null){
                    parents.Add(current.Parent);
                    current = current.Parent;
                }
                return parents.Reverse();
            }
        }
    }
    Mon problème est que je ne suis pas satisfait de ma méthode de recherche d'un noeud:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    using System;
    using System.Linq;
    using System.Threading.Tasks;
     
    namespace db.Collections
    {
        [Serializable]
        public class Node : ANode
        {
            public Node(object id):base(id){}
     
            public override ANode FindNode(object toFind, ANode node)
            {
                if(node!=null)
                    return node;
                if(IsSameId(toFind))
                    return this;
                return !Children.Any() ? null : Children.Select(child => child.FindNode(toFind, null)).FirstOrDefault(found => found != null);
            }
     
            public override bool IsSameId(object id)
            {
                return Id!=null&&id!=null && string.Compare(Id.ToString(), id.ToString(), StringComparison.Ordinal) == 0;
            }
        }
    }
    Je ne vois pas quelle(s) optimisation(s) je pourrais apporter. A moins que vous ayez d'autres idées?
    Merci d'avance,

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Je vais peut-être dire de grosses bétises, mais ce n'est pas grave.
    Dans mon esprit, un tree , c'est un arbre, et quand on alimente un arbre, dans la version de base,on se débrouille pour que chaque branche se décompose en 2 sous-branches , la droite et la gauche. Et on sait parfaitement ce qu'on met dans la sous-branche de droite et dans la sous-branche de gauche. Si par malchance, la moitié des branches sont vides, tant pis.

    Si par principe, chaque parent a un seul enfant ... ce n'est plus un arbre, mais ça ressemble plutôt à une chaîne.
    Et même dans ce cas, si on a des maillons les uns derrière les autres, si l'ordre des maillons a un sens, on doit pouvoir utiliser ça pour aller vite ; par contre (c'est ta configuration ?) si l'ordre des maillons est aléatoire, on ne peut que lire séquentiellement tous les maillons pour trouver le maillon cherché.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

Discussions similaires

  1. Recherche dans une tree
    Par adam57 dans le forum Forms
    Réponses: 1
    Dernier message: 25/04/2008, 12h52
  2. recherche dans un projet
    Par FreshVic dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 26/04/2004, 20h04
  3. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57
  4. [BPW]Problème de recherche dans une boîte liste
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 14
    Dernier message: 05/07/2003, 15h10
  5. recherche dans un document xml via DOM
    Par ndoye_zaff dans le forum APIs
    Réponses: 5
    Dernier message: 11/06/2003, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo