问题描述
给出一个平面内的若干个点,问这些点两两之间的最近距离是多少
弱数据题目链接
- 暴力自不必说,两个 f o r for for挨个看,时间复杂度是 O ( n 2 ) O(n^2) O(n2),可以通过数据较小的测试
分治求解
-
这里我们可以回忆一下归并排序是怎么做的,如何达到 O ( n l o g n ) O(nlogn) O(nlogn)的时间复杂度,采用的即是分治思想,也就是把一组数据对半分成两部分,继续划分,直至最小,排序拼回原数组,再排序,再拼回,直至全部排序完成
-
那么借助这个想法,我们能不能把平面上的点分成两部分分而治之呢?

-
我们想求上图任意两个点之间的最近点对,首先,要对这些点进行递归划分,根据分治的思想,我们先将其分成两部分,然后递归下去,按横坐标从小到大进行划分,直到最后的一个点或者两个点,可以得到如下的划分图,线条长度代表递归的深度,长度越长递归深度越小

-
我们可以先考虑一下第一次划分之后,如何求最近点对,因为我们知道,这两个点要么都在左面,要么都在右面,要么一个在左面,另一个在右面,在同一个方向的时候只需要递归处理即可,关键是位居两侧时候怎么办,因为这时候我们已经求出左面和右面的最小值 d i s dis dis,那么位居两侧的可能点有哪些呢?我们应该把这些点筛选出来,如果存在这样的一个点对,则点对中的两个点和划分线之间的距离都应该在 d i s dis dis以内,也就是说如果 f a b s ( x m i d − x 1 ) < d i s fabs(x_{mid}-x_1)\lt dis fabs(xmid−x1)<dis,这里的 m i d mid mid是靠近中间划分线的点(黑书中写的是 ≤ \leq ≤,似乎应该是小于,因为如果 x x x的差值等于 d i s dis dis,那么这两个点之间距离不可能小于 d i s dis

本文介绍了一种利用分治策略解决平面内点对最近距离问题的有效算法,并通过实例代码详细展示了其实现过程及时间复杂度分析。
最低0.47元/天 解锁文章
3291

被折叠的 条评论
为什么被折叠?



