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

C++ Discussion :

Comment incrémenter une valeur contenue dans tous les pères d'un nœud d'un arbre en temps constant ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 31
    Par défaut Comment incrémenter une valeur contenue dans tous les pères d'un nœud d'un arbre en temps constant ?
    Bonjour à tous.

    Je suis en train de développer en C++ un algorithme qui crée un arbre en temps linéaire (du nombre de feuilles).

    Chaque nœud de cet arbre contient actuellement un compteur qui doit être incrémenté à chaque fois qu'une opération sur l'un des fils dudit nœud est réalisée. Pour faire cette mise à jour, j'ai actuellement besoin de remonter tous les pères du nœud manipulé jusqu'à la racine pour incrémenter leurs compteurs. Le problème est que cette opération casse la complexité de mon algorithme et la transforme en O(n²) au lieu de O(n).

    Je cherche donc une solution raisonnable qui me permette, à chaque fois que je manipule un nœud, de changer en mémoire une seule valeur sur laquelle "pointent" tous les pères (et seulement eux, pas les fils) du nœud manipulé, de manière à ce que le fait de modifier cette valeur soit équivalent à incrémenter tous leurs compteurs d'un coup.

    D'après vous existe-il une telle solution svp ?

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Salut,

    un pointeur du/des compteur(s) du/des père(s) chez les enfants ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    le problème, c'est que chaque père peut avoir plusieurs fils (puisque c'est un arbre)
    avoir un lien vers le pere peut servir, mais pas sur les compteurs de chaque pere.

    D'ailleurs, il devrait probablement y avoir une fonction qui augmente le lien du noeud courant, et s'appelle récursivement sur le père.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void inc() {
        ++compteur;
        pere->inc();
    }
    De toute facon, tu veux modifier tous les compteurs, il n'y a pas le choix, c'est N²
    Par contre, tu peux aussi ne pas modifier les pères, et au choix ne mettre à jour qu'après ou additionner les compteurs personnels.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Normalement si c'est bien fait, ce sera plutôt du N⋅log(N) que du N²...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 31
    Par défaut
    Je ne sais pas exactement... En fait, le compteur compte pour chaque père le nombre de toutes les feuilles qui en sont issues (sachant qu'une fois une feuille créée on n'y touche plus), du coup pour l'instant je suis allé au plus simple et à chaque fois que je crée une feuille je parcours tous ses pères jusqu'à la racine et incrémente leurs compteurs un par un.

    Au début j'avais essayé de gérer les compteurs en additionnant les compteurs personnels comme préconise leternel, ça marche très bien dans mon algo naïf mais là j'implémente une adaptation de l'algorithme d'Ukkonen et ça marche beaucoup moins bien car l'algorithme "saute" d'une branche à l'autre quand il ajoute un nouveau nœud et peut ajouter ce nœud à n'importe quel niveau de la branche.

    Merci pour vos réponses.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Est-ce que ton programme procède en deux temps: création des feuilles, puis utilisation du nombre de feuilles?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 31
    Par défaut
    Du coup c'est pour ça que ça aurait été super bien d'avoir dans chaque fils quelque chose qui "pointe" sur tous ses pères à la fois, je l'aurais incrémenté à chaque création de feuille et ça aurait magiquement incrémenté d'un seul coup la bonne valeur pour tous ses pères

Discussions similaires

  1. Réponses: 10
    Dernier message: 05/02/2008, 14h37
  2. Réponses: 3
    Dernier message: 22/11/2007, 17h02
  3. Réponses: 6
    Dernier message: 31/08/2007, 00h15
  4. Réponses: 4
    Dernier message: 29/03/2006, 08h22
  5. Comment afficher une valeur contenue dans une variable ?
    Par manubrard dans le forum Langage
    Réponses: 5
    Dernier message: 20/02/2006, 15h56

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