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 :

Indexation dans le plan


Sujet :

Algorithmes et structures de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut Indexation dans le plan
    Bonjour,

    Je travaille sur un très grand cadrillage sur lequel sont disposés des pions au hasard. (éventuellement plusieurs par case) Etant donné :

    • Une case de la grille (x, y)
    • Une distance d


    le problème est de trouver le plus rapidement possible la liste des pions situés à une distance (euclidienne) inférieure ou égale à d de la case donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (a - x)² + (b - x)² < d²
    Quelle structure de données utiliser pour coder l'ensemble des pions du damier ? Je ne cherche pas une complexité au pire minimum : en fait, la plupart du temps il y aura très peu de pions "visibles" depuis la case à la distance donnée. Pour cette raison, je ne peux pas me contenter de parcourir le domaine "visible" et regarder sur chaque case s'il y a des pions ou non.

    Blustuff.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ce que tu pourrais faire, c'est faire du hiérarchique : tu découpe ton plan en cases, et tu surveilles juste quels points sont dans quelle case - on fait ça pour les jeux vidéos pour al collision par exemple et aussi la vision -, ...
    Quand tu veux voir si un point est proche ou pas, tu prends les cases autour du point et tu parcours les éléments dans les cases.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    C'est ce que je fais actuellement. Mais ça me pose des problèmes. En particulier la question : "Quelle taille de case prendre ?"

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ca, c'est un gros problème ! Plus les cases sont petites, moins elles sont utiles, et plus il y a de changement de région. Plus les cases sont grandes, plus il y a d'éléments. Le mieux, tester pour voir les paramètres optimaux.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    En prenant comme dimension des cotés des "super-cases" la racine du nombre de cases du quadrillage, on devrait être proche de la bonne valeur.

    Si on fait un découpage à deux niveaux, "super-cases" et "hyper-cases", on utiliserait la racine cubique.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Pourquoi la racine carrée ? Pourquoi faire un double découpage ?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est une valeur heuristique, empirique, c'est tout

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Pourquoi la racine carrée ?
    La racine carrée équilibre le nombre de recherches sur les cases et les super cases.
    Exemple, si le quadrillage comporte 256x256 cases, on aura 16x16 supercases comportant chacune 16x16 cases.

    Pourquoi faire un double découpage ?
    Exemple le quadrillage comporte 1000x1000 cases, on aura 10x10 hypercases contenant chacune 10x10 supercases comportant chacune 10x10 cases.

    Ainsi on peut lorsqu'il y a peu de cases remplies éliminer rapidement les hypercases sans rien, sinon dans les hypercases avec qqchose on élimine vite les supercases vite.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    L'indexation des super-cases est naturelle. On trouve en O(1) les super cases à tester. Si la taille des cases est bien choisie en fonction des "d" donnés, on a que quatre super cases à tester au maximum, une au minimum.

    Je ne vois pas encore l'utilité d'équilibrer les recherches sur les cases et super-cases, ou d'éliminer les hyper cases.

  10. #10
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Tu peux aussi passer par une autre distance :

    Max(Abs(x-a), Abs(y-b)) <= racine((x-a)²+(y-b)²)

    Or la détermination des points tels que Max(Abs(x-a), Abs(y-b)) < d est rapide, puisque cette recherche est facilement indexable
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Comment est elle indexable ?

    (Je viens de comprendre ce que signifie l'équilibrage de la recherche sur les cases et super cases. Mais en l'occurence, mon problème est un peu plus restreint : je sais que d ne bougera pas beaucoup et son encadrement. Mon interrogation reste alors entière puisqu'on sait qu'en choisissant bien la taille des super cases il n'est pas nécessaire de faire de recherche sur l'ensemble des super cases. Est-ce un bon choix ?)

  12. #12
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Citation Envoyé par Blustuff
    Comment est elle indexable ?
    Tu connais tes points, tu peux donc les indexer suivant x et y, or chercher des points tels que abs(x-a) < d reviens à chercher des points tels que
    a - d <= x <= a + d, l'index sur x pourra être utilisé (même chose en y)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Le titre du sujet est "index dans le plan", certes. On pense qu'à partir d'un point du plan, on peut trouver facilement les points autour. En fait non, et si j'ai bien compris votre logique, vous proposez de par exemple d'abord parcourir les x proches, et pour chaque x, parcourir les y proches : Ce qui revient à parcourir toute le zone visible ce que je ne veux pas :

    Citation Envoyé par Blustuff
    Je ne cherche pas une complexité au pire minimum : en fait, la plupart du temps il y aura très peu de pions "visibles" depuis la case à la distance donnée. Pour cette raison, je ne peux pas me contenter de parcourir le domaine "visible" et regarder sur chaque case s'il y a des pions ou non.
    Si je me trompe, éclairez moi.

  14. #14
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    il n'est pas nécessaire de faire de recherche sur l'ensemble des super cases.
    En effet, il faut seulement tester les supercases situées autour du point de test. Si d est la distance recherchée et si la diagonale d'une supercase est D, on peut éliminer toutes les cases dont la distance de leur centre au centre de la supercase contenant le point de test est supérieur à d+D .
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Oui, ça je sais puisque c'est exactement la méthode que j'emploie actuellement. Mais ça ne répond pas à ma question.

  16. #16
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Je ne sais pas si ça répond à la question, mais pour utiliser le découpage de l'espace, il faut gérer, en parallèle avec le tableau des coordonnées des pions, une liste chainée permettant de parcourir la liste des pions de chaque supercase.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Non. Ma solution marche : Je cherche une autre solution.

  18. #18
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ah, OK
    Ben, je ne sais pas si ça existe vraiment

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    J'avais pourtant une idée qui doit marcher, de créer et de maintenir un graphe, où les noeuds sont les cases occupées d'où partent quatre arcs (liste quadruplement chainée ?) pour parcourir de proche en proche. On a un algorithme très rapide pour trouver les pions proches d'une case déjà occupée, mais je n'ai pas d'algorithme efficace pour maintenir le graphe en cas de déplacement d'un pion sur le damier.

  20. #20
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    (coucou Blustuff ;o)

    dans le cas du graphe, lors d'un déplacement, il faut mettre a jour les arcs du points déplacés ET des points liés

    Dans tout les cas, je pense a un algo de recherche de proche en proche a partir des anciens arcs.

    Par exemple, si on s'est déplacé d'une position vers le haut :

    * l'arc du bas ne devrait pas avoir changé (a moins qu'on ait depassé le point lié a l'arc du haut, dans ce cas l'arc du haut devient l'arc du bas pour les 2 points qui se sont croisés)
    * L'arc du haut ne devrait pas avoir changé (sauf cas exposé ci dessus, dans ce cas là, on echange les arcs a nouveau)
    * L'arc de droite peut avoir changé, il faut comparer les distances entre le point lié a l'arc de droite et le point lié a l'arc du haut de l'arc de droite (voir suivre un chemin (comme lorsqu'on suit le mur de gauche d'un labyrinthe) jusqu'a ce qu'on arrive a un point plus éloigné que l'ancien point ou que l'arc du haut)
    * idem pour l'arc de gauche

    Les seuls algos demandant une recherche plus globale sur la carte seraient les cas d'insertion de nouveaux points sur la carte.

Discussions similaires

  1. lire les indexes dans une stringGrid
    Par zidenne dans le forum Composants VCL
    Réponses: 1
    Dernier message: 01/12/2005, 15h15
  2. A quoi servent les index dans une BDD ?
    Par Melvine dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 25/10/2005, 12h14
  3. mise a zéro de la clé d'index dans une table
    Par Atchoum_002 dans le forum Access
    Réponses: 2
    Dernier message: 19/09/2005, 15h34
  4. Récupération d'index dans DBLookupControl ?
    Par Michel D. dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/06/2004, 15h01

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