• Aucun résultat trouvé

DM 1 : recherche des plus proches voisins

N/A
N/A
Protected

Academic year: 2022

Partager "DM 1 : recherche des plus proches voisins"

Copied!
4
0
0

Texte intégral

(1)

Lycée La Martinière Monplaisir

Option Informatique MPSI DS 1

DM 1 : recherche des plus proches voisins

Pour le 3 avril 2018 (2018-W14-2) 2018-W12-2

Le but de ce problème est le suivant : Étant donné une liste de points dans le plan donnés par leurs coordonnées cartésiennes dans un re- père orthonormé, on cherche une façon efficace de trouver les deux points les plus proches l’un de l’autre.

1 Préliminaires

Question 1

Écrire une fonction minimise, de type

’a list -> (’a -> float) -> ’a, pre- nant en argument une liste l = [x1;. . .;xn], une fonction f et retournant xi tel que f(xi) soit minimal.

Question 2

Écrire une fonction filtre, de type

’a list -> (’a -> bool) -> ’a list, prenant en argument une listelet une fonction f et retournant la liste des éléments x de l tels que l’appel (f x) retourne le booléen true. Ces éléments doivent être retournés dans la liste résultat dans le même ordre que dans la liste donnée en argument. Cette fonction existe déjà en OCaml et s’appelle List.filter.

Question 3

Écrire une fonction nth, de type

’a list -> int -> ’a prenant en ar- gument une liste`et un entier iet retournant l’élément d’indiceide la liste (on suppose que la liste possède au moinsi+ 1éléments). Cette fonction existe déjà en OCaml et s’appelle List.nth.

Question 4

Écrire une fonction first, de type

’a list -> int -> ’a list, prenant en argument une liste ` et un entier i et retournant lesipremiers éléments de `si`est de longueur au moinsiet tous les éléments de

`sinon.

Vous ferez en sorte que le temps d’exécution de (first i `) soit en O(i), indépendam- ment de la longueur de `.

2 Méthode naïve

On identifie les points du plan et leurs co- ordonnées cartésiennes et on introduit le type pointpour les représenter :

type point = float * float

Étant donné deux points P et Q, on note d(P, Q) la distance euclidienne deP à Q.

Question 5

Écrire une fonction dist, de type point -> point -> float retournant la distance euclidienne entre deux points donnés.

Étant donné un point P et un ensemble de points E, on dira qu’un élément P0 de E est un plus proche voisin deP si

d(P, P0) = min

Q∈Ed(P, Q) (1) P peut avoir plusieurs plus proches voisins si plusieurs points de E ont une distance à P égale àminQ∈Ed(P, Q).

Judicaël Courant - 2018-W12-2 1 Document sous licence Art Libre (http://artlibre.org)

(2)

Lycée La Martinière Monplaisir

Option Informatique MPSI DS 1

Question 6

Écrire une fonction plus_proche, de type point -> point list -> point, prenant en argument un pointpet une liste de pointsl retournant un plus proche voisin depparmi les éléments de l. Indication : utiliser minimise peut être une bonne idée.

Question 7

Quelle est la complexité de votre fonction plus_proche?

Question 8

Écrire une fonctionliste_plus_proches, de type point list -> (point*point) list prenant en argument une liste de points l = [p0;. . .;pn−1] et retournant une liste [(p0, p00);. . .; (pn−2, p0n−2)] telle que pour tout i∈[[0, n−1[[,p0i soit un plus proche voisin de pi parmi[pi+1;. . .;pn−1]. Si la listelcomporte un élément ou moins, liste_plus_proches retourne la liste vide.

Question 9

Quelle est la complexité de votre fonction liste_plus_proches?

Étant donné un ensembleE de points com- portant au moins 2 points, on appelle plus proches voisins tout couple(M, M0) ∈E2 vé- rifiant

d(M, M0) = min

(P,Q)∈E2,P6=Qd(P, Q)

Question 10

En utilisant la question précédente, écrire une fonction plus_proches_voisins_naif de type point list -> point*point pre- nant en argument une liste l ayant au moins deux éléments et retournant un couple de plus proches voisins de la listel. On supposera que la liste donnée ne comporte pas deux fois le même point.

Question 11

Quelle est la complexité de votre fonction plus_proches_voisins_naif?

3 Diviser pour régner

3.1 Modélisation du problème

Dans la suite, on représentera le nuage de points qui nous intéresse par un enregistrement possédant deux champs :

type nuage = {

par_x_puis_y : point list;

par_y : point list;

}

Dans tout ce qui suit, on veut que tout ob- jetnde typenuagequ’on manipule vérifie les trois propriétés suivantes :

1. Les deux champs n.par_x_puis_y et n.par_yreprésentent un même ensemble E de points : chaque point deE apparaît une et une seule fois dans chacune de ces deux listes ;

2. La liste n.par_x_puis_y est triée par ordre lexicographique ;

3. La liste n.par_y est triée par ordonnées croissantes.

On définit la taille d’un nuage de points comme le nombre de points qu’il contient.

On va écrire deux fonctions permettant de créer un objet de type nuage:

Question 12

Écrire une fonction cree_nuage, de type point list -> nuage, créant, à partir d’une liste de points tous distincts, un nuage de points vérifiant les trois propriétés recherchées.

Vous ferez en sorte que la complexité tem- porelle de cette fonction soit unO(NlogN)où N est la taille du nuage et vous justifierez la complexité de votre fonction.

Vous pouvez notamment utiliser la fonc- tionsortdu moduleList(cette fonction uti- lise une variante du tri fusion) et la fonc- tion compare (documentation dans la partie The core library du manuel d’OCaml, module Pervasives)

Question 13

Écrire une fonction filtre_nuage, de type

Judicaël Courant - 2018-W12-2 2 Document sous licence Art Libre (http://artlibre.org)

(3)

Lycée La Martinière Monplaisir

Option Informatique MPSI DS 1

nuage -> (point -> bool) -> nuage, prenant en argument un nuagen, une fonction f et retournant le nuage formé des points M de n tels que l’appel (f M) retourne true. Le nuage ainsi créé doit bien entendu vérifier les trois propriétés énoncées plus haut.

Sif s’exécute en O(1),filtre_nuagedoit s’exécuter en temps linéaire en la taille du nuage.

Par la suite, lorsqu’on voudra créer des ob- jets de type nuage, on s’astreindra à utiliser ces deux fonctions, de façon à être certain que les nuages créés vérifient les trois propriétés énoncées précédemment.

3.2 Découpage en sous-problèmes Pour résoudre ce problème, l’idée est de cou- per en deux le nuage de pointsnsur lequel on veut trouver les plus proches voisins, de cher- cher récursivement les plus proches voisins des deux demi-nuages ng et nd obtenus et enfin d’utiliser ces plus proches voisins des demi- nuages pour trouver les plus proches voisins den.

Question 14

Écrire une fonction coupe, de type nuage -> nuage * point * nuage, pre- nant en argument un nuagende taillek, avec k ≥ 1 et retournant deux nuages ng et nd respectivement de taillesbk/2cetdk/2e et un pointP tel que

1. ng contient tous les éléments de n stric- tement inférieurs à P pour l’ordre lexico- graphique ;

2. nd contient tous les éléments de n supé- rieurs ou égaux à P pour l’ordre lexico- graphique (y compris P).

La fonction coupe devra s’exécuter en temps linéaire enk.

3.3 Combinaison des solutions des sous-problèmes

Dans cette partie, on considère la situation suivante : on dispose d’un ensembleEde cardi-

nalk. On noteP un point deE,Egl’ensemble des pointsP0 tels queP0 < P pour l’ordre lexi- cographique, Ed l’ensemble des points P0 tels queP0 ≥P pour l’ordre lexicographique.

On note (xP, yP) les coordonnées de P. On suppose que Eg et Ed comportent au moins deux points, de telle sorte qu’ils possèdent cha- cun au moins un couple de plus proches voisins.

On note δg (resp δd) la distance minimale entre deux plus proches voisins dansEg (resp.

Ed) et on poseδ = min(δg, δd).

On note V la bande du plan constituée des points de coordonnées (x, y) vérifiant

|x−xP| ≤ δ et VB l’ensemble des points de E appartenant à V.

On note δ0 la distance entre deux plus proches voisins deE.

Question 15

Justifiez brièvement qu’on aδ0 ≤δ.

Jusqu’à la fin de cette partie, on suppose qu’on aδ0 < δ.

Question 16 Faire un dessin.

Question 17

Montrez que tout couple de plus proches voi- sins (M, M0) deE appartient à VB.

On note k0 = cardVB et (x0, y0), . . . , (xk0−1, yk0−1) les éléments de VB triés par or- données croissantes et on considère un couple (M, M0)de plus proches voisins deE.M etM0 s’écrivent respectivement (xi, yi) et (xj, yj).

Quitte à échangerM etM0, on ai < j. Question 18

Montrer qu’au plus quatre points de Eg ∩VB et quatre points deEd∩VB peuvent avoir des ordonnées appartenant à [yi, yj]. On fera de nouveau un dessin. On pourra utiliser le principe des tiroirs1 qui s’énonce comme suit : sin+ 1chaussettes sont rangées dansntiroirs (avecn∈N), alors au moins un tiroir contient au moins deux chaussettes.

1. Ce principe est aussi appelé principe de Dirichlet oupigeonhole principle.

Judicaël Courant - 2018-W12-2 3 Document sous licence Art Libre (http://artlibre.org)

(4)

Lycée La Martinière Monplaisir

Option Informatique MPSI DS 1

Question 19

En déduirej≤i+ 7.

Question 20

Écrire une fonction

liste_plus_proches_7, de type point list -> (point*point) list, prenant en argument une liste de points l = [p0;. . .;pn−1] et retournant une liste [(p0, p00);. . .; (pn−2, p0n−2)] telle que pour tout i∈[[0, n−1[[,p0i soit un plus proche voisin dep parmi [pi+1;. . .;pmin(n−1,i+7)]. On retournera la liste vide sin≤1.

Vous ferez en sorte que cette fonction soit de complexité linéaire en n et vous justifierez sa complexité.

Question 21

Écrire une fonctionplus_proches_7, de type point list -> (point * point), prenant en argument une liste de points l = [p0;. . .;pn−1] et retournant un couple (pi, pj) minimisantd(pi, pj)sous la contrainte i < j≤ i+ 7.

Vous ferez en sorte que cette fonction soit de complexité linéaire en n et vous justifierez sa complexité.

3.4 Résolution récursive Question 22

Donnez, en français, un algorithme récursif de recherche des plus proches voisins. Vous dé- taillerez en particulier les conditions d’arrêt et vous justifierez rigoureusement la correction et la terminaison de votre algorithme.

Question 23

Écrire une fonctionpp_voisins_rec, de type nuage -> point * point, prenant en argu- ment un nuage de points comportant au moins deux points et retournant les plus proches voi- sins.

On note T(n) le temps de calcul de pp_voisins_rec dans le cas le pire pour un nuage de points de taille n et on suppose par la suite queT est une fonction croissante.

Question 24

Montrer que pour toutn∈N, on a T(n)≤2T(dn/2e) + O

n→+∞(n)

Pour k∈N, on poseuk=T(2k).

Question 25

Montrer qu’on a nécessairement uk+1−2uk≤ O

k→+∞(2k)

Question 26

On pose vk = uk/2k, pour k ∈ N. Montrez qu’on a vk ≤ O

k→+∞(k) et en déduire uk =

k→+∞O (2k×k).

Question 27

En déduireT(n) = O

k→+∞(nlogn).

Question 28

Écrire une fonction pp_voisins, de type point list -> point * point, prenant en argument une liste de points tous distincts comportant au moins deux points et retour- nant les plus proches voisins. Pour cela, vous construirez un nuage de points à partir de la liste et utiliserez la fonctionpp_voisins_rec. Question 29

Quelle est, en fonction de la longueur n de la liste de points, la complexité de l’exécution de cette fonction ? Justifiez.

Question 30

Écrire une fonctionspp_voisins_extgénéra- lisant pp_voisins : elle doit avoir le même type que pp_voisins mais la liste de points qu’elle prend en argument peut éventuellement comporter des doublons. Lorsqu’un point est présent plusieurs fois, il est pris en compte une seule fois pour le calcul des plus proches voisins. Vous ferez en sorte que la complexité asymptotique reste la même que celle de pp_voisinset justifierez que c’est bien le cas.

Judicaël Courant - 2018-W12-2 4 Document sous licence Art Libre (http://artlibre.org)

Références

Documents relatifs

— Les notations restant les mêmes qu'au théorème VIII, si une même valeur de uy 1 '^ 1 ^ est la partie principale de plus d'une racine de f(x,y)==0, et de même pour u'y 1 ^, ...,

Paris, France et Camberley, Royaume-Uni – 24 février 2021 – Novacyt (ALTERNEXT : ALNOV ; AIM : NCYT), spécialiste mondial du diagnostic clinique, fait le point sur

–  Méthode K-NN (plus proche voisin) –  Arbres de décision. –  Réseaux de neurones –  Classification bayésienne

Les distributions correspondantes à un téta donné sont Fq et Gq.On utilise les échantillons pour estimer q par une q^ et on utilise alors les distributions Fq^ et Gq^ comme dans

When the number n of data points increases the nearest neighbor of X gets closer to X (this.. has to be made rigorous since X is a random variable).. This result was first proved

Application : model selection using

Over-fit : High complexity models are memorizing the data they have seen and are unable to generalize to unseen examples...

Tracer les droites où se trouvent tous les points situés à 3 cm de (d).. Hachurer la zone où l’usine peut