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 :

Distance dans un arbre


Sujet :

Algorithmes et structures de données

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Distance dans un arbre
    Bonjour,

    j'aurais besoin d'aide pour ceci.
    Supposons que j'ai l'arbre suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                                               A
                                             /   \
                                            B     D
                                          /  |    |
                                        C   E     E
                                        |    |    |
                                        D   F     G
    Je voudrais savoir comment faire pour avoir les distances minimales depuis un sommet.

    Par exemple, si on souhaite les distances minimales depuis le sommet A, on aurait :
    B,1 D,1 C,2 E,2 E,2 D,3 F,3 G,3
    lorsqu'un sommet apparait plusieurs fois, il faut garder le plus petit .
    Dans l'exemple, entre D,1 et D,3 on garderait D,1 et entre E,2 et E,2 on garderait E,2

    Merci d'avance

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Basiquement il faut faire parcourir récursivement l'arbre , déterminer le nombre de noeuds parcourus pour chaque branche , mémoriser chaque parcours dans une pile et trier cette pile.
    Le parcours le plus petit est le bon

    Jette un coup d'oeil sur l'algo de Djikstra

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par mat.M
    Basiquement il faut faire parcourir récursivement l'arbre , déterminer le nombre de noeuds parcourus pour chaque branche , mémoriser chaque parcours dans une pile et trier cette pile.
    Le parcours le plus petit est le bon

    Jette un coup d'oeil sur l'algo de Djikstra
    L'algo de Djikstra marche sur des arbres ?

  4. #4
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Fusionne les sommets identiques. Tu obtiens un graphe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    a----b----e-----g
    |    |    |
    |    c    |
    |    |    |
    -----d-----
    Calcule les plus courts chemins à partir de a.
    Comme tu as besoin des plus courts chemins en nombre d'arêtes, un parcours en largeur suffit et cela se fait en O(m) où m est le nombre d'arêtes.

  5. #5
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par Premium
    L'algo de Djikstra marche sur des arbres ?
    Bien sûr car un arbre est un graphe... mais c'est enfoncer un clou avec un marteau-pilon car il n'y a qu'un seul chemin entre deux sommets d'un arbre.

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par FrancisSourd
    Fusionne les sommets identiques. Tu obtiens un graphe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    a----b----e-----g
    |    |    |
    |    c    |
    |    |    |
    -----d-----
    Calcule les plus courts chemins à partir de a.
    Comme tu as besoin des plus courts chemins en nombre d'arêtes, un parcours en largeur suffit et cela se fait en O(m) où m est le nombre d'arêtes.
    Salut,
    tu l'obtiens comment la fusion ?
    Le problème, est que j'ai écrit les fonctions de gestion de l'arbre ... je ne peux pas tout changer pour utiliser un graphe.

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par FrancisSourd
    Fusionne les sommets identiques. Tu obtiens un graphe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    a----b----e-----g
    |    |    |
    |    c    |
    |    |    |
    -----d-----
    Calcule les plus courts chemins à partir de a.
    Comme tu as besoin des plus courts chemins en nombre d'arêtes, un parcours en largeur suffit et cela se fait en O(m) où m est le nombre d'arêtes.
    Comment tu fais pour fusionner. Si j'ai
    Je vois mal comment faire une fusion en un graphe qui me trouve a--c comme chemin mais pas a--c--d.

    Une solution est de faire un parcours en largeur sur l'arbre -- autrement Dijsktra sur l'arbre avec un test sur le label plutot que sur le noeud.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Membre confirmé
    Profil pro
    Directeur Scientifique
    Inscrit en
    Avril 2005
    Messages
    419
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur Scientifique

    Informations forums :
    Inscription : Avril 2005
    Messages : 419
    Points : 554
    Points
    554
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Comment tu fais pour fusionner. Si j'ai
    Je vois mal comment faire une fusion en un graphe qui me trouve a--c comme chemin mais pas a--c--d.
    Dans ma compréhension du problème, je pensais effectivement donner la valeur 2 au noeud d (de l'exemple ci-dessus). Mais à la relecture du problème, c'est sans doute plutôt 3 quand je relis le problème. Premium, confirmes-tu?

    Si d doit prendre la valeur 3, il suffit de calculer la profondeur de chaque noeud par un parcours quelconque (largeur, profondeur ou autre...) puis, pour chaque label a,b,c... regarder sa hauteur minimale. Cela se fait en O(n) (n est le nombre de noeuds dans l'arbre).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déplacement d'un élément dans un arbre intervallaire
    Par Larson dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 17/09/2008, 15h57
  2. Déplacer un noeud dans un arbre
    Par BigBenQ dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/10/2005, 15h16
  3. Réponses: 2
    Dernier message: 27/09/2005, 17h26
  4. [XSLT] Mesurer la profondeur d'un element dans un arbre
    Par Floyd dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 25/09/2005, 19h35
  5. trii par odre alphabetique dans un arbre
    Par matt92700 dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 13/01/2005, 22h16

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