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 :

structure de donnée Union-Find


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut structure de donnée Union-Find
    Bonjour,

    Je n'arrive pas à bien comprendre la structure de données apellée : "Disjoint-set data structure"

    Meme si elle est bien expliqué sur wikipedia - disjoint-set data structure ou un exemple d'implementation ici : LiteratePrograms Disjoint set



    Ce que je ne comprends pas c'est l'opération de find, elle est partout décrite par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function Find(x)
         if x.parent == x
            return x
         else   
            return Find(x.parent)
    Et c'est censé retourner la racine.
    Mais le problème c'est :
    * Comment on fait pour savoir si un élément se trouve dans la structure ou pas.
    * On ne possède pas un pointeur vers tous les éléments, donc comment connaitre x.parent si on n'a pas de pointeur vers x...

    Exemple, j'ai 3 liste A, B, C avec dedans des elements numérotés de 1 à n.
    Si je faut A.find(1), je vois pas comment ca peut marcher.

    Merci

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    d'après ce que je vois, tu as une structure dans laquelle chaque noeud connait son père. La racine pointe vers elle même car elle n'a pas de père.
    Ta fonction "Find" cherche la racine de l'ensemble que tu étudies :
    - si x = x.parent alors on est à la racine et on retourne x.
    - sinon on retrounera(x.parent), autrement dit on regardera un cran au dessus dans la hierarchie.

    Pour ce qui est de ton problème d'ensembles disjoints, tu sauras si deux éléments sont dans le même ensemble si la racine est la même.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    Merci pour cette réponse.

    Donc cela veut dire qu'il faut connaitre le lien vers tous les éléments.
    Et pour savoir si par exemple 2 et 4 sont dans le meme ensemble il faut deja que je cherche les élément 2 et 4 (dans une liste chainée par exemple), que je trouve leurs peres et que je les compares...
    Mais trouver 2 et 4 se fait en O(n) dans une liste.
    Donc je gagne du temps grace à cette structure pour connaitre la classe d'un élément mais ca m'aide pas pour rechercher un élément.
    J'avais mal compris alors.

    Merci

  4. #4
    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 pasdeface Voir le message
    * Comment on fait pour savoir si un élément se trouve dans la structure ou pas.
    Un element est toujours dans un ensemble. C'est un systeme qui permet de faire des partitions (generalement au depart degeneree: chaque element est dans sa partition a lui tout seul, et apres on construit les partitions par fusion -- d'autres operations sont possibles mais plus complexes, la structure est optimisee pour celle-la). Les partitions sont identifiees par un element (la racine) qui est choisi plus ou moins au hasard (dans une fusion, c'est la racine d'un des deux ensembles fusionnes).

    * On ne possède pas un pointeur vers tous les éléments, donc comment connaitre x.parent si on n'a pas de pointeur vers x...
    Tu te fais un tableau indexe par tes elements et tu es parti.

    Note, generalement on associe au find de la compression pour accelerer les recherches suivantes (version avec tableau pour expliciter le point precedant):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PROCEDURE find(x) IS
       IF (parent[x] = x) THEN
          RETURN x
       ELSE
          VAR result = find(parent[x])
          parent[x] = result
          RETURN result
       ENDIF
    END
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    Je vous remercie

  6. #6
    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 pasdeface Voir le message
    Merci pour cette réponse.

    Donc cela veut dire qu'il faut connaitre le lien vers tous les éléments.
    Et pour savoir si par exemple 2 et 4 sont dans le meme ensemble il faut deja que je cherche les élément 2 et 4 (dans une liste chainée par exemple), que je trouve leurs peres et que je les compares...
    Mais trouver 2 et 4 se fait en O(n) dans une liste.
    Donc je gagne du temps grace à cette structure pour connaitre la classe d'un élément mais ca m'aide pas pour rechercher un élément.
    J'avais mal compris alors.
    Tu peux maintenir des listes chainees (ou tout autre conteneur) en parallele de la structure d'Union-Join si tu as besoin a la fois d'iterer et de savoir si deux elements sont dans la meme partition.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

Discussions similaires

  1. Unions et structures de données
    Par sperca dans le forum Débuter
    Réponses: 3
    Dernier message: 08/05/2009, 20h12
  2. Aide pour diagramme de structure des données
    Par DeezerD dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 04/12/2004, 19h10
  3. Méta-Programmation - [ structures de données ]
    Par Dam)rpgheaven dans le forum C++
    Réponses: 3
    Dernier message: 03/12/2004, 19h38
  4. Structure des données en retour d'un DBExtract ?
    Par mikouts dans le forum XMLRAD
    Réponses: 4
    Dernier message: 24/01/2003, 15h15
  5. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10

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