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 :

création d'un arbre de recherche


Sujet :

Algorithmes et structures de données

  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 44
    Par défaut création d'un arbre de recherche
    Bonjour,
    J'ai une carte formée par plusieurs polygones et je voudrai rechercher un polygone qui contient le point A (x, y). Afin d'accélérer la recherche, je pense d'utiliser un arbre binaire. De cela, je construits les structures de données suivantes :
    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
     
    typedef struct Point2D{
      double x;
      double y ;
    };
    typedef struct Polygone{
     int numero ;
     double xMin, yMin, xMax, ymax ;
     vector<Point2D>vectSommet ;
    }* tabPolygone;
     
    typedef struct noeud{
      Polygone contenu ;
      struct noeud* filsGauche ;
      struct noeud* filsDroite ;
    }*arbre ;
    le struct Polygone contient les informations relatives à un polygone et tabPolygone est un pointeur sur Polygone. Chaque polygone est délimité par le point min(xMin, yMin) et le point max(xMax, yMax) et vectSommet contient l'ensemble des sommets qui forment le polygone. Comment devrai je construire mon arbre afin d'avoir un meilleur temps de recherche ?
    merci pour votre aide.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par PrettyMan Voir le message
    le struct Polygone contient les informations relatives à un polygone et tabPolygone est un pointeur sur Polygone. Chaque polygone est délimité par le point min(xMin, yMin) et le point max(xMax, yMax) et vectSommet contient l'ensemble des sommets qui forment le polygone. Comment devrai je construire mon arbre afin d'avoir un meilleur temps de recherche ?
    Est-ce que, par hasard, une structure kd-tree ne répondrait pas à ton bonheur ?
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Est-ce que, par hasard, une structure kd-tree ne répondrait pas à ton bonheur ?
    En fait, pas tout à fait. Un KdTree permet d'accélérer la recherche du(des) plus proche(s) voisin(s). Pas nécessairement ce qui contient qui (en tout cas par directement). En tout cas, j'ai un peu de difficulté à appliquer directement un KdTree pour la recherche.

    Dans un premier temps, je pense qu'il vaut mieux utiliser une grille régulière ( ou un quadtree. ) Tu peux récupérer en O(1) le voxel qui contient le point que tu recherches. Après ça il te suffira de chercher dans les polygones qui ont une intersection non nulle avec le voxel courant celui qui contient ton point.

    Si tu es dans le cas particulier où tes polygones forment une partition de l'espace tu peux construire un BSP (avec comme plan de découpe les segments de tes polygones), et là la recherche sera un simple parcours de ta structure. (mais la construction est plus compliquée qu'avec une grille).

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par PRomu@ld Voir le message
    En fait, pas tout à fait. Un KdTree permet d'accélérer la recherche du(des) plus proche(s) voisin(s). Pas nécessairement ce qui contient qui (en tout cas par directement). En tout cas, j'ai un peu de difficulté à appliquer directement un KdTree pour la recherche.
    Bah, le kd-tree tout comme le quad-tree sépare l'espace en petites zones.

    En utilisant les 4 droites formant une bounding-box, on peut créer un découpage de l'espace (interieur/exterieur de la bounding-box). Il suffit de stocker un pointeur dans la feuille de l'arbre qui indique l'intérieur de la BB.

    Pour la recherche, on prend un point A(x,y) quelconque et on descend l'arbre jusqu'a une feuille, et on collecte tous les pointeurs stockés dans les noeuds traversés.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Membre Expert
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Par défaut
    Citation Envoyé par PRomu@ld
    En fait, pas tout à fait. Un KdTree permet d'accélérer la recherche du(des) plus proche(s) voisin(s). Pas nécessairement ce qui contient qui (en tout cas par directement). En tout cas, j'ai un peu de difficulté à appliquer directement un KdTree pour la recherche.
    Le KD-tree est très bien adapté à la recherche à l'intérieur d'un rectangle/paralléloide aligné sur les axes. Si tu sais renvoyer la liste des éléments d'un arbre binaire de recherche contenus dans un certain intervalle alors tu sais généraliser à un KD-tree en dimension quelconque.
    Le tout est de l'avoir déjà fait au moins une fois car ça n'est pas le même paramorphisme que pour la recherche d'un point :
    • au lieu de n'avoir qu'une fonction de parcours tu en as 3, la 1ière est un parcours complet, la 2nd est un parcours de la branche gauche qui s'arrête lorsque tu franchis le minimum, la 3ième est un parcours de la branche droite qui s'arrête lorsque tu dépasse le maximum
    • au lieu de n'explorer qu'une seule branche tu explore systématiquement les deux, c'est le dépassement des bornes qui arrête la récursion
    • au cours de ce parcours tu collecte tous les points contenus dans un intervalle/rectangle/paralléloide

  6. #6
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Le KD-tree est très bien adapté à la recherche à l'intérieur d'un rectangle/paralléloide aligné sur les axes.
    Comme d'habitude, j'ai encore lu trop vite le PO, j'ai zappé le aligné aux axes

Discussions similaires

  1. JTree création de l'arbre, conseil?
    Par menuge dans le forum Composants
    Réponses: 4
    Dernier message: 23/05/2006, 17h53
  2. Création d'un arbre n-aire
    Par Premium dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/05/2006, 17h01
  3. [débutant Java] création d'un arbre binaire
    Par barouz dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2006, 04h25
  4. Cration d'un module de recherche
    Par cyberbiker dans le forum Access
    Réponses: 1
    Dernier message: 16/03/2006, 15h25
  5. Arbre de recherche : quel algo conseiller ?
    Par cedico dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 02/12/2005, 11h07

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