Outils pour utilisateurs

Outils du site


nsi:tds:deux_points_les_plus_proches

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
nsi:tds:deux_points_les_plus_proches [2021/10/08 18:47] – créée goupillwikinsi:tds:deux_points_les_plus_proches [2022/12/12 10:25] (Version actuelle) goupillwiki
Ligne 1: Ligne 1:
 ====== Deux points les plus proches ====== ====== Deux points les plus proches ======
  
-On donne un tableau de points du plan avec leurs coordonnées (x ; y).+[[https://fr.wikipedia.org/wiki/Recherche_des_deux_points_les_plus_rapproch%C3%A9s|Page Wikipedia]]
  
-Quels sont les deux points les plus proches ?+{{ :nsi:tds:closest_pair_of_points.png?nolink&200|}} 
 + 
 +On donne un tableau de points du plan avec leurs coordonnées $(x\,;\,y)$. 
 + 
 +**Quels sont les deux points les plus proches ?** 
 + 
 +===== Algorithme naïf ===== 
 + 
 +Consiste à chercher les distances pour les $\frac{n\,(n-1)}{2}$ paires de points possibles. Il s'agit donc d'un algorithme en $n^2$, c'est à dire que s'il y a $10\times$ plus de points, l'algorithme sera $100\times$ plus long. 
 + 
 +===== Algorithme quasi-linéaire ===== 
 + 
 +Quasi-linéaire signifie que s'il y a $10\times$ plus de points, le temps de calcul sera quasiment $10\times$ plus long. On comprend que cet algorithme devient beaucoup plus rapide quand le nombre de points augmente. Il faut bien sûr considérer de très grands nombres, par exemple 100 000. Tant qu'il n'y a qu'une centaine de points, la machine calcule très vite sans qu'on perçoive de différence. 
 + 
 +Il s'agit d'un algorithme de type [[nsi:terminales:diviser_pour_regner|diviser pour régner]]. 
 + 
 +==== Description générale ==== 
 + 
 +On réalise une fonction ''recherche'' qui reçoit en argument une liste ''points'' de paires ''(x,y)''
 + 
 +Si le nombre ''n'' de paires est inférieur ou égal à 3, on se contente de faire une recherche exhaustive de la paire la plus proche. 
 + 
 +Sinon on lance le mécanisme habituel de la méthode //diviser pour régner// qui procède en 3 étapes : 
 + 
 +=== Diviser === 
 + 
 +Déterminer une abscisse $x_0$ permettant de couper la liste de points en deux. Ceux à gauche et ceux à droite de $x_0$. On forme ainsi deux ensembles de points que l'on peut appeler $G$ et $D$. 
 + 
 +=== Régner === 
 + 
 +On exécute ''recherche'' sur les deux sous ensembles, $G$ et $D$. On obtient ainsi la paire de points les plus proches dans $G$ et la paire de points les plus proches dans $D$. 
 + 
 +=== Combiner === 
 + 
 +C'est le plus compliqué : 
 +  * L'étape précédente à produit deux réponses. On sélectionne celle qui donne la distance la plus courte. Notons $\delta$ cette distance. C'est la distance entre deux points de $G$ ou de $D$. 
 +  * Nous devons chercher s'il n'y aurait pas une paire de points, l'un dans $G$ et l'autre dans $D$, dont la distance serait plus petite. Pour cela on procède à une nouvelle recherche en procédant ainsi : 
 +    * On sélectionne dans $G$ les points dont l'abscisse est dans $[x_0-\delta\,;\,x_0]$ et dans $D$ ceux dont l'abscisse est dans $[x_0\,;\,x_0+\delta]$. On forme ainsi un ensemble $B$. 
 +    * On parcours les points de $B$ par ordonnées croissantes. Pour chaque $P$ ainsi parcouru, on calcule sa distance avec les 7 suivants. On cherche la paire la plus proche. On retient la paire donnant la distance la plus petite. Soit $\delta_B$ cette distance. 
 +    * À l'issue de cette recherche, on est certain que la paire la plus courte a été trouvée. Soit c'est la paire correspondant à $\delta$, soit c'est la paire correspondant à $\delta_B$. 
 + 
 +=== Pour faciliter la tâche ==== 
 + 
 +Il pourra être utile de trier les points dès le départ selon les $x$ croissants. 
 + 
 +===== Implémentation ===== 
 + 
 +Vous devez implémenter cet algorithme et le tester. 
 + 
 +Puisqu'il s'agit d'optimiser un temps d'exécution, il sera bienvenu de prévoir une comparaison de temps d'exécution entre cet algorithme et un algorithme naïf.
  
-On peut calculer les distances entre chaque paire de points. Pour $n$ points, il y aura $\frac{n\cdot (n-1)}{2}$ distances à calculer. Ce serait donc un algorithme dont le coût est en $n^2$. 
  
-Il existe un algorithme en $n\cdot \log(n)$.  [Voir sur Wikipedia](https://fr.wikipedia.org/wiki/Recherche_des_deux_points_les_plus_rapproch%C3%A9s) 
nsi/tds/deux_points_les_plus_proches.1633711643.txt.gz · Dernière modification : de goupillwiki