最接近点对问题
![最接近点对问题](https://img.360docs.net/img6d/03aseit4wgl3fb7iwdly-d1.webp)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、最接近点对问题(一维)
1、最接近点对问题(一维)
最接近点对问题:给定平面上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*0.01;
}
返回最大、最小
float Max OR Min(float s[],int p,int q)//返回s[]中的最大值
{
float s_max(s_min)=s[p];
for(int i=p+1;i<=q;i++)
if(s_max
s_max=s[i]; OR
if(s_min>s[i])
s_min=s[i];
return s_max(s_min)
}
主要函数
Cpair Cpair1(float s[],int n)
{
Cpair out_p_d={99999,0,0};
if(n<2) return out_p_d;
float m1=Max(s,0,n-1),m2=Min(s,0,n-1);
float m=(m1+m2)/2;//找出点集中的中位数
int j=0,k=0;
//将点集中的各元素按与m的大小关系分组
float s1[M],s2[M];
for(int i=0;i { if(s[i]<=m) {s1[j]=s[i];j++;} else {s2[k]=s[i];k++;} } Cpair d1=Cpair1(s1,j),d2=Cpair1(s2,k);//递归float p=Max(s1,0,j-1),q=Min(s2,0,k-1); //返回s[]中的具有最近距离的点对及其距离 if(d1.d { if((q-p) { out_p_d.d=(q-p); out_p_d.d1=q; out_p_d.d2=p; return out_p_d; } else return d1; } else { if((q-p) { out_p_d.d=(q-p); out_p_d.d1=q; out_p_d.d2=p; return out_p_d; } else return d2; } } 4、程序实现 #include #include using namespace std; const int M=50; struct Cpair { float d; float d1,d2; }; float Random(); int input(float s[],int number_used); float Max(float s[],int p,int q); float Min(float s[],int p,int q); Cpair Cpair1(float s[],int n); void main() { srand((unsigned)time(NULL)); int number_used,m; float s[M]; Cpair d; m=input(s,number_used); d=Cpair1(s,m); cout< cout< } float Random() { float result=rand()%10000; return result*0.01; } int input(float s[],int number_used) { cout<<"input the number "; cin>>number_used; cout<<"the random number are "; for(int i=1;i<=number_used;i++) { s[i]=Random(); cout< } return number_used; } float Max(float s[],int p,int q)//返回s[]中的最大值 { float s_max=s[p];