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 :

Algo sur les ABR


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Algo sur les ABR
    Bonsoir,

    Alors voila un petit moment que j'essaie de trouver deux algorithmes sur les ABR, l'un qui dit si un ABR est contenu dans un autre (tout les éléments de A sont contenus dans B, A et B étant deux ABR) et le second qui dit si un ABR est de domaine plus petit qu'un autre (le plus petit élément de A est supérieur ou égal au plus petit élément de B et le plus grand élément de A est inférieur ou égal au plus grand élément de B). Les algos que j'ai fais ne marchent apparemment pas.
    Le premier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Contenu (A: arbre, B: arbre):booleen
    val:Entier
    début
           si vide?(A) ET vide?(B) alors
                 renvoyer vrai
           val <- A.noeud
           sinon si non(app?(val, B)) alors
                 renvoyer faux
           fin si
           contenu(A.sag, B.sag)
           contenu(A.sad, B.sad)
    fin
    Le deuxième:
    Code : 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
    domaine (A: arbre, B: arbre):booleen
    val_minA, val_minB, val_maxA, val_maxB:Entier
    début
           si vide?(A) ET vide?(B) alors
              renvoyer vrai
           sinon si vide?(A) OU vide?(B) alors
              renvoyer faux
           fin si
           val_minA <- min(A)
           val_minB <- min(B)
           val_maxA <- max(A)
           val_maxB <- max(B)
           si val_minB <= val_minA ET val_maxA <= val_maxB alors
               renvoyer vrai
           sinon
               renvoyer faux
           fin si
    fin
    Merci de l'aide que vous pourrez m'apporter

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Voyons, supposons que mes arbres binaires soient définis ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data Tree a = Leaf | Node (Tree a) a (Tree a)
    Commençons par faire la liste des éléments d'un arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    flatten :: Tree a -> [a]
    flatten Leaf = []
    flatten (Node fg a fd) = flatten fg ++ (a : flatten fd)
    On est bien d'accord que l'invariant pour un arbre binaire de recherche est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    prop_searchTree :: (Ord a) => Tree a -> Bool
    prop_searchTree Leaf = True
    prop_searchTree (Node fg a fd) = 
        prop_searchTree fg && prop_searchTree fd && 
        all (< a) (flatten fg) && all (> a) (flatten fd)
    Ce qui signifie qu'on peut écrire une procédure de recherche qui nous dit si tel élément est dans un arbre ou non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    contains :: (Ord a) => Tree a -> a -> Bool
    contains Leaf _ = False
    contains (Node fg a fd) b
        | a == b     = True
        | a < b      = contains fd b
        | otherwise  = contains fg b
    A partir de là, une méthode naïve pour vérifier si a est un sous-ensemble de b est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    subsetOf :: (Ord a) => Tree a -> Tree a -> Bool
    subsetOf tA tB = all (contains tB) (flatten tA)
    et on peut utiliser cela pour tester l'égalité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    equal :: (Ord a) => Tree a -> Tree a -> Bool
    equal tA tB = subsetOf tA tB && subsetOf tB tA
    Bien sûr on peut améliorer ces méthodes, mais je te laisse le soin de le faire.

    --
    Jedaï

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Alors je ne critique aucunement ce que tu as fait mais le seul soucis est que je ne comprend pas du tout la syntaxe du langage d'algo que tu as utilisé

  4. #4
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    C'est du Haskell (langage de haut niveau, purement fonctionnel et à évaluation paresseuse).

    Quant à tes algorithmes, le second est correct (il correspond exactement à ta description en tout cas), le premier est incorrect, le début marche mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    contenu(A.sag, B.sag)
    contenu(A.sad, B.sad)
    ne marche pas du tout, d'une part tu ne renvoies rien, quelque soit le résultat de ces fonctions, d'autre part, A.sag n'est pas forcément contenu par B.sag même si B contient A.sag .

    --
    Jedaï

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Ok alors pour les second si il est bon j'ai du me tromper quelque part dans mon implémentation alors par contre pour le premier je vois à peut près ce que tu veux dire, et je suppose que tu m'en donne les détails dans ta réponse précédente je vais donc tenté de comprendre ce que tu as écrit dans ton langage si j'y arrive

  6. #6
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Pour le second, il y a juste un petit problème si l'un est vide et l'autre non, tu ne traite pas ce cas, non plus que tu ne traites le cas où A est vide dans le premier.

    --
    Jedaï

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

Discussions similaires

  1. probleme Exo sur les ABR
    Par benjy13 dans le forum Autres SGBD
    Réponses: 0
    Dernier message: 17/06/2009, 19h21
  2. Petit algo sur les combinaisons
    Par Blaede dans le forum Mathématiques
    Réponses: 5
    Dernier message: 02/03/2008, 23h51
  3. Algo sur les graphes
    Par BatuBou dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 27/12/2007, 18h33
  4. Algo sur les factoriels
    Par Panaméen dans le forum Mathématiques
    Réponses: 13
    Dernier message: 04/11/2007, 15h08
  5. Réponses: 24
    Dernier message: 27/09/2005, 21h16

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