分治算法——平面点问题(使用数组实现)

博客围绕二维最接近点对问题展开,介绍了暴力算法和分治算法。暴力算法通过遍历所有点对求最小距离;分治算法将点集划分,分别计算子集内及子集间最近点对距离。还给出了两种分治算法的伪码和C代码,并提及复杂度分析。

目录

题目:二维最接近点对问题

暴力算法:

算法原理:

算法复杂度:

分治算法:

第一版:

算法原理:

算法复杂度:

C代码:

第二版:

算法原理:

算法复杂度:

C代码:


题目:二维最接近点对问题

【问题描述】

给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的。

【输入形式】

第一行一个整数n,表示点的个数。

接下来n行,每行两个整数x,y,表示一个点的行坐标和列坐标。

1<=n<=1e5,0<=x,y<=1e9。

【输出形式】

仅一行,一个实数,表示最短距离,四舍五入保留2位小数。

【样例输入】

4
0 0
0 1
1 0
1 1

【样例输出】

1.00

老师要求:递归算法里不可以出现排序!!!!!!!!!!!!

暴力算法:

算法原理:

求出每两个点之间的距离,选出最小的

算法伪码:

输入:点集P()(一个二维数组,例:P[0][0]代表第一个点的x,P[0][1]代表第一个点的y)

1.定义最小距离dist为第一个点到第二个点的距离

2.两层for循环遍历更新dist的值

3.返回dist

算法复杂度:

时间复杂度:O(n^{2})

空间复杂度:C_{n}^{2} 由于本题n<1e5,C_{n}^{2}<C_{1e5}^{2}=4,999,950,000 

double baoli(double a[][2],int n) {//暴力算法
	
	int dist = getdist(a[0],a[1]);
	for (int i = 0; i < n; i++) {
		for (int j = i+1; j < n; j++) {
			dist =smaller( dist,getdist(a[i], a[j]));
		}
		
	}
	return dist;
}

分治算法:

这里转载一篇个人讲的蛮好的文章:平面点对问题(分治法的经典问题)_给定n个点,其坐标为 ( xi,yi ) ( 0£i£n-1 ) ,要求使用分治策略求解,设计算-优快云博客

第一版:

算法原理:

把点集P划分为L和R(L、R大小相等),分别计算L和R中最近点对的距离,计算L和R中距离最近点对的距离。

算法伪码:

Mindistance(P,l,r)

输入:点集P(二维数组,P[i][0]代表第i个点的x,P[i][1]代表第i个点的y), l和r分别为点集P(数组)的左下标和右下标

输出:最近点对的距离d

1.if 点少于三个 直接计算并比较

2.根据X值的大小对P进行排序(个人选用)

3.做中垂线m(m=(l+r)/2),把点集P划分为L和R(L、R大小相等)

4.d1=Mindistance(P,m,r)

5.d2=Mindistance(P,l,m)

6.d=d1和d2中较小的值

7.计算m两侧不超过d范围内的点(理论上不会超过6个 )之间的最近距离d3。若d3小于d,更新d=d3。

算法复杂度:

时间复杂度:O(nlogn)                                        &nbs

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值