Recherche des deux points les plus rapprochés
En géométrie algorithmique, la recherche des deux points les plus rapprochés est le problème qui consiste à trouver une paire de points d'un ensemble fini de points dans un espace métrique dont la distance est minimale. Il fait partie des problèmes fondateurs de la géométrie algorithmique[1].
Algorithmes en dimension 2
[modifier | modifier le code]Algorithme naïf
[modifier | modifier le code]En notant le nombre de points, l'algorithme naïf par recherche exhaustive a une complexité en temps en . Il y a en effet paires différentes à tester.
Algorithme quasi linéaire
[modifier | modifier le code]Il existe un algorithme basé sur diviser pour régner en [2].
Description générale
[modifier | modifier le code]L'algorithme se déroule en plusieurs étapes[3]:
- Préliminaire : créer deux tableaux et contenant les points à étudier. Trier et respectivement par abscisses croissantes et par ordonnées croissantes.
- Diviser : Si , trouver une droite verticale qui sépare l'ensemble de points en deux sous-ensembles tels que celui de gauche compte points et celui de droite . Sinon faire une recherche exhaustive.
- Régner : Résoudre récursivement les deux sous-problèmes obtenus, et récupérer le minimum des deux solutions.
- Combiner : Comparer le minimum obtenu dans la résolution des deux sous-problèmes, ainsi que le minimum obtenu pour des paires dont chaque extrémité est issue d'un sous-problème distinct. C'est l'étape qui nécessite le plus d'instructions.
Détail de l'étape de combinaison
[modifier | modifier le code]La résolution des deux sous-problèmes permet de déterminer que si la paire de points les plus proches a une extrémité de chaque côté de la droite de partition, alors la distance qui les sépare est inférieure à . Il suffit donc de s'intéresser à la bande verticale de largeur centrée en la droite de partition. On procède comme suit[3]:
- Créer un tableau ne contenant que les points de compris dans la bande considérée triés selon les ordonnées croissantes.
- Pour chaque point de la bande, calculer la distance qui sépare aux 7 points qui le suivent dans le tableau et noter le minimum de toutes les distances obtenues.
- Si renvoyer sinon renvoyer .
Preuve de validité de l'algorithme
[modifier | modifier le code]La terminaison de l'algorithme est assurée par le fait que l'on a choisi pour limite de récursivité , ce qui assure qu'aucun appel récursif n'est lancé sur un seul point[3].
Le point le plus important à vérifier pour établir la correction de l'algorithme est le fait que dans l'étape de combinaison des résultats des sous-problèmes, il suffit de calculer la distance entre chaque point et les sept suivants dans pour trouver une éventuelle paire de points séparés d'une distance inférieure à [3]. On suppose qu'il existe pour l'un des sous-problèmes récursifs une paire de points et séparés d'une distance inférieure à (où est le minimum des distances trouvées dans et séparément). et sont tous deux compris dans un même rectangle centré sur la droite de partition, de longueur et de hauteur .
On cherche à savoir combien de points au maximum peuvent se trouver dans ce rectangle, sachant que deux points situés du même côté de la droite de partition sont distants d'au moins . La réponse est 8 : un à chaque coin, et un couple de points superposés situé à chacun des milieux des grands côtés du rectangle[3]. Cet argument repose sur l'intuition géométrique et n'est pas adapté à une formalisation rigoureuse, mais peut être remplacé par une utilisation du principe des tiroirs qui donne la même borne de manière rigoureuse[4]. Par conséquent au plus 7 autres points de la bande ont une ordonnée supérieure de moins de à l'ordonnée du point . On peut donc trouver en calculant au plus 7 distances depuis . On peut donc trouver une paire minimale si elle existe au sein de la bande en calculant pour chacun de ses points les distances qui le séparent des 7 points qui le suivent dans [3].
La validité du reste de l'algorithme ne nécessite pas de preuve détaillée[3], celle-ci a néanmoins été vérifiée formellement dans son intégralité à l'aide de l'assistant de preuve Isabelle[4].
Analyse de complexité
[modifier | modifier le code]On commence par regarder la complexité des différentes étapes de l'algorithme :
- L'étape préliminaire de tri a une complexité (en utilisant par exemple le tri fusion) et n'est exécutée que deux fois.
- La partition de l'ensemble de points par une droite verticale nécessite le parcours des premières valeurs de , c'est-à-dire opérations.
- À chaque appel récursif, partage les tableaux et en deux sous-tableaux ne contenant que les points des sous-ensembles considérés. Cette découpe peut être effectuée avec une complexité à chaque fois[3].
- L'étape de combinaison des résultats effectue au plus calculs de distance et a donc une complexité [3].
La complexité de l'algorithme vérifie donc la relation de récurrence . Par conséquent l'arbre des appels récursifs de l'algorithme est un arbre binaire qui comporte étages, et chaque étage a une complexité . Ainsi, par le master theorem, l'algorithme est en [3].
Minoration de la complexité
[modifier | modifier le code]On sait aussi que tout algorithme nécessite Ω(n log n) étapes de calcul pour trouver deux points les plus rapprochés[2].
Optimisation sous certaines hypothèses
[modifier | modifier le code]Si on suppose que la fonction partie entière est calculable en temps constant, alors le problème se résout en O(n log log n)[5]. Si on s'autorise des algorithmes probabilistes (et la fonction partie entière calculable en temps constant), alors le problème se résout en O(n) en espérance[6],[7].
Algorithme en dimension supérieure
[modifier | modifier le code]L'algorithme diviser pour régner se généralise à toute dimension d, avec une complexité de O(n log n) à dimension fixée, mais avec une dépendance exponentielle en la dimension[8].
Applications
[modifier | modifier le code]Ce problème de recherche est utilisé par les contrôleurs aériens pour repérer les avions les plus proches les uns des autres (l'espace considéré est ici à 3 dimensions), et ainsi prévenir le risque de collision[3].
Histoire
[modifier | modifier le code]L'algorithme de Michael O. Rabin pour ce problème est l'un des premiers algorithmes géométriques probabilistes[9].
Notes et références
[modifier | modifier le code]Notes
[modifier | modifier le code]références
[modifier | modifier le code]- (en) M. I. Shamos et D. Hoey, « Closest-point problems », , 16th Annual Symposium on Foundations of Computer Science, 1975, , p. 151–162 (DOI 10.1109/SFCS.1975.8, lire en ligne, consulté le )
- (en) « Computational Geometry - An Introduction | Franco P. Preparata | Springer », sur www.springer.com (consulté le )
- Thomas H. Cormen, Charles E. Leiserson et Ronald L. Rivest, Introduction à l'algorithmique, Paris, Dunod, , xxix 1146 (ISBN 978-2-10-003922-7, SUDOC 068254024), « Géométrie algorithmique »
- (en) Martin Rau et Tobias Nipkow, « Verification of Closest Pair of Points Algorithms », Lecture Notes in Computer Science (en), (lire en ligne), disponible en accès libre.
- (en) S. Fortune and J.E. Hopcroft. "A note on Rabin's nearest-neighbor algorithm." Information Processing Letters, 8(1), pp. 20—23, 1979
- (en) S. Khuller and Y. Matias. A simple randomized sieve algorithm for the closest-pair problem. Inf. Comput., 118(1):34—37,1995
- (en) Richard Lipton, « Rabin Flips a Coin »,
- (en) Subhash Suri, « Closest Pair Problem », UC Santa Barbara
- (en) Rajeev Motwani et Prabhakar Raghavan, Randomized Algorithms, Cambridge, New York et Melbourne, Cambridge University Press, (réimpr. 1997, 2000), 1re éd., 476 p. (ISBN 978-0-521-47465-8, lire en ligne), chap. 9, p. 273