这是该系列的第一篇。二维、三维的最邻近点对问题(Closest-Pair Problem):戳这里
1 问题描述
一维下,每个点即是一个数,所有点线性分布于x轴上,如图所示:

很明显,最近点对一定是相邻的两个点,所以暴力解法就是依次检查 p i , p i + 1 p_i, p_{i+1} pi,pi+1,最后返回距离最小的点对即可。暴力算法的时间复杂度是 O ( n ) O(n) O(n)。
其实,可以发现最邻近点对问题非常适合拆分成子问题,利用分治思想可以把这一步的时间复杂度降到 O ( l o g n ) O(logn) O(logn)。
2 算法描述
Divide步骤:
对于任意的点集 P P P,其中点的数量 ∣ P ∣ = n \vert P\vert = n ∣P∣=n,那么可以在第 ⌊ n / 2 ⌋ \lfloor n/2\rfloor ⌊n/2⌋个点的坐标(记为 x ∗ x^* x∗)处,将其分为 Q Q Q区与 R R R区。(实际中,如果P是有序的,那么只需要传递区间索引即可,故它是 O ( 1 ) O(1) O(1)的)
现在原问题就变成了两个完全相同的子问题。最终只有小于等于3个点时(或其他小常数,重要的是消耗是常数时间的),可以直接比较每个点对得出答案。
Merge步骤:
假设 Q Q Q区找到了局部最邻近点 { q 1 , q 2 } \{q_1, q_2\} { q1,

本文介绍了一维最邻近点对问题的分治算法解决方案,详细解析了Divide和Merge步骤,并通过Java代码实现了算法。文章还讨论了算法的时间复杂度,并对比了暴力解法。
最低0.47元/天 解锁文章
2522

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



