Bonjour,
Voici le problème auquel je suis confronté:
Je dispose d'un vecteurs de points. Chaque points est caractérisé par des coordonnées cartésiennes x et y. Ce vecteur contient tout de même la bagatelle de 15 millions d'éléments ...
Je dois régulièrement chercher dans le vecteur les n points les plus proches selon la distance d1 de points A(x,y) en entrée de la méthode.
(d1(A,B)= |xA-xB|+|yA-yB|)
Actuellement je suis tenté de faire comme il suit:
Je maintiens un arbre binaire B qui contient les n points de distances minimales trouvés dans la liste. Chaque noeud du tas binaire forme un couple N(indice du point dans le vecteur, distance à A).
J'initialise mon tas binaire vide, je parcours mon vecteur de points.
- Si mon tas contient moins de n éléments, alors j'insère l'élément courant.
- Sinon, j'extrais l'élément N1 de distance à A maximale du tas. Si l'élément courant (point) de la liste a une distance à A inférieure, alors j'insère cette élément dans le tas et je retire l'élément de distance à A maximale dans le tas.
Ainsi, je n'effectue qu'un seul parcours de liste et qui plus est, la liste des points candidats est codé par un tas binaire qui offre des complexités plutôt correctes pour les opérations sur cette liste de candidats (extraction du maximum, insertion d'un nouvel élément, suppression d'un élément).
Mon problème est le suivant:
- Je parcours toute la liste à chaque recherche !
Je pense qu'il y a peut être possibilité de trier la liste pour pruner les espaces de recherche lors d'une requête, et ce indépendamment du point A en entrée. J'ai quelques doutes cependant. J'imagine que je ne suis pas le premier à rencontrer ce problème. Peut-être certains auront t'ils des solutions élégantes, plus rapide. Je précise que les coordonnées sont entières et bornées (minX, maxX, minY, maxY).
Cordialement,
Partager