最邻近点对问题(Closest-Pair Problem):一维的分治解法详解

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

这是该系列的第一篇。二维、三维的最邻近点对问题(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,

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值