• Aucun résultat trouvé

Les deux points les plus proches

N/A
N/A
Protected

Academic year: 2022

Partager "Les deux points les plus proches"

Copied!
2
0
0

Texte intégral

(1)

Les deux points les plus proches

Tahina Ramananandro ramanana@clipper.ens.fr

Lycée Louis-le-Grand – MPSI CAML 7 mai 2008

Étant donné un ensemble fini de points du plan, on veut déterminer parmi ces points le couple des deux points (distincts) les plus proches (au sens de la distance euclidienne).

Chaque point est représenté par le couple de son abscisse et de son ordonnée : type point == (float * float);;

L’ensemble des points considérés est vu comme un tableau (point vect).Dans toute la suite, on supposera que les abscisses des points sont toutes distinctes deux à deux.

Ne pas oublier de tester les fonctions aussitôt écrites.

1 Méthode naïve

Écrire une fonction :

naive : point vect -> ((point * point) * float)

qui parcourt tout le tableau et retourne les deux points, ainsi que leur distance, en examinant tous les couples de points distincts possibles.

Combien d’additions et de multiplications sont nécessaires à ce calcul ? Combien de comparaisons ?

2 Diviser pour régner

Nous allons examiner une méthode plus fine, qui consiste à : 1. Séparer le plan en deux suivant une droite verticale,

2. Calculer récursivement le couple des deux points les plus proches dans chaque demi-plan récursivement,

3. Comparer les couples obtenus avec le couple des deux points les plus proches de la droite de séparation de part et d’autre.

2.1 Préparation

On veut d’abord construire :

– la liste des points triés par ordonnées croissantes, – le tableau des points triés par abscisses croissantes.

Programmer un tri (de préférence le moins complexe possible) pour construire ces deux objets et donner sa complexité. On pourra éventuellement utiliser les fonctions CAML list_of_vect et vect_of_list (mais à bon escient !)

2.2 Séparation du plan

Écrire une fonction :

separer : point vect -> int -> int -> point list -> (point list * point list) telle que, si :

– trie_par_X est le tableau de tous les points triés par abscisses croissantes

– trie_par_Y_partiel est la liste, triée par ordonnées croissantes, des points de trie_par_X à partir de l’indice i et jusqu’à l’indice j,

alorsseparer trie_par_X i j trie_par_Y_partielconstruit les deux listes, triées par ordonnées croissantes, des points detrie_par_X, d’une part entre les indices i et i+j2 , d’autre part entre les indices i+j2 + 1 et j.

Quel est son nombre de comparaisons en fonction de i et j ? 1

(2)

2.3 Couples à cheval sur la ligne de séparation

Supposons qu’on ait déjà calculé chacun des couples les plus proches de part et d’autre de la ligne de séparation. Soitdist leur distance.

Construire d’abord une fonction :

a_cheval : point vect -> int -> int -> point list -> float -> point list

telle quea_cheval trie_par_X i j trie_par_Y_partiel distrenvoie la liste, triée par ordonnées croissantes, des points detrie_par_X entre les indicesi et j et situés à une distance d’au plusdist de la droite de séparation (dont l’abscisse est fst trie_par_X.(m), l’abscisse du point d’indicem danstrie_par_X avecm= i+j2 ).

Étant donné un point P de cette liste, quel est le nombre maximum de points de cette liste dont l’ordonnée dépasse d’au plusdist celle de P ?

À partir de cette remarque, construire une fonction qui extrait de cette liste le couple des deux points les plus proches de cette liste.

2.4 Résumé

Écrire le programme final :

les_plus_proches : point vect -> ((point * point) * float)

qui à partir d’un tableau quelconque de points du plan, calcule le couple des points les plus proches ainsi que leur distance.

Quelle est sa complexité en termes de nombre d’additions, multiplications ? En termes de nombre de comparaisons ?

3 Partons dans l’espace

Comment généraliser cette méthode à l’espace ? Avec quelle complexité ?

2

Références

Documents relatifs

Prendre notes des 4 cas de facteurs

Enfin on peut l'appliquer à la recherche des relations entre les distances mutuelles de cinq points situés d'une manière quelconque dans un plan, de six points situés d'une

Je sbjppóse tihré 1 lin'ttMIt &&trfc elifcmm. 'Soif M un de ses points. Je substilue à la courbe une ligne brisée inscrite* partant de A et finissant en B, dont je rabats

Pour établir cette réciproque, nous montrerons que, lorsque les équations (8) ont lieu, les six points forment un hexagone de Pascal, c'est-à-dire un hexagone dont les côtés opposés

Recherche du déplacement minimisant la distance entre deux ensembles de points homologues situés dans un plan.. Les cahiers de l’analyse des données, tome 3, n o 4

Si les nuages M(I) et N(I) ont leur centre de gravité en 0, on at- teindra ainsi le minimum absolu de l'écart pour toute isométrie (lais- sant ou non l'origine fixe) ; mais les

~ Activité : Faire placer deux points A et B de coordonnées entières, construire le milieu M de [AB] et en lire les coordonnées. Chercher une formule permettant d’obtenir

Interpoler c’est estimer une valeur intermédiaire (par exemple une valeur de y pour une valeur de x située entre les valeurs x i de la série) ; extrapoler c’est estimer une