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

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

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

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

问题解决步骤为:

1. 用Graham's Scanning求凸包      

 

 

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

 

 

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



实现:

 

 


你可能感兴趣的:(算法)