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 :

Trouver ses plus proches voisins


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut Trouver ses plus proches voisins
    Bonjour,

    Imaginons une population d'éléments quelconques caractérisés par leurs identifiant unique et leurs coordonnées X et Y (non bornée).

    Selon vous, quel serait la meilleur méthode pour déterminer (le plus rapidement possible) quels sont tous les éléments situés à une distance maximale x d'un élément donnée...

    Alors évidemment, il existe la méthode fort peu subtile consistant à parcourir l'ensemble des éléments et récupérer ceux répondant à la formule :

    x² < (Xelement2 -Xelement1)² + (Yelement2 - Yelement1)²
    ce qui vous en conviendrez ne peut pas être utilisé sur un trop grand nombre d'éléments appelant eux même souvent cet algo...

    Notez que la question n'est pas posé à titre de demande d'aide mais plutôt comme un défi... La structure de donnée utile pour stocker la liste de tous les éléments n'est donc pas imposée, et il est possible d'utiliser des arbres binaires, des tableaux hashés ou non, des liste chainées ou n'importe quoi d'autre, le tout étant de faire l'algo le plus rapide possible.

  2. #2
    Expert confirmé 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
    Par défaut
    il existe la méthode fort peu subtile ....
    Ben, moi elle me plait bien, y'a vraiment pas grand chose à gagner à optimiser en éliminant par exemple les points tels que :
    (Abs(Xelement2 -Xelement1)>x) OU (Abs(Yelement2 -Yelement1)>x)
    d'ailleurs si la grande majorité des points sont concentrés dans un petit rayon, cette "optimisation" serait pénalisante.

  3. #3
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    oui mais non... Cette méthode serait parfaitement inutilisable au delà d'un millier d'éléments a qui on demanderais de faire l'opération 2 ou 3 fois / secondes... Je donnais cet algo à titre d'exemple, mais c'est parfaitement irrecevable !

    Perso, je pense à l'optimisation par un arbre binaire... Je découperai la surface sur laquelle se positionnent ces éléments en parcelles, et je stockerai les coordonnées X et Y de début de chaque parcelles dans 2 arbres binaires différents (1 arbre pour X, un arbre pour Y)... Ensuite, a chaque feuille de mes arbres binaires, j'associerai un tableau dynamique référençant les éléments dont la coordonnée concernée se situerai dans l'intervalle définie par cette feuille...

    Ensuite, j'ai plus qu'a faire un algo de parcours de l'arbre pour récupérer les feuilles voisines (ce qui prendra une poignée d'instructions) contenant donc les références des éléments ayant des coordonnées voisines à la mienne. J'ai plus qu'a faire l'union des feuilles retournées par les arbres X et Y pour trouver tous les voisins, et appliquer ensuite l'ago sus-cité pour affiner mon résultat, et économiser des millions d'opérations par seconde.

    Maintenant, la méthode est peut être plus délicate à mettre en oeuvre sur une surface non bornée, mais c'est le style de réponse que je m'attend à recevoir.

  4. #4
    Expert confirmé 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
    Par défaut
    Cette méthode serait parfaitement inutilisable au delà d'un millier d'éléments a qui on demanderais de faire l'opération 2 ou 3 fois / secondes...
    Là, ca devient plus intéressant comme problème, puiqu'on a peut-être avantage à pré-traiter l'ensemble des éléments ou chaque élément quand on l'insère.
    La solution dépendra :
    - du nombre d'éléments total,
    - du nombre d'éléments à traiter,
    - du fait que la collection d'éléments soit variable ou fixe,
    - et si la collection est variable, du taux de variation.

  5. #5
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    éléments total : plusieurs dizaines de milliers
    a traiter : tous et de façon désordonnée en temps et en ordre
    collection variable dans le temps et l'espace (les éléments se déplacent et peuvent apparaitre ou disparaitre)
    taux de variation faible en quantité, très importante en coordonnées

    bref, un algo qu'on pourrait par exemple appliquer à une colonie de fourmis communiquant entre elles... Mais comme je disais, c'est pas une question posée dans le cadre d'un projet concret. Je le développerai surement pour le plaisir ensuite.

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Le seul moyen d'optimiser un tel problème est de pouvoir trier les éléments selon un critère donné, voire les obtenir déjà triés et tâcher de maintenir cet ordre tout au long du traitement.

    Dans le cas contraire, tu es obligé de tous te les palucher, pour la simple et bonne raison que tu ne peux déduire aucune information concernant un point à partir des points précédents. Sauf, bien sûr, à atteindre les limites du domaine de définition : si tu trouves un point confondu avec le point de référence, ce n'est plus la peine de chercher d'autres points plus proches, par exemple. Ce n'est donc pas applicables pour les points les plus éloignés.

    J'avais eu le même problème en écrivant un petit simulateur de gravité : 300 étoiles qui interagissent toutes entre elles, ça fait 90 000 vecteurs à remettre à jour à chaque frame.

    Une bonne manière d'optimiser les temps de traitement, en revanche, est d'utiliser le système approprié. Si tu passes en coordonnées polaires, par exemple, tu ne t'intéresse qu'à la distance et tu peux laisser l'angle de côté. Tu te retrouves alors avec un tableau à une dimension qu'il est très facile de trier et de maintenir classé. La recherche du premier est alors en O(1) : c'est le premier du tableau ! et la recherche d'un point quelquonque est en O(n log n).

    Par contre, si tu as une idée dont la manière évoluent tes points au cours du temps, alors tu peux faire une présélection en te basant sur le fait que les autres points ne pourront pas surpasser les caractéristiques des premiers avant un nombre d'étapes donné.

    Notez que la question n'est pas posé à titre de demande d'aide mais plutôt comme un défi.
    Si c'est une manière de titiller les participants pour qu'il trouvent la solution à ta place sans que cela se voie, ça ne prend pas. Il y en a beaucoup qui ont essayé avant !

  7. #7
    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 comode
    oui mais non... Cette méthode serait parfaitement inutilisable au delà d'un millier d'éléments a qui on demanderais de faire l'opération 2 ou 3 fois / secondes... Je donnais cet algo à titre d'exemple, mais c'est parfaitement irrecevable !
    On peut se limiter a explorer les points qui sont "potentiellement" dans la boule de rayon R souhaitée.

    En première approximation on peut éliminer tous les points qui ont une distance projetée sur X ou Y supérieure à R. Puis éliminer les points qui ne sont pas dans le carré de coté 2R. Et enfin éliminer ceux qui ne sont pas dans le cercle de rayon R.

    Auquel cas, l'utilisation d'une segmentation d'espace 1D semble suffisante.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  8. #8
    Membre chevronné
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    On peut se limiter a explorer les points qui sont "potentiellement" dans la boule de rayon R souhaitée.

    En première approximation on peut éliminer tous les points qui ont une distance projetée sur X ou Y supérieure à R. Puis éliminer les points qui ne sont pas dans le carré de coté 2R. Et enfin éliminer ceux qui ne sont pas dans le cercle de rayon R.

    Auquel cas, l'utilisation d'une segmentation d'espace 1D semble suffisante.
    Et comment tu fais pour éliminer tous les éléments qui ont une distance projetée sur X ou Y supérieure à R sinon en faisant une boucle qui parcourira l'ensemble des milliers d'éléments à chaque requête ?

  9. #9
    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 comode Voir le message
    Et comment tu fais pour éliminer tous les éléments qui ont une distance projetée sur X ou Y supérieure à R sinon en faisant une boucle qui parcourira l'ensemble des milliers d'éléments à chaque requête ?
    Bah, tu maintiens tes éléments dans une structure de liste triée sur X (ou sur Y). Par exemple une liste chainée.

    La recherche des bornes min/max de ton exploration se fait par une recherche dichotomique, donc assez rapidement. Reste a examiner les éléments entre ces 2 bornes.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

Discussions similaires

  1. Trouver la liste des K plus proches voisins
    Par hoccha dans le forum SAS STAT
    Réponses: 5
    Dernier message: 11/10/2011, 10h21
  2. Trouver le plus proche voisin
    Par suistrop dans le forum SAS STAT
    Réponses: 2
    Dernier message: 29/09/2009, 14h03
  3. Recherche des plus proches voisins dans un espace variable à K dimensions parmis N
    Par JeromeBcx dans le forum Algorithmes et structures de données
    Réponses: 34
    Dernier message: 26/06/2008, 17h46
  4. Comparaison d'une valeur pour trouver la plus proche
    Par Falcdyr dans le forum VBA Access
    Réponses: 4
    Dernier message: 16/04/2008, 17h10
  5. Réponses: 3
    Dernier message: 12/04/2007, 09h32

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