- 1
- 0
- 约小于1千字
- 约 1页
- 2026-05-18 发布于北京
- 举报
【算法分析】
的凸包。
所谓凸包(这里说的是平面点集的凸包),就是一个最小的凸多边形,把所有给定点包
含在内。显然,凸包一定是由给定的点中的某一些点构成。
下面介绍一种快速而且简便的凸包算法——GrahamScan。
预处理要对所有点进行排序。找出一个最左边的点,如果有多个再找最下边的。然后
以这个点为准对其他所有点按照逆时针顺序排序(其实顺时针也可以,但是大多数人的习惯
是逆时针),这里要用到向量叉积。
算法很简单:
先开一个栈,分别放入第1、2、3个点(这三个点显然都在凸包中)。然后从第4个点
开始枚举。如果栈顶元素指向当前点的有向线段与栈顶下方元素指向栈顶的有向线段构成右
手系(就是说往右转啦,这里又要用到叉积),则栈顶元素出栈,重复以上过程直到这两个
线段构成左手系,把当前点放入栈顶。这样到第n个点枚举完后,栈中的元素就构成了一个
凸包,而且还是有序的。由于每个点最多入栈和出栈各一次,所以这个算法的时间复杂度是
O(n)。加上先前排序的O(nlogn),总的时间复杂度就是O(nlogn)。
GrahamScan的伪代码:
Proceduregraham;
Var
I:integer;
原创力文档

文档评论(0)