算法:
0:把所有的点按照横坐标排序
1:用一条竖直的线L将所有的点分成两等份
2:递归算出左半部分的最近两点距离d1,右半部分的最近两点距离d2,取d=min(d1,d2)
3:算出“一个在左半部分,另一个在右半部分”这样的点对的最短距离d3。
4:结果=min(d1,d2,d3)
关键就是这第3步。貌似这需要n^2的时间,把左边每个点和右边每个点都对比一下。其实不然。秘密就在这里。
首先,两边的点,与分割线L的距离超过d的,都可以扔掉了。
其次,即使两个点P1,P2(不妨令P1在左边,P2在右边)与分割线L的距离(水平距离)都小于d,如果它们的纵坐标之差大于d,也没戏。
就是这两点使得搜索范围大大减小:
对于左半部分的,与L的距离在d之内的,每个P1来说:右半部分内,符合以上两个条件的点P2最多只有4个!
原因就是:
d是两个半平面各自内,任意两点的最小距离,因此在同一个半平面内,任何两点距离都不可能超过d。
我们又要求P1和P2的水平距离不能超过d,垂直距离也不能超过d,在这个d*2d的小方块内,最多只能放下8个距离不小于d的点。
因此,第3步总的比较距离的次数不超过n*8。
第3步的具体做法是:
3.1 删除所有到L的
算法导论求n个点的最小距离
最新推荐文章于 2022-11-08 10:24:04 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)