Vous êtes sur la page 1sur 3

Parcours de Graham

Le parcours de Graham est un algorithme pour le


calcul de l'enveloppe convexe d'un ensemble de points
dans le plan. Son principal intrt est sa complexit
algorithmique en O(n log n). Cet algorithme doit son
nom Ronald Graham, qui a publi l'algorithme
original en 1972 1.

Sommaire
1 Algorithme
2 Complexit algorithmique
3 Pseudo-code Construction itrative de l'enveloppe convexe d'un nuage
4 Notes et rfrences de points par l'algorithme de Graham. Cliquez pour
5 Voir aussi visualiser
5.1 Articles connexes
5.2 Liens externes

Algorithme
La premire tape de cet algorithme consiste rechercher le point de plus petite ordonne. S'il y a galit entre
un ou plusieurs points, l'algorithme choisit parmi eux le point de plus petite abscisse. Nommons P ce point. La
complexit en temps de cette tape est en O(n), n tant le nombre de points de l'ensemble.

L'ensemble des points (P compris) est ensuite tri en fonction de l'angle que chacun d'entre eux fait avec l'axe
des abscisses relativement P. N'importe quel algorithme de tri convient pour cela, par exemple le tri par tas
(qui a une complexit de O(n log n)). Pour cela, il n'est pas ncessaire de calculer l'angle rel ; on peut se
limiter la comparaison des tangentes, ou bien mme utiliser le produit en croix des coordonnes pour
connatre les positions relatives des points. l'issue de cette tape, on dispose d'un tableau T contenant les
points ainsi tris.

L'algorithme considre ensuite successivement les squences de trois points contigus dans le tableau T, vus
comme deux couples successifs. Pour chacune de ces paires de couples, il dcide si passer du premier couple au
second constitue un tournant gauche ou un tournant droite . Si c'est un tournant droite , cela
signifie que l'avant dernier point considr (le deuxime des trois) ne fait pas partie de l'enveloppe convexe, et
qu'il doit tre rejet de T. Cette analyse se rpte ensuite, tant que l'ensemble des trois derniers points est un
tournant droite . Ds que l'on rencontre un tournant gauche , l'algorithme passe au point suivant de T.
(Si l'on rencontre trois points aligns, quelque tape que ce soit, on peut choisir de conserver ou de rejeter le
point considr, au choix, suivant la dfinition que l'on choisit pour l'enveloppe convexe : en effet certaines
applications requirent que tous les points sur l'enveloppe soient compris dans l'enveloppe.)

Ici encore, dterminer si trois points constituent un tournant gauche ou un tournant droite ne requiert
pas de calculer l'angle rel entre les deux segments, et peut tre ralis par simple arithmtique. Pour trois
points (x1, y1), (x2, y2) et (x3, y3), il suffit de calculer le sens du produit vectoriel des deux vecteurs dfinis par
les points (x1, y1), (x2, y2) et (x1, y1), (x3, y3), donn par le signe de l'expression (x2 x1)(y3 y1) (y2 y1)
(x3 x1). Si le rsultat est nul, les points sont aligns. S'il est positif, les trois points constituent un tournant
gauche , dans le cas contraire c'est un tournant droite .
Ce processus retournera finalement au point auquel il a commenc, auquel cas
l'algorithme sera termin, et T contiendra alors les points formant l'enveloppe
convexe, dans l'ordre inverse des aiguilles d'une montre.

Complexit algorithmique
Le tri des points peut se faire avec une complexit en temps en O(n log n). La
complexit de la boucle principale peut sembler tre O(n2), parce que l'algorithme
revient en arrire chaque point pour valuer si l'un des points prcdents est un
tournant droite . Mais elle est en fait en O(n), parce que chaque point n'est
considr qu'une seule fois. Ainsi, chaque point analys ou bien termine la sous-
boucle, ou bien est retir de T et n'est donc plus jamais considr. La complexit
globale de l'algorithme est donc en O(n log n), puisque la complexit du tri domine
la complexit du calcul effectif de l'enveloppe convexe.

