给定平面上的N各点,寻找距离最远的两个点

来源:互联网 发布:淘宝客服怎么返现 编辑:程序博客网 时间:2024/04/28 11:00

类似于“最近点对问题”,这个问题也可以用枚举的方法求解,时间复杂度O(n^2)。

“寻找最近点对”是用到分治策略降低复杂度,而“寻找最远点对”可利用几何性质。注意到:对于平面上有n个点,这一对最远点必然存在于这n个点所构成的一个凸包上(证明略),那么可以排除大量点,如下图所示:

image

在得到凸包以后,可以只在顶点上面找最远点了。同样,如果不O(n^2)两两枚举,可以想象有两条平行线, “卡”住这个凸包,然后卡紧的情况下旋转一圈,肯定就能找到凸包直径,也就找到了最远的点对。或许这就是为啥叫“旋转卡壳法”。(当然这个方法还能解决凸包很多别的问题 http://cgm.cs.mcgill.ca/~orm/rotcal.html )

image

问题解决步骤为:

1. 用Graham's Scanning求凸包      

 

http://www.cnblogs.com/devymex/archive/2010/08/09/1795392.html

 

2. 用Rotating Calipers求凸包直径,也就找到了最远点对。  

 

http://cgm.cs.mcgill.ca/~orm/rotcal.frame.html

 

该算法的平均复杂度为O(nlogn) 。最坏的情况下,如果这n个点本身就构成了一个凸包,时间复杂度为O(n^2)。



实现:

 

http://blog.csdn.net/wangyangkobe/archive/2010/12/17/6081975.aspx