Algorithme de Preparata-Hong
L'algorithme de Preparata-Hong est une mĂ©thode algorithmique pour calculer l'enveloppe convexe d'un ensemble fini de points dans l'espace euclidien de dimension 2 (le plan) ou de dimension 3 (lâespace). L'algorithme prĂ©sente une stratĂ©gie utilisant le paradigme "diviser pour rĂ©gner". Cet article prĂ©sente uniquement le cas de la dimension 2.
Description du problĂšme
On considÚre un ensemble fini de points. On suppose sans perte de généralité que tous les points ont toutes leurs coordonnées différentes. On cherche à trouver les sommets de son polygone convexe.
Principe en dimension 2
On commence par ranger les points de dans l'ordre croissant selon la derniÚre (i.e. deuxiÚme) coordonnée. Notons le cardinal de . Soit l'ensemble aprÚs le tri.
Cas de base
Le cas de base dans lâalgorithme diviser pour rĂ©gner survient lorsquâil y a 1, 2 ou 3 points. Dans ce cas, le calcul de lâenveloppe convexe est facile Ă calculer : il s'agit d'un point, d'un segment pour 2 points, d'un segment ou un triangle pour 3 points.
Cas récursif
Sâil y a plus de 3 points, on commence par sĂ©parer lâensemble des points en deux parties infĂ©rieure et supĂ©rieure de mĂȘme cardinal Ă un point prĂšs, et on calcule leur enveloppe convexe respective par la stratĂ©gie diviser pour rĂ©gner. On note et deux ensembles qui forment une partition de (on a pris pour la moitiĂ© plus Ă©ventuellement un des points de qui sont le plus "en bas" et le complĂ©mentaire de dans , c'est-Ă -dire la moitiĂ© moins Ă©ventuellement un des points de qui sont le plus "en haut"). On appelle enveloppe convexe infĂ©rieur l'enveloppe convexe de et enveloppe convexe supĂ©rieur l'enveloppe convexe de .
Ensuite, on vise Ă reconstruire lâenveloppe convexe globale Ă partir de ces enveloppes convexes infĂ©rieure et supĂ©rieure, en les reliant Ă la fois Ă gauche et Ă droite de la figure, par lâalgorithme de fusion. Ă droite de la figure, on cherche Ă relier deux points provenant des parties infĂ©rieure et supĂ©rieure, en faisant en sorte que tous les points dans les deux parties soient Ă gauche de la droite tracĂ©e.
- Les enveloppes convexes supérieure et inférieure à fusionner.
- Jointure des enveloppes convexes.
- L'enveloppe convexe finale fusionnée.
On applique pour cela lâalgorithme suivant (on appelle et les parties infĂ©rieure et supĂ©rieure respectivement) :
- On part des points les plus Ă droite de chaque partie, pour et pour ,
- On cherche dans tel que la pente de soit supérieure à la pente de ,
- On cherche dans tel que la pente de soit inférieure à la pente de ,
- On itĂšre jusquâĂ rencontrer un blocage.
Ă la fin de cet algorithme, on relie les deux points dans et que lâon a trouvĂ©s. On rĂ©alise la mĂȘme opĂ©ration Ă gauche de et , en adaptant lâalgorithme ci-dessus, et on retire les arĂȘtes superflues dans le nouveau polygone.
Algorithme de fusion dans le cas de la dimension 2
C'est l'algorithme que l'on va utiliser pour fusionner les enveloppes convexes supérieur et inférieur.
Soient et deux polygones convexes du plan euclidien.
Soient des entiers strictement positifs, représentant respectivement le nombre de sommets de et de . Soient et les sommets en question. On suppose que les ordonnées des points du premier ensemble sont toutes strictement inférieures à celles des points du second ensemble. On suppose que dans la réunion de ces deux ensembles, les abscisses et les ordonnées sont distinctes deux-à -deux. Supposons aussi que dans chaque ensemble, on range les sommets dans le sens horaire de leur parcours sur le polygone à partir du sommet le plus "à droite" (celui d'abscisse la plus grande, il est représenté sur les figures ci-contre respectivement pour A et B par et ). à l'aide de l'algorithme précédent, on cherche à calculer l'enveloppe convexe de la réunion de ces deux ensembles de points, qu'on va noter , à partir de et . Pour des raisons pratiques, on pourra raisonner sur les indices des sommets de et respectivement modulo et modulo . Nous allons considérer que (le cas se traite de maniÚre analogue, en ce qui concerne à la fois le pseudo-code et la correction).
Pour et , on note la pente de la droite . Pour on note la pente de la droite et pour on note la pente de la droite . On note et respectivement les indices du sommet de le plus "Ă gauche" (celui d'abscisse la plus petite) et du sommet de le plus "Ă gauche" (celui d'abscisse la plus petite).
Le but de l'algorithme qui va suivre est de trouver la tangente droite de . Voici le pseudo-code de l'algorithme, on notera et respectivement l'abscisse et l'ordonnĂ©e de oĂč est un point du plan euclidien, et on suppose que les coordonnĂ©es des sommets de et et que les valeurs pour et pour sont stockĂ©es dans des tableaux (accessibles Ă coĂ»t constant) :
Soient
On Ă©crit
Si et faire et recommencer Ă partir de
Si et faire et recommencer Ă partir de
Renvoyer le couple
Il est facile de voir que l'algorithme termine car on incrĂ©mente et de 1 si on doit recommencer Ă partir de la deuxiĂšme ligne de pseudo-code et dans le cas marginal oĂč et on passe directement Ă la derniĂšre ligne de pseudo-code. De lĂ , on remarque aussi que la complexitĂ© de l'algorithme est en , et donc en .
Correction de l'algorithme
Rechercher la tangente droite consiste à trouver les indices dans et dans telles que les points et soient ses extrémités. On se restreint au cas et .
Notons déjà quelques résultats qui s'obtiennent grùce à la convexité de et :
- la suite est décroissante (voir la concaténation des segments associés comme une fonction convexe)
- la suite est décroissante (voir également la concaténation des segments associés comme une fonction convexe)
Ainsi, on peut caractériser géométriquement la pente de la tangente droite (de façon qu'elle constitue bien un cÎté de l'enveloppe convexe issu de la fusion de et ) par :
- si , alors ;
- si , alors ;
- si , alors ;
- si , alors .
Il reste alors à montrer que l'algorithme renvoie bien ce que l'on souhaite, c'est-à -dire les indices dans et dans vérifiant la caractérisation ci-dessus.
On sait que l'algorithme s'arrĂȘte quand on a les deux conditions et . Pour ĂȘtre sĂ»r que et , il faut s'assurer que l'on a l'intĂ©gralitĂ© de la caractĂ©risation prĂ©cĂ©dente. Pour cela, on distingue trois cas :
- soit on a , auquel cas on a directement la caractérisation, l'algorithme renvoie bien ce que l'on souhaite ;
- soit on a auquel cas soit la ligne 3 soit la ligne 4 n'est jamais exécutée, on peut alors montrer facilement que l'on a caractérisation en se penchant sur la seule ligne itérée ;
- soit il y a déjà eu une itération de la ligne 3 et la ligne 4 de pseudo-code, on distingue alors deux sous-cas :
l'indice est le dernier indice auquel on a fait une incrĂ©mentation, auquel cas on avait juste avant l'incrĂ©mentation, on a aussi (regarder le triangle sur la figure ci-contre) et par succession d'inĂ©galitĂ©s des pentes sur la chaĂźne , on rĂ©itĂšre l'inĂ©galitĂ© pour remonter Ă juste aprĂšs la derniĂšre incrĂ©mentation de l'indice (qui existe par hypothĂšse) et l'indice correspondant vĂ©rifie (car l'incrĂ©mentation de indique de et donc la chaĂźne est concave), par la chaĂźne d'inĂ©galitĂ© on a bien , de mĂȘme (par inĂ©galitĂ© des pentes sur la fonction convexe issue de la chaĂźne ) cela donne : en incrĂ©mentant (de 1), on a finalement les conditions et ;
l'indice est le dernier indice auquel on a fait une incrĂ©mentation, juste avant cette incrĂ©mentation on a . De mĂȘme on ne peut pas avoir , sinon on a la chaĂźne qui est concave, ce qui entraĂźne (inĂ©galitĂ© des pentes) et comme la chaĂźne est concave par hypothĂšse, on obtient et donc que la chaine est concave , ce qui veut dire que ; si on revient sur le pseudo-code, si juste avant la derniĂšre incrĂ©mentation de on avait une incrĂ©mentation de , alors on aurait eu d'aprĂšs la troisiĂšme ligne de pseudo-code que , ce qui est impossible ; donc comme il est supposĂ© qu'on a incrĂ©mentĂ© au moins une fois, juste avant la derniĂšre incrĂ©mentation de , on a encore une autre incrĂ©mentation de avec ; il s'obtient alors par rĂ©currence qu'on ne va jamais atteindre dans l'exĂ©cution de l'algorithme : contradiction. On a alors la premiĂšre inĂ©galitĂ© . Aussi, comme la chaĂźne est concave par hypothĂšse, on obtient directement . Donc, en incrĂ©mentant (de 1), on a bien les conditions et .
Ceci termine la preuve de la correction de l'algorithme.
ComplexitĂ© temporelle de lâalgorithme
On suppose que pour un ensemble initial de points du plan, cet algorithme de fusion est exécuté en temps . Ainsi, en notant la complexité temporelle associée au calcul de l'enveloppe convexe de points du plan euclidien, stockés dans un tableau et triés par avance dans l'ordre croissant selon une coordonnée, on a la relation de récurrence suivante :
Par le master theorem ou par une analyse Ă la main, on conclut que est en . Comme le tri d'un tableau (par exemple par tri fusion) peut ĂȘtre rĂ©alisĂ© en temps , la complexitĂ© totale de l'algorithme est elle aussi en .
Une autre approche du problĂšme
Il existe une autre façon de calculer l'enveloppe convexe de en calculant deux convexes non bornés dont l'intersection des deux donne l'enveloppe convexe final, en déterminant pour chacun de ces convexes l'ensemble des segments et demi-droites qui les délimitent. Il s'agit d'une méthode proposée par F. Preparata et M. Shamos.
Liens externes
- Calcul d'enveloppe convexe - Gestion dynamique d'une enveloppe convexe (enseignement de l'informatique Ă l'Ă©cole Polytechnique de France)
- Fonctions convexes : inégalité des pentes
Sources
- Article original de Preparata et Hong - Convex Hulls of Finite Sets of Points in Two and Three Dimensions[1]
- Calcul de complexité : le Master theorem - Algorithms[2] (Sanjoy Dasgupta, Christos H. Papadimitriou, Umesh V. Vazirani) ; Introduction to algorithms[3] (Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein)
- Calcul d'enveloppe convexe - Gestion dynamique d'une enveloppe convexe[4] (enseignement de l'informatique Ă l'Ă©cole Polytechnique de France)
Notes et références
- (en) F. P. Preparata ; S. J. Hong, « Convex Hulls of Finite Sets of Points in Two and Three Dimensions »,
- (en) Sanjoy Dasgupta, Christos H. Papadimitriou, Umesh V. Vazirani, Algorithms, McGraw-Hill,
- (en) Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, Introduction to algorithms, MIT press,
- Jean Berstel, « Gestion dynamique d'une enveloppe convexe »