最接近点对问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、最接近点对问题(一维)
一、最接近点对问题(一维)
最接近点对问题:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小。

此时S中的n个点退化为x轴上的n个实数x1,x2,..,x n。

最接近点对即为这n个实数中相差最小的2个实数。

2、分析
将所给的平面上n个点的集合S分成2个子集S1和S2,每一个子集中约有n/2个点,·然后在每一个子集中递归地求其最接近的点对。

S1和S2的最接近点对未必就是S的最接近点对,若是组成S的最接近点对的2个点都在S1中或都在S2中,则问题很容易解决。

可是,若是这2个点别离在S1和S2中,则对于S1中任一点p,S2中最多只有n/2个点与它组成最接近点对的候选者,仍需做n2/4次计算和比较才能肯定S的最接近点对。

因此,依此思路,归并步骤耗时为O(n2)。

整个算法所需计算时间T(n)应知足:
T(n)=2T(n/2)+O(n2)
它的解为T
(n)=O(n2)
3、伪代码
随机Random
float Random()
{
float result=rand()%10000;
return result*;
}
返回最大、最小
float Max OR Min(float s[],int p,int
q)
序实现
#include<>
#include<iostream>
#include<cmath>
using namespace std;
const int M=50;
D=i;
X[i].x=Random();
X[i].y=Random();
c out<<"("<<X[i].x<<","<<X[i].y<<") ";
}
PointX a;
PointX b;
float d;
Cpair2(X,number_used,a,b,d);
cout<<endl;
cout<<"the closest pair is ("<<<<","<<<<")和("<<<<","<<<<") "<<endl;
cout<<"the min distance is "<<d<<endl;
return 0;
}
float Random()
{
float result=rand()%10000;
return result*;
}
=i;
Y[i].x=X[i].x;
Y[i].y=X[i].y;
}
PointY*tmpy=new PointY[n];
MergeSort(Y,tmpy,0,n-1);
PointY*Z=new PointY[n];
closest(X,Y,Z,0,n-1,a,b,d);
delete []Y;
delete []Z;
return true;
}
void closest(PointX X[],PointY Y[],PointY Z[], int l, int r,PointX& a,PointX& b,float& d)
{
i f(r-l==1)
{>m) Z[g++]=Y[i];
else Z[f++]=Y[i]; closest(X,Z,Y,l,m,a,b,d);
float dr;
PointX ar,br;
closest(X,Z,Y,m+1,r,ar,br,dr);
if(dr<d)
{
a=ar;
b=br;
d=dr;
}
Merge(Z,Y,l,m,r);-Y[t].x)<d)
{
Z[k++]=Y[t];
}
-Z[s].y<d;j++)
{
float dp=dis(Z[s],Z[j]);
if(dp<d)
{
d=dp;
a=X[Z[i].p];
b=X[Z[j].p];
} } } }
template <typename Type>
void Merge(Type c[],Type d[], int l, int m, int r)
{
i nt i=l,j=m+1,k=l;
w hile((i<=m)&&(j<=r))
if(c[i]<=c[j])
d[k++]=c[i++];
else
d[k++]=c[j++];
if(i>m)
for(int q=j;q<=r;q++)
d[k++]=c[q];
else
for(int q=i;q<=m;q++)
d[k++]=c[q];
}
template <typename Type>
void MergeSort(Type a[], Type b[],int left, int right)
{ // a[]为待排序的数组,left,right为a数组的下标,b[]为临时存放排好序的临时数组
i f(left<right)
{int i=(left+right)/2;//取中点MergeSort(a,b,left,i);
MergeSort(a,b,i+1,right);
Merge(a,b,left,i,right);//归并到数组b
Copy(a,b,left,right);//复制回数组a }
}
template <typename Type>
void Copy(Type a[],Type b[], int right,int left) {
for(int i=right;i<=left;i++)
a[i]=b[i];
}
运行情况:。

相关文档
最新文档