算法设计与分析-实验1-递归与分治算法-

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

淮海工学院计算机工程学院实验报告书

课程名:《算法分析与设计》

题目:实验1 递归与分治算法

班级:

学号:

姓名:

实验1 递归与分治算法

实验目的和要求

(1)进一步掌握递归算法的设计思想以及递归程序的调试技术;

(2)理解这样一个观点:分治与递归经常同时应用在算法设计之中。

(3)分别用蛮力法和分治法求解最近对问题;

(4)分析算法的时间性能,设计实验程序验证分析结论。

实验内容

设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。

实验环境

Turbo C 或VC++

实验学时

2学时,必做实验

数据结构与算法

#include

#include

#include

#define N 100

using namespace std;

struct point

{

int x,y;

};

bool cmpx(point a,point b)

{

return a.x

}

bool cmpy(point a,point b)

{

return a.y>b.y;

}

int Sqrt(point a,point b)//两点间的距离的平方

{

int k;

k=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);

return k;

}

double min(double d1,double d2)

{

if(d1<=d2)

return d1;

else

return d2;

}

bool different(point p[],int n,int start,int end)

{

for(int i=start;i

{

if(p[i].x==p[end].x&&p[i].y==p[end].y)

return true;

}

return false;

}

int ClosestPoints1(point p[],int n,point & one,point & two)//求出两最近点的相关信息{

int d=9999;

for(int i=0;i

for(int j=i+1;j

{

int temp=Sqrt(p[i],p[j]);

if(temp

{

one=p[i];

two=p[j];

d=temp;

}

}

return d;

}

int ClosestPoints2(point S[],int n) {

if(n<2) return 10000;

if(n==2)

{

int d=Sqrt(S[0],S[1]);

return d;

}

sort(S,S+n,cmpx);//按照X大小排序

int m=S[n/2].x;

int t=n/2;int i=0;

point S1[5000],S2[5000];

for(i=0;i

{

S1[i]=S[i];

}

for(i=t;i

{

S2[i-t]=S[i];

}

int d1=ClosestPoints2(S1,t);

int d2=ClosestPoints2(S2,n-t);

int d=min(d1,d2);

point p1[N],p2[N];

int j=0;

int p1l=0,p2l=0;

//对x坐标差值在2d之间的点进行归类,找到这些点for(i=0;i

{

if(abs(S1[i].x-m)

{

p1[p1l]=S1[i];

p1l++;

}

}

for(i=0;i

{

if(abs(S2[i].x-m)

{

p2[p2l]=S2[i];

p2l++;

}

}

//对两个区间内的点沿Y坐标轴进行排序

sort(p1,p1+p1l,cmpy);

sort(p2,p2+p2l,cmpy);

int md=9999;

for(i=0;i

{

for(j=0;fabs(p2[j].y-p1[i].y)

{

int pd=Sqrt(p1[i],p2[j]);

md=min(pd,md);

}

}

return min(d,md);

}

void main()

{

point p[N],a,b;

int n=20;int d;

cout<<"请输入点的个数:";

cin>>n;

cout<<"请输入各点(中间用空格):"<

for(int i=0;i

{

cout<<"第"<

cin>>p[i].x>>p[i].y;

}

d=ClosestPoints1(p,n,a,b);

cout<<"\n蛮力法求最近点对:"<

cout<<"最短距离为:"<

cout<<"两个点分别为:("<

d=ClosestPoints2(p,n);

cout<<"\n分治法求最近点对:"<

cout<<"最短距离为:"<

cout<<"两个点分别为:("<

核心源代码

蛮力法核心源代码:

相关文档
最新文档