分治法--最邻近点对问题

这篇博客介绍了在一维和二维空间中寻找一组点之间最近点距离的算法。在一维空间中,通过中位数划分点集,递归求解并合并结果,达到O(nlogn)的时间复杂度。二维空间中,同样使用中位数划分,通过限制搜索范围优化到O(n),保持总的时间复杂度不变。算法详细阐述了划分、求解和合并的步骤,并解释了如何有效减少查找横跨点集的最小距离的计算量。
摘要由CSDN通过智能技术生成

问题定义

输入:空间上n个点的集合Q

输出:最近点的距离

定义:Dis(X,Y)为点X和点Y之间的距离,Cross(Q1,Q2)为横跨Q1和Q2两个点集的最小距离

**

【一维】

**

思路:

  1. 划分:将数轴上的点用中位数m分成两个集合
    在这里插入图片描述

  2. 求解:递归在Q1和Q2中求解子问题

  3. 合并:MIN(Q)= min(MIN(Q1),MIN(Q2),Cross(Q1,Q2))

时间复杂度分析:

划分:O(n);求解:2T(n/2);合并:O(1);

T(n)= 2T(n/2)+ O(n) = O(nlogn)

伪代码

//参数A:点的数组(已经按坐标排列)
//参数low:最左边的点下标
//参数high:最右边点下标

Find_MinDis(A,low,high)

        if(high-low == 1)   
        	return Dis(A[low],A[high]);

        else if(high - low > 1)
			mid = (low+high)/2;
			Left_min = Find_MinDis(A,low,mid);
			Right_min = Find_MinDis(A,mid+1,high);
			Cross_min = Dis(A[mid],A[mid+1]);
			return Min(Left_min,Right_min,Cross_min);

【二维】

思路:

划分: 将点按照横坐标的中位数划分成两部分
在这里插入图片描述
记S1和S2中的最小距离d1和d2,设d=min(d1,d2)。

求解:分别递归的计算出S1和S2的最小距离

合并:MIN(S)= min(MIN(S1),MIN(S2),Cross(S1,S2))

问题在于:如何找到横跨S1和S2的两点最小距离

若使用暴力搜索 ,理论上需要进行n^2/4次计算

使用下面方法来缩小寻找点的范围:

  1. 容易得知:对S1的任意一个点p来说,满足条件的点一定落在S2中d*2d的范围内
    在这里插入图片描述
  2. 进一步缩小范围,S2中任意两点距离大于等于d,由抽屉原理得知,任意两点不在同一个小矩形中
    在这里插入图片描述
  3. 这样就将时间缩减到6*n/2=3n,即O(n),总的时间复杂度依然是O(nlogn)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值