凸包问题的分治算法_算法 | 凸包问题的卷包裹法

作者:henu_wxj

链接:https://blog.nowcoder.net/n/6a9e1dc2a32b401cae26dcbcf509eb96

来源:牛客网

写在前面---

现在我们学习凸包的有关算法(终于开始凸包的学习了)。也算是初步接触计算几何了。

凸包的概念是在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包,表示为:

1e03ebfab4f56fea706bdc05c60949d1.png

在二维空间中,凸包也可以形象的理解为最小的包含所有点的凸多边形。

X的凸包可以用X=(x1,x2,x3,...,x12)的线性组合来构造,即:

2e79acbf53c76b267009e4fdfb642f6e.png

在计算几何中,凸包问题是一类比较常见的问题,不仅在计算机程序设计竞赛中,在统计等现实问题中也有着广泛的应用。

现在已经证明了凸包算法的时间复杂度下界是

equation?tex=O%28n%5Ctimes+logn%29 ,但是当凸包的顶点数h也被考虑,Krik-patrick和Seidel的剪枝搜索算法可以达到
equation?tex=O%28n%5Ctimes+logh%29 ,在渐进意义下达到最优。最常用的凸包算法是Graham扫描法和Jarvis步进法。本章主要学习Graham扫描法,其正确性的证明和Jarvis步进法可以参考《算法导论》

卷包裹法

原理:

卷包裹法的原理比较简单:先找一个最边缘的点(一般位于最下方,如果有多个点,则选择最左方的点),假设有一条绳子,以该点为端点向右边逆时针旋转直到碰到另一个点为止,此时找出凸包的一条边;然后再用新找到的点作为端点,继续旋转绳子,找到下一个端点;重复这一步骤直至围成一个凸多边形,即可得到这个点集的凸包。卷包裹法的时间复杂度为

equation?tex=O%28N%5E2%29

步骤:

Step1:选择点集中最下面的点,如果有多个,则选择最下面的点中最左边的一个,所选择的点是凸包的第一个点。

Step2:以水平向右的方向作为初始射线方向,逆时针旋转,选择第一条在初始射线之上的射线作为当前射线,当前射线经过凸包的第二个点。

Step3:以当前射线为基准,继续逆时针旋转找到最靠近该射线的一条射线,从而找到凸包的另一个点。把这条射线作为当前射线,这个过程一直继续,直至回到第一个点。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值