graham scan算法 原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Graham Scan算法
一、概述
Graham Scan算法是一种用于计算凸包的算法,它可以在给定二维平面上的一组点时,找到这些点形成的凸包。
凸包是包围点集的最小凸多边形,它的边界上的点不弯曲向内。
二、算法原理
Graham Scan算法采用了一种基于极角排序的方法来求解凸包,其基本思路如下:
1.找到y坐标最小的点P0,将P0作为凸包的起点。
2.将其他点按照与P0的极角进行逆时针排序。
3.遍历排序后的点集,如果凸包的点个数小于2,或者遍历点与前两个点的构
成的两条线段的转向(顺时针或逆时针)满足逆时针,则将遍历点添加到凸包中;否则,将凸包的最后一个点移除,再添加遍历点。
4.最终的凸包即为所有添加后剩下的点集。
三、算法实现步骤
下面将详细介绍Graham Scan算法的实现步骤:
1. 寻找起点
先确定凸包的起点,即y坐标最小的点P0。
可以通过比较每个点的y坐标找到最小的那个点。
如果有多个点的y坐标相等,选择其中x坐标最小的点。
2. 极角排序
对于起点P0之外的其他点,计算它们与P0的极角,并按照极角进行逆时针排序。
计算极角时,可以使用两点之间的斜率来表示,斜率越大则两点之间的角度越小。
3. 构建凸包
从排好序的点集中依次取出每个点Pi,将其添加到凸包中。
首先,检查凸包中的点个数是否小于2。
当凸包中的点个数小于2时,直接将Pi 添加到凸包中。
然后,检查凸包中的最后两个点Pi-1和Pi-2构成的线段的转向。
当这两个点以及Pi构成的三个点满足逆时针时,将Pi添加到凸包中。
反之,将凸包中的最后一个点移除,再将Pi添加到凸包中。
4. 输出凸包
最终,凸包中包含了输入点集形成的凸多边形。
遍历凸包中的点,按顺序输出它们的坐标,即可得到凸包。
四、算法复杂度分析
时间复杂度
1.寻找起点:需要遍历所有点来找到起点,时间复杂度为O(n)。
2.极角排序:对n-1个点进行排序,时间复杂度为O(nlogn)。
3.构建凸包:需要遍历所有点,时间复杂度为O(n)。
4.输出凸包:输出凸包中的点,时间复杂度为O(n)。
因此,Graham Scan算法的总时间复杂度为O(nlogn)。
空间复杂度
Graham Scan算法所需的额外空间主要是存储凸包的点,即O(n)。
五、优点和应用
优点
1.Graham Scan算法简单易实现,适用于二维平面上的点集。
2.算法复杂度较低,时间复杂度为O(nlogn),性能较好。
3.可以高效地找到凸包,凸包在许多计算几何问题中有广泛的应用。
应用
1.计算凸包:Graham Scan算法被广泛应用于计算凸包,用于求解包围点集的
最小凸多边形。
2.裁剪算法:Graham Scan算法可用于裁剪算法中,以确定两个凸多边形的相
交部分。
3.寻找脊线:在遥感图象处理中,Graham Scan算法可以用于寻找图像中的脊
线。
六、总结
Graham Scan算法是一种用于计算凸包的算法,通过极角排序和逆时针遍历的方式,可以高效地求解给定点集的凸包。
该算法设计简单,时间复杂度低,应用广泛,对于解决计算几何问题具有重要意义。