算法分析与复杂性理论实验报告求最近点对的问题.docx
《算法分析与复杂性理论实验报告求最近点对的问题.docx》由会员分享,可在线阅读,更多相关《算法分析与复杂性理论实验报告求最近点对的问题.docx(6页珍藏版)》请在冰豆网上搜索。
算法分析与复杂性理论实验报告求最近点对的问题
深圳大学实验报告
课程名称:
算法分析与复杂性理论
实验项目名称:
实验二分治法求最近点对问题
学院:
计算机与软件学院
专业:
软件工程
指导教师:
杨炬
才聘人:
文成学号:
2150230509班级:
15级软工学术型
实验时间:
2015-10-22
实验报告提交时间:
2015-10-24
教务部制
实验目的与要求:
实验目的:
(1)掌握分治法思想。
(2)学会最近点对问题求解方法。
实验要求
1.在blackboard提交电子版实验报告,注意实验报告的书写,整体排版。
2.实验报告的实验步骤部分需详细给出算法思想与实现代码之间的关系解释,不可直
接粘贴代码(直接粘贴代码者视为该部分内容缺失)。
3.实验报告样式可从http:
//192.168.2.3/guide.aspx表格下载一学生适用一在校生管
理-实践教学-实验:
深圳大学学生实验报告)
4.源代码作为实验报告附件上传。
5.在实验课需要现场运行验证。
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分割成为大小大致相等的两个子集Sl和Sr,选取一个垂直
线L作为分割直线,考虑Xl和Xr,Yl和Yr,这里还需要排序吗?
4.两个递归调用,分别求出Sl和Sr中的最短距离为di和dr。
5.取d=min(dl,dr),在直线L两边分别扩展d,得到边界区域Y,Y'是区域Y中的点按照y
坐标值排序后得到的点集,Y'又可分为左右两个集合Y'l和Y'r
L.一
L+d
L6.对于Y'l中的每一点,检查Y'r中的点与它的距离,更新所获得的最近距离
实验过程及内容:
(实验代码已作为附件提交,名为“算法实验二.cpp)
当点的数量小丁3时,直接计算,当点的个数大丁3时,采用分治法
当N=1时
当N=2时
只有两个点,最近点对就是这两个点
测试数据为(1,1)(2,2)
预期结果为d=1.414
使用蛮力法求最近点对,核心代码如下
〃求距离平方的函数
doubleDistinyuish2(NodeatNodeb)
return((d.x-b.x)*(a.x-b.x))+((a.y-tj.y)*(a.y-b.y));
〃蛮力法求最近对
uoidBriiteForce(constHList&L,CloseHode&cnode,intbeginvintend)
For(inti=t)egin;i<=end;i*+)
Forfinitj<-end;j++)
doublespace=Distinguish2(L.data[i],L.data[j]);iFcnode_a=L.data[l];cnade.b=L.data[j];cnode.space=space;
(计算两点之间的距离,分别将每个点与其它点的距离求出来,找出最近点距离)
当N>3时,使用分治法的情况
核心代码如下:
;15E〃当n》3时进行分治
<
APOIHT*SL-nevfi_POINT[(high-low)/2+1];
■[POINT*SR-nevA>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+算左边子集的最近点对
closest(X,Sft,m+1,tiigh,ar.br,dr算右边子靠的最近点对
if(dl;b=bl;d=dl;
}
else
(
a=ar;b=tjr;d=dr;
POIlfT*2=newPOINT[higti-low+1];
k=o;
For(i=B;i<=t*igh-lcw;i*+)//收集距离中线?
寤小于U的元素,保存S懒组?
中
(
iF(f=abstX[n].x-V[l].x)
2(k].x=V[i],x;
£[k^+].y=V[i]^:
for(i-l;l1;(-y-Z[i]j++)
dl=aist(Z[i]^[j]);
{
a=2[iJ;b-Z[j];
ri=d)■
当N=6时,给定一组测试数据
下面随机生成N个点的平面坐标,求解最近点对。
并计算时间
产生随机数代码:
srand((unsigned)tine(NULL));
intn;
coutcin>>n;
//cout«-Sf输入各个点的坐标,'«^dl:
POINT*X=newP0iHT[n];
for(inti=0;i<
X[i].x=rand()^100;
K[i].j|^rand()^1BO;
timettimel,time2;//
计算时间代码
tinel-time(NULL);//方法调用前设置一个tinel
“TimUNULL);〃弦样得到的就是妙
〃―痕_tt2-GetTickCount();〃这样得到的就是毫秒
tineZ-tine(NULL);//方法调用前设置一个tineZ//cout«,,tine2:
,«double(tine2)«endl;
cout<<"耗时为!
"《《douhleUtimN-timel))V"^l)"«endl;//统计时间为time?
-timel
数据处理分析:
扩大N的规模做测试
n
10
100
1000
10000
100000
蛮力法
1秒
9秒
57秒
/
/
分治法
1秒
9秒
30秒
/
/
由以上数据可知,随着N的增大,分治法效率比蛮力法效率越来越高。
蛮力法求解最近对问题的过程是:
分别计算每一对点之间的距离,然后找出距离最
小的那一对,为了避免对同一对点计算两次距离,只考虑ivj的那些点对(Pi,Pj)。
其
实也就是组合的问题,即从n个点中选取两个点的所有组合情况的问题,共有(n*(n-1))
种情况。
因此时间复杂度为:
T(n)=£Z2=2L(n-i)=n(n-1)=O(n2)i注j=i1i1
治法求解含有n个点的最近对问题,其时间复杂性可由下面的递推式表示:
T(n)=2T(n2)f(n)
合并子问题的解的时间f(n)=O(n),根据通用分治递推式可得T(n)=O(nlog2n)。
实验结论与体会:
分治法的思想就是将一个规模为n的问题分解为k个规模较小的子问题,这些子问
题互相独立且与原问题相同。
递归地解这些子问题,然后将各个子问题解合并得到原问
题的解。
通过本次试验我对分治法有了更深的了解。
利用分治法可以将问题简化,这有助于
我们在实际中解决一些复杂性较大的问题,提高程序的运行效率。
指导教师批阅意见:
成绩评定:
备注:
指导教师签字:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
WelcomeTo
Download!
!
!
欢迎您的下载,资料仅供参考!