目录
题目:二维最接近点对问题
【问题描述】
给定平面上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<1e5,
<
=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。
算法复杂度:
时间复杂度: &nbs

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





