算法分析与复杂性理论-实验报告-求最近点对的问题

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

深圳大学实验报告
教务部制
1.对于平面上给定的N个点,给出所有点对的最短距离,即,输入是平面上的N个点,
输出是N点中具有最短距离的两点。

2.要求随机生成N个点的平面坐标,应用蛮力法编程计算出所有点对的最短距离。

3.要求随机生成N个点的平面坐标,应用分治法编程计算出所有点对的最短距离。

4.分别对N=100,1000,10000,100000 ,统计算法运行时间,比较理论效率与实测效率
的差异,同时对蛮力法和分治法的算法效率进行分析和比较。

5.利用Unity3D输出分治算法中间每个步骤的计算结果,并增设help按钮,详细解释
算法思想。

算法思想提示
1.预处理:根据输入点集S中的x轴和y轴坐标进行排序,得到X和Y,很显然此时X和Y 中的点就
是S中的点。

2.点数较少时的情形
直接计菊
只有三个疽
3.点数|S|>3时,将平面点集S分割成为大小大致相等的两个子集S L和S R,选取一个垂直
线L作为分割直线,考虑X L和X R,Y L和Y R,这里还需要排序吗?
4.两个递归调用,分别求出S L和S R中的最短距离为d i和d r。

5.取d=min(dl, dr),在直线L两边分别扩展d,得到边界区域Y, Y'是区域Y中的点按照y
坐标值排序后得到的点集,Y'又可分为左右两个集合Y 'L和Y 'R
L.一
L<d
L+d
6.对于Y'L中的每一点,检查Y'R中的点与它的距离,更新所获得的最近距离
实验过程及内容:
(实验代码已作为附件提交,名为“算法实验二.cpp)
当点的数量小丁3时,直接计算,当点的个数大丁3时,采用分治法当N=1时
当N=2时
只有两个点,最近点对就是这两个点
测试数据为(1,1 ) (2,2)
预期结果为d=1.414
使用蛮力法求最近点对,核心代码如下
〃求距离平方的函数
double Distinyuish2(Node a t Node b)
return ((d.x-b.x)*(a.x-b.x)) + ((a.y-tj.y)*(a.y-b.y));
〃蛮力法求最近对
uoid BriiteForce(const HList & L,CloseHode & cnode,int begin v int end)
For(int i=t)egin;i<=end;i*+)
Forfinit j<-end;j + + )
double space = Di stinguish2(L.data[i],L.data[j]); iF<sp^ce<cnode.5pact)
cnode_a=L.data[l]; cnade.b=L.data[j]; cnode .space=space;
(计算两点之间的距离,分别将每个点与其它点的距离求出来,找出最近点距离)
当N>3时,使用分治法的情况核心代码如下:
;15E 〃当n》3时进行分治
<
APOIHT *SL-nev fi_POINT[(high-low)/2+1];
■[POINT *SR-nev A>0IHT[ (hi^i-low)/2];
n)= (high-low)/2; /成曦(组以缺)界划分为茜半
j=k=t);
for(i=B;i<=high-lou;i*+)
if(V[i]*indeK<=n)
{SL[ ji ] T [i];〃收集左边子集中的最近点对pise
{
SR[kt+]=Y[i];〃收集右边子集中的最近点对
>
)
closest (K.SL,low,■,al,bl,dl);//i+ 算左边子集的最近点对
closes t (X,Sft,m+1,tiigh,ar.br,dr 算右边子靠的最近点对
if(dl<dr)
;b=bl;d=dl;
}
else
(
a=ar;b=tjr ;d=dr;
POIlfT *2=new POI NT[higti-low+1 ];
k=o;
For(i=B;i<=t*igh-lcw;i*+)//收集距离中线?寤小于U的元素,保存S懒组?中(
iF(f=abstX[n] .x-V[l] .x)<d>
2(k].x=V[i],x;
£[k^+].y=V[i]^:
for(i-l;l<k;l++)
< far(j=i>1;(-y-Z[i] j++)
dl=aist(Z[i]^[j]);
{
a = 2[iJ;
b - Z[j];
ri = d) ■
当N=6时,给定一组测试数据
下面随机生成N个点的平面坐标,求解最近点对。

并计算时间
产生随机数代码:
srand((unsigned)tine(NULL));
i nt n;
cout<Cl§输入点的个数,七
cin>>n;
//cout«-Sf输入各个点的坐标,'«^dl:
POINT *X=new P0iHT[n];
for(int i=0;i<n;i++)
<
X[i] .x=rand()^100;
K[i] .j|^rand()^1BO;
计算时间代码
timet timel,time2; //
tinel-time(NULL); //方法调用前设置一个tinel
“TimUNULL);〃弦样得到的就是妙
〃―痕_t t2-GetTickCount();〃这样得到的就是毫秒
tineZ-tine(NULL);//方法调用前设置一个tineZ //cout«,,tine2:,,«double(tine2)«endl;
cout<<"耗时为!"《《douhleUtimN-timel)) V"^l)"«endl;//统计时间为time?-timel
数据处理分析:
由以上数据可知,随着N的增大,分治法效率比蛮力法效率越来越高。

蛮力法求解最近对问题的过程是:分别计算每一对点之间的距离,然后找出距离最
小的那一对,为了避免对同一对点计算两次距离,只考虑i vj的那些点对(Pi, Pj)。

其实也就是组合的问题,即从n个点中选取两个点的所有组合情况的问题,共有(n*(n-1))种情况。

因此时间复杂度为:
T(n)=£Z 2 = 2L(n-i)=n(n-1) = O(n2) i 注j =i 1 i 1
治法求解含有n个点的最近对问题,其时间复杂性可由下面的递推式表示:
T(n) =2T(n 2) f(n)
合并子问题的解的时间f(n) = O(n),根据通用分治递推式可得T(n)=O(n log2 n)。

实验结论与体会:
分治法的思想就是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。

递归地解这些子问题,然后将各个子问题解合并得到原问
题的解。

通过本次试验我对分治法有了更深的了解。

利用分治法可以将问题简化,这有助于我们在实际中解决一些复杂性较大的问题,提高程序的运行效率。

指导教师批阅意见:
成绩评定:
指导教师签字: 备注:
注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。

2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

Welcome To Download !!!
欢迎您的下载,资料仅供参考!。

相关文档
最新文档