算法设计与分析-实验1-递归与分治算法-
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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<<"两个点分别为:("< 核心源代码 蛮力法核心源代码: