• Aucun résultat trouvé

5.2 Trouver la paire de points les plus proches

5.2.2 Principe de l’algorithme

Formellement, le problème s’énonce ainsi.

La paire de points les plus proches

Instance: Un ensembleP ⊂R2 denpoints du plan,n>2.

Question: Trouver deux points distinctsp, p0P telle que dist(p, p0) est minimum.

Ici dist(p, p0) représente la distance euclidienne entre les pointspetp0 du plan. On étend cette notation aux ensembles, dist(p, Q) = minqQdist(p, q) représentant la dis-tance entre un pointpet un ensemble de pointsQ.

Diviser. L’idée est de partitionner les points deP et deux sous-ensembles, AetB. Si (p, p0) est la paire recherchée, alors clairement soit :

• (p, p0)∈A2; ou bien

• (p, p0)∈B2; ou bien

• (p, p0)∈A×B.

Par symétrie de dist(p, p0), le cas (p, p0)∈B×An’a pas a être considéré.

On calcule alors récursivement dA = min(a,a0)A2dist(a, a0) et dB = min(b,b0)B2dist(b, b0), les distances minimum entres les paires de points de A2 et B2. Reste ensuite à calculer dAB, la distance minimum pour les paires deA×B, afin de combiner le tout et d’obtenir la distance désirée (en fait la paire de points), distance qui vaut min{dA, dB, dAB}. Le calcul dedAB est la partie difficile.

De prime abord, il semble que le calcul préliminaire dedAetdB n’aide pas vraiment pour le calcul dedAB. En effet, le nombre de couples (p, p0)∈A×Best9 |A| · |B|=Ω(n2) dans le cas équilibré où |A| = |B|. On a donc pas forcément avancé pour le calcul de dAB, sinon, et c’est le point crucial, qu’on connaît la distance minimale à battre, soit min{dA, dB}. C’est le petit détail qui va tout changer.

Plus en détails. Dans la suite on notera δ = min{dA, dB} la plus petite des distances entres les paires deA2 et B2. Pour tout sous-ensemble QP, on noteraQx (resp. Qy) la liste des points de Q ordonnée par abscisses x (resp. ordonnées y) croissant. On se servira du fait qu’une fois la listePx calculée, on peut calculer la listeQx par un simple parcours dePxen tempsO(|Px|) et du test d’appartenance àQ.IdempourQyà partir de Py.

9. On rappelle que|A|représente la cardinalité de l’ensembleA, soit son nombre d’éléments.

5.2. TROUVER LA PAIRE DE POINTS LES PLUS PROCHES 169 On supposera queP ne contient pas deux points avec la même abscisse. On peut s’en passer, mais cela complique la présentation et l’analyse de l’algorithme. Si jamais c’est le cas, on peut toujours effectuer une légère10rotation des points pour se ramener à ce cas. La rotation ne change pas, en principe, la distance recherchée. Mais cela reste « en principe ». Le mieux est d’adapter correctement l’algorithme sans toucher au points.

Soitp le point de rangdn/2edansPx. C’est l’élémentmédiande la liste ordonnéePx: il y a autant d’éléments avant qu’après (à un près). On définit alorsAcomme l’ensemble des points de rang inférieur ou égale à celui depdansPx, etBl’ensemble des points de rang strictement supérieur à celui dep. Notons que|A|=dn/2eet queB=bn/2c.

Enfin, on poseLla ligne verticale passant parp etSl’ensemble des points deP qui sont à distance moins deδde la ligne médianeL. Voir la figure5.2.

Dit autrement :

A = {(x, y)∈P :x6x} B = {(x, y)∈P :x > x} L = {(x, y) :y∈R}

S = {(x, y)∈P :|xx|< δ} .

Notons queLne peut pas contenir de point deB. D’après la définition,Lne passe que par un seul point deP,p, qui tombe dansA. Si plusieurs points deP avaient la même abscisse, cela ne serait plus garanti.

L’algorithme repose sur les deux propriétés suivantes.

Propriété 5.1 S’il existe(a, b)∈A×Btels quedist(a, b)< δ, alorsa, bS.

Preuve.Sia<S, alors dist(a, b)>dist(a, B)>dist(a, L)>δ : contradiction. De même, si b<S, alors dist(a, b)>dist(b, A)>dist(b, L)>δ : contradiction. Conclusion :aetbsont

tous des deux dansS. 2

Cette propriété seule n’aide pas beaucoup. Certes, pour calculerdAB on peut se res-treindre aux seules paires deS2. Malheureusement, il est parfaitement possible queS contienne tous les points deP, si bien que le calcul de dAB peut se révéler aussi diffi-cile que le problème initial. [Exercice. Construire un exemple générique den points où S=P.]

La propriété suivante va nous aider à calculer la paire de points les plus proches de S en tempsO(|S|) au lieu deO(|S|2) comme l’approche naïve.

10. La rotation « légère » exacte dépend en fait de la distance minimum entre deux points... On peut alors s’en sortir avec une rotation aléatoire, et recommencer tant que cela échoue.

170 CHAPITRE 5. DIVISER POUR RÉGNER

p a

a0

b

b0

A B

P S

x

y δ L δ

x

Figure5.2 – Découpage deP en AetBselon le point médian p. Les paires (a, a0) et (b, b0) sont les paires de points les plus proches dans A et dans B [exemple presque réaliste].

Propriété 5.2 S’il existe(s, s0)∈S2tel quedist(s, s0)< δ, alorssets0sont éloignés d’au plus7 positions dansSy. En particulier, la paire de points deSy les plus proches peut-être calculée en tempsO(|Sy|).

SiSy= (s0, . . . , si, . . . , sj, . . . , sk1) et que les deux points les plus proches (si, sj) vérifient dist(si, sj)< δ, alorsji 67. Les deux points les plus proches de S peuvent donc être trouvés, s’ils sont à distance< δ, avec deux boucles comme celles-ci :

for(i=0; i<k; i++)

for(j=i+1; j<=i+7 && j<k; j++){

d=dist(S_y[i],S_y[j]);

if(d<d_min) d_min=d, i_min=i, j_min=j;

}

Notez bien que les points situés après si dans Sy ne sont pas rangés suivant leur distance àsi. Il est tout a fait possible d’avoir dist(si, si+7)< δ 6dist(si, si+1).[Exercice.

Construire un tel exemple.]Par contre il est certain que dist(si, si+8)>δ de même que pour chaquesj dès quej > i+ 7.[Question. Que doit valoird_minsiSyne contient pas au moins deux points ?]

Ce code s’exécute clairement en temps O(|Sy|) = O(k), ce qui en pas-sant est optimal. [Question. Pourquoi est-ce optimal ?]. On pourra préférer

5.2. TROUVER LA PAIRE DE POINTS LES PLUS PROCHES 171 j<k && S_y[j].y-S_y[i].y<d_min dans le test de la 2e boucle. À première vue, c’est plus difficile à analyser, mais cette variante est plus efficace11.[Exercice. Montrez que ce test est correct et plus efficace.]On peut également supprimerktestsi<kdans la 1ère boucle car ils sont capturés par le testj<k de la 2e boucle. Il faut cependant rémanier le code.

[Exercice. Évrivez le code avec le nombre optimisé de tests.]

Preuve.Comme dist(si, sj) = dist(sj, si), on va supposer sans perte de généralité quei < j et donc si est en dessous de sj. Pour tout k ∈ {0,1,2}, on pose Hk la ligne horizontale d’ordonnée y(si) +k·δ/2 où y(si) est l’ordonnée de si. Donc H0 est la ligne horizontale passant parsi (voir la figure5.3).

On va quadriller la partie du plan contenantS et au dessus deH0 en boîtes carrées de cotéδ/2 de sorte queH0 etLcoïncident avec des bords de boîtes. Il ne faut pas queL coupe l’intérieur d’une boîte (voir la figure5.3).

p

Figure 5.3 – Quadrillage de S en 8 boîtes de cotés δ/2 pour si. Certaines boîtes pourraient être vides.

L’observation importante est que chaque boîte contient au plus un point de P. En effet, la distance la plus grande réalisable par deux points d’une même boîte a pour longueur la diagonale d’un carré de cotéδ/2, soit

s

11. On peut encore légèrement accélerer le test en posantdy=d_min+S_y[i].ydans l’initialisation de la 2e boucle. Du coup le test devientj<k && S_y[j].y<dy. Il faut aussi mettre à jourdydans leif.

172 CHAPITRE 5. DIVISER POUR RÉGNER Donc si deux pointsp, p0sont dans une même boîte, ils sont à distance dist(p, p0)< δ. Or, cette boîte est incluse dansA ou dansB,L ne coupant l’intérieur d’aucune boîte. Ceci implique que leur distance doit être au moins min{dA, dB}=δ : contradiction.

D’après cette propriété, la zone du plan comprise entreH0 etH2dans Scontient au plus 8 points (incluant si) puisqu’elle ne comprend que 8 boîtes. En particulier si+8ne peut pas être compris entre H0 etH2 car {si, si+1, . . . , si+8} contient 9 points. Il suit que dist(si, si+8)>dist(H0, H2)>δ. Donc si dist(si, sj)< δ, on doit avoirj < i+ 8, soitji67.

2

Parenthèse.En plaçant les points aux quatre coins des deux carrés de cotéδ situés dansS et entreH0et H1, on peut bien évidemment en mettre8au total, montrant que la propo-sition à l’air optimale. Mais dans ce cas, la ligneLcontiendrait plusieurs points d’abscisses identiques (et même confondus). Sans points confondus, il ne peut entre qu’avoir au plus6 points dansS et entreH0etH1. Dit autrement, en réalité,dist(si, sj)>δdès quej > i+ 6.

La propriété5.2n’est donc pas optimale. De manière intéressante, le code pour trouver cette paire, lui, dans sa version efficace, ne tient plus compte de la borne donnée par la propriété. Que le nombre de points maximum possibles soit 8, 7 ou 6, la version efficace balayera le nombre optimal de points aprèssi. La propriété 5.2 donne juste un majorant permettant de conclure que le temps de recherche est enO(k).

[Cyril. À REVOIR.]En effet, soientA, B, C, D les 4 points placés dans un carré de coté δ, dans l’ordre des points en tournant autour du carré. Peuvent-ils être à distance mutuelle

>δsans être placés sur exactement sur les coins du carré ? Si l’on prend les deux disques de centreAetC et de rayonδ, alors les points en dehors de deux cercles seront à une distance

> δsiAC est<

2. Le seul moyen de pouvoir placer les pointsB, D à une distance6δ deAetC, c’est d’avoirAC>

2ce qui impose d’avoirACsur les coins diagonaux du carré, et doncBDaussi. Dit autrement, si les quatre points ne sont pas sur les quatre coins du carré, alors seuls 3 points à distance mutuelle au moinsδpeut être dans ce carré.

En passant, le plus grand triangle équilatéral qu’on peut placer dans un carré de cotéδ consiste à placer un sommet du triangle dans un coin du carré puis de partir vers un coté du carré selon un angle de15degré (soitπ/12), et idem pour l’autre coté du triangle[Cyril.

Faire un dessin]. Il en résulte une longueur de coté pour ce triangle de` > δcar vérifiant

`cos (π/12) =δ, ce qui implique`=δ/cos (π/12) =δ·4/(

√ 6+

2)≈1.035δ. On peut aussi s’arranger pour avoir deux tels triangles dans deux carrés côte-à-côte sans points confondus.

5.2. TROUVER LA PAIRE DE POINTS LES PLUS PROCHES 173