旋转卡壳-求凸包最大直径

Posted adelalove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转卡壳-求凸包最大直径相关的知识,希望对你有一定的参考价值。

 

时间复杂度:O(n)

参考:https://www.cnblogs.com/xdruid/archive/2012/07/01/2572303.html

 

暴力:n^2枚举凸包上的点,如果数据水的话可过。

 

高级做法:

技术分享图片

 

用一对平行线“卡”住凸包进行旋转。

被一对卡壳正好卡住的对应点对称为对踵点。

对锺点的具体定义不好说,不过从图上还是比较好理解的(黑色点对)。

可以证明(此处略过)对踵点的个数不超过3N/2个 也就是说对踵点的个数是O(N)

对踵点的个数也是我们下面解决问题时间复杂度的保证。

 

卡壳呢,具体来说有两种情况:

1.

平行线正好卡着两个点

技术分享图片

 

2.

平行线分别卡着一条边和两个点

技术分享图片

而第二种情况在实现中比较容易处理,这里就只研究第二种情况。

 

在第二种情况中 我们可以看到 一个对踵点和对应边之间的距离比其他点要大

也就是一个对踵点和对应边所形成的三角形是最大的

技术分享图片

具体实现:

技术分享图片

 

1.如果qa,qb是凸包上最远两点,必然可以分别过qa,qb画出一对平行线。通过旋转这对平行线,我们可以让它和凸包上的一条边重合,,如图中蓝色直线。可以注意到,qa是凸包上离p和qb所在直线最远的点

2.于是我们的思路就是枚举凸包上的所有边,对每一条边找出凸包上离该边最远的顶点,计算这个顶点到该边两个端点的距离,并记录最大的值。直观上这是一个O(n2)的算法,和直接枚举任意两个顶点一样了

3.但是注意到当我们逆时针枚举边的时候,最远点的变化也是逆时针的,这样就可以不用从头计算最远点,而可以紧接着上一次的最远点继续计算于是我们得到了O(n)的算法。

 


以上是关于旋转卡壳-求凸包最大直径的主要内容,如果未能解决你的问题,请参考以下文章

POJ2187 Beauty Contest (旋转卡壳算法 求直径)

bzoj1069: [SCOI2007]最大土地面积 凸包+旋转卡壳求最大四边形面积

UVA 4728 Squares(凸包+旋转卡壳)

[poj] 2079 Triangle || 旋转卡壳

[hdu3934] 凸包 旋转卡壳

NYOJ_253:LK的旅行(旋转卡壳入门)