Pseudo-code
Soit Points l'ensemble de points examiner, sous la forme d'un tableau index
partir de un, et Pile une pile qui contiendra le rsultat final.

fonction parcours de graham(Points[1,.., n])


trouver le pivot P;
trier le tableau Points par angle croissant par rapport P
(les points d'angle gal seront tris par abscisse croissante);

# Points[1] est le pivot Illustration : Comme on


Pile.empiler(Points[1]);
Pile.empiler(Points[2]); peut le voir, passer de
pour i = 3 n A B ou de B C se fait
tant que (Pile.hauteur >= 2) et (Points[i] gauche du segment [Pile.second Pile.sommet])
Pile.dpiler; dans le sens oppos aux
Pile.empiler(Points[i]); aiguilles d'une montre,
mais ce n'est pas le cas
o Pile.second renvoie le sommet juste avant Pile.haut. pour passer de C D.
L'algorithme dtecte cette
Pour tester qu'un point A est gauche d'une segment [BC], on vrifie que le situation et rejette les
produit vectoriel est ngatif, c'est--dire on vrifie que ProduitVectoriel(A, B, C) segments prcdemment
0 o ProduitVectoriel est dfini par choisis jusqu' ce que le
tournant pris soit dans le
fonction Produit_vectoriel(A, B, C) sens oppos aux aiguilles
retourner (B.x - A.x)*(C.y - A.y) - (C.x - A.x)*(B.y - A.y); d'une montre (B D dans
ce cas).
Note: pour grer les cas dgnrs o l'enveloppe convexe a moins de trois points,
un seul point devrait tre entr dans la pile au dpart, et si jamais la pile a moins de deux points (elle en aura au
moins toujours un), alors le haut de la pile devrait tre galement sorti si le nouveau point est le point
considr. En d'autres termes, la condition du tant que devrait tre comme suit.

Pile.hauteur >= 2 ? Produit_vectoriel(Pile.second, Pile.haut, Points[i]) 0 : Pile.haut == Points[i]

Notes et rfrences
(en) Cet article est partiellement ou en totalit issu de larticle de Wikipdia en anglais intitul Graham
scan (voir la liste des auteurs).
1. (en) R. L. Graham, An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set ' (http://www.science
direct.com/science?_ob=IssueURL&_tockey=%23T OC%235645%231972%23999989995% 23299179%23FLP%23&_a
uth=y&view=c&_acct=C000050221&_version=1&_urlV ersion=0&_userid=10&md5=5d48 61b6aa0cc6f286e142e7d22
047c1), Information Processing Letters 1, 1972, p. 132-133 .

Voir aussi
Articles connexes

Marche de Jarvis
Algorithme de Chan

Liens externes

(en) Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction to
Algorithms, MIT Press et McGraw-Hill, 2001, 2e d. [dtail de ldition]. Pages 949955 de la section 33.3:
Finding the convex hull.
(en) Implmentations du parcours de Graham en C++ et en Pascal Objet.
[PDF] Prsentation d'algorithmes pour calculer l'envelopper convexe d'un nuage de points

Ce document provient de https://fr.wikipedia.org/w/index.php?


title=Parcours_de_Graham&oldid=135205061 .

Cette page a t modifie pour la dernire fois le 7 mars 2017 19:34.


Droit d'auteur : les textes sont disponibles sous licence Creative Commons attribution, partage dans les mmes
conditions ; dautres conditions peuvent sappliquer. Voyez les conditions dutilisation pour plus de dtails,
ainsi que les crdits graphiques. En cas de rutilisation des textes de cette page, voyez comment citer les
auteurs et mentionner la licence.
Wikipedia est une marque dpose de la Wikimedia Foundation, Inc., organisation de bienfaisance rgie par
le paragraphe 501(c)(3) du code fiscal des tats-Unis.