Balayage de Graham

Le balayage de Graham de est une méthode de calculer la coque convexe d'un ensemble donné de points dans l'avion avec le O ( n de la complexité de temps de de notation de n ). Il est baptisé du nom du Ronald Graham , qui a édité l'algorithme original en 1972. L'algorithme trouve tous les sommets de la coque convexe commandée le long de sa frontière. Il peut également être facilement modifié pour rapporter tous les points d'entrée qui se trouvent sur la frontière de leur coque convexe.

Algorithme

Complexité de temps

Le tri des points a la complexité O ( n de temps de notation de n ). Tandis qu'il peut sembler que la complexité de temps de la boucle est O ( n 2), parce que chaque point elle retourne pour vérifier le cas échéant des points précédents faire un " ; " tourne-à-droite ; , c'est réellement O ( n ), parce que chaque point est considéré seulement une fois. Chaque point a considéré ou termine la boucle intérieure, ou il est enlevé de la rangée et jamais pas considéré encore ainsi. La complexité globale de temps est donc O ( n de notation de n ), depuis l'époque d'assortir domine l'heure de calculer réellement la coque convexe.

Pseudo-code

Le résultat sera stocké sur la pile.

Pivot P de trouvaille ; Points de sorte par angle (avec des points avec l'angle égal encore assorti par la distance de P) ; # les points est le pivot Stack.push (points) ; Stack.push (points) ; POUR I = 3 à Points.length TANDIS QUE <= 0 de Cross_product (Stack.top, points) et >= 2 de Stack.pop ; ENDWHILE Stack.push (points) ; APRÈS i FONCTION Cross_product (p1, p2, p3) RETOURNER (p2.y) ; ENDFUNCTION

Note : il peut être nécessaire de vérifier si le dernier point s'est ajouté à la pile (pile. Le dessus) ne tombe pas à l'intérieur de la coque en la comparant au point next-to-last (pile. En second lieu) et au point au fond de la pile.

Note2 : pour traiter la caisse dégénérée de coques en résultant qui ont plus moins de trois points, seulement un point devrait être poussé sur la pile au début et si la pile a jamais plus moins de deux (il aura toujours au moins un) points là-dessus alors supérieur devraient également être sautés si le nouveau point est égal au il. En d'autres termes l'état de moment devrait être le >= 2 de Stack.length ? <= 0 de Cross_Product (Stack.top, points) : Points de == de Stack.

Random links:GEN | Luna (Etruria) | HMS Hecla (1815) | Saumons de bruit de Puget | Exploración_de_Graham