算法课程设计说明书.docx
《算法课程设计说明书.docx》由会员分享,可在线阅读,更多相关《算法课程设计说明书.docx(14页珍藏版)》请在冰豆网上搜索。
![算法课程设计说明书.docx](https://file1.bdocx.com/fileroot1/2023-1/31/967dd93a-131e-4964-a35c-d50aff9e8748/967dd93a-131e-4964-a35c-d50aff9e87481.gif)
算法课程设计说明书
算法实验周
********************************
利用分治法求解空中飞行管理问题
—所做任务说明及题目相关知识说明
文档编号:
NUC-2013-C02-01
版本:
1.0
作者:
杨晓晨
打印日期:
2013.12.26
拷贝份数:
1
©2013中北大学计算机与控制工程学院
1.1飞机管理任务说明
随着空中各种飞机数量的增加,飞行安全控制变得尤为重要,要想提高空中飞行的安全系数,其中一个亟需解决的问题就是预先知道空中哪两架飞机之间具有最大碰撞危险。
如果知道了这两架具有最大碰撞危险的飞机,我们就预先通知飞行员进行相应的安全飞行,以避免碰撞。
从穷举法的角度很容易解决这个问题,但是效率太低,时间复杂度是O(n2),不符合实际需要,利用分治法分而制之的思想,降低问题复杂度,通过建模求解,把时间复杂度降到O(nlogn),可以较好地解决实际问题。
1分治法分治法基本思想:
任何一个用计算机求解的问题时间复杂度都与其规模N有关。
求解该问题,至少使用蛮力法和分治法求解,并比较时间复杂性。
1.2相关知识说明
1.2.1蛮力法
蛮力法基本思想为计算所有点之间的距离,计算出所有点的距离之后,进行比较,得出距离最近的两点。
同时为了少进行重复操作,以y轴为标准,只计算Yi小于Yj的点。
1.2.2分治法
所谓分治法就是把问题划分成多个子问题来进行处理。
这些子问题,在结构上与原来的问题一样,但在规模上比原来的小。
如果得到的子问题相对来说还大,可以反复地使用分治策略,把这些子问题再划分成更小的、结构相同的子问题。
这样就可以使用递归的方法,分别求解这些子问题,把这些子问题的解结合起来,从而获得原来问题的解。
基本的思想为找一条中垂线m(坐位S集合x坐标的中位数)把n个元素分成左右两部分元素,然后分别求得两边的最短距离的d1,d2,然后取两者中的最小者记为d,在中线两边分别取d的距离,记录该距离范围内点的个数,中线左边有L个元素,右边有R个元素,分别将两边的点按y坐标升序排列m=,在左边集合中每一个点,找右边集合的点,找到与之距离小于d的点,更新最短距离,直到循环结束,即可求出最短距离。
********************************
利用分治法求解空中飞行管理问题
—数据结构设计说明
文档编号:
NUC-2013-C02-02
版本:
1.0
作者:
杨晓晨
打印日期:
2013.12.26
拷贝份数:
1
©2013中北大学计算机与控制工程学院
2.1空中飞行管理问题数据结构
程序使用java语言进行编写。
定义point类以生成点,并对点的x、y、z轴坐标进行定义,并使用pointpair说明点之间的距离,说明各个点的id与距离。
分别使用FenZhiDealClass类和ManliDealClass类进行空中飞行管理问题的蛮力法与分治法的解决。
使用ClosestpairMainClass类定义点的输入方式,并从InputClass类引用随机生成数。
同时CaculateDist提供计算两点之间距离的方法。
在main类中,可以对使用方法进行选择,选择使用蛮力法与分治法。
publicstaticvoidmain(String[]args){
Scannerscanner=newScanner(System.in);
System.out.println("请选择点的产生方式,输入1生产随机点,或者3从文件引入:
");
inta=scanner.nextInt();
System.out.println("请选择方法:
1为蛮力法,2为分治法");
intb=scanner.nextInt();
ClosestPairMainClass.ChooseInputPoint(a);
ClosestPairMainClass.ChooseDeal(b);
}
********************************
利用分治法求解空中飞行管理问题
—程序模块及流程设计
文档编号:
NUC-2013-C02-03
版本:
1.0
作者:
杨晓晨
打印日期:
2013.12.26
拷贝份数:
1
©2013中北大学计算机与控制工程学院
3.1飞机管理流程图
********************************
利用分治法求解空中飞行管理问题
—源程序清单及说明
文档编号:
NUC-2013-C02-04
版本:
1.0
作者:
杨晓晨
打印日期:
2013.12.26
拷贝份数:
1
©2013中北大学计算机与控制工程学院
4.1飞机管理源程序清单
Main.java:
程序入口
Point.java:
点集函数
Point1.java:
点命名函数
PointPair.java:
连线函数
ManliDealClass:
蛮力最近对函数
FenZhiDealClass:
分治最近对函数
Caculatedist.java:
距离求解函数
InputClass.java:
随机点生成函数
4.2主要代码
4.2.1主函数代码
importjava.util.Random;
importjava.util.Scanner;
publicclassMain{
publicstaticvoidmain(String[]args){
Scannerscanner=newScanner(System.in);
System.out.println("请选择点的产生方式,输入1生产随机点,或者3从文件引入:
");
inta=scanner.nextInt();
System.out.println("请选择方法:
1为蛮力法,2为分治法");
intb=scanner.nextInt();
ClosestPairMainClass.ChooseInputPoint(a);
ClosestPairMainClass.ChooseDeal(b);
}
}
4.2.2蛮力法求解最近对函数
importjava.io.File;
importjava.util.Scanner;
publicclassManliDealClass{
privatedoubled;
privatedoublemin_d;
privateintorder1;
privateintorder2;
publicstaticintexcuteNum;
publicstaticdoubleuseTime;
publicManliDealClass(){
d=0;
min_d=Double.POSITIVE_INFINITY;
order1=0;
order2=0;
}
//蛮力法求最近对
publicvoidFindClosestPair(Point1[]p){
excuteNum=0;
doubletime1=System.currentTimeMillis();
for(inti=0;i
for(intj=i+1;j
d=CaculateDist.dist(p[i],p[j]);
excuteNum++;
if(dmin_d=d;
order1=p[i].getId();
order2=p[j].getId();
}
}
}
doubletime2=System.currentTimeMillis();
useTime=time2-time1;
Strings1=toString();
//LeftDownPanel.jtA1.setText(s1);
Print();
}
//得到类中的属性值
publicdoublegetMin_d(){
returnmin_d;
}
publicintgetOrder1(){
returnorder1;
}
publicintgetOrder2(){
returnorder2;
}
publicStringtoString(){
return"蛮力法求得的三维立体空间中的最近点对为:
"+"点"+order1+"和点"+order2+"\n"+"(蛮力法)两点的距离为:
"+min_d;
}
publicvoidPrint(){
System.out.println("蛮力法求得的三维立体空间中的最近点对为:
"+"点"+order1+"和点"+order2);
System.out.println("(蛮力法)两点的距离为:
"+min_d);
}
publicstaticStringtoString1(){
return"使用蛮力法求三维立体空间中的最近对所用的时间为:
"+useTime+"\n"+"基本操作执行的次数为:
"+excuteNum;
}
}
4.2.3分治法求最近对函数
publicclassFenZhiDealClass{
publicstaticdoubleuseTime2;
publicstaticintexcuteNum2;
publicstaticintexcuteNum3;
publicstaticPointPairclosestPair(Point1[]source){
doublestartTime=System.currentTimeMillis();
excuteNum2=0;
excuteNum3=0;
if(source.length<2){
returnnull;
}
//对原始输入的空间点集数组source按照Y坐标进行排序
DealClass.sortY(source);
PointPairpp=realclosestPair(source,0,source.length-1);
doubleendTime=System.currentTimeMillis();
useTime2=endTime-startTime;
returnpp;
}
//寻找最近点对的静态函数
publicstaticPointPairrealclosestPair(Point1[]x,intl,intr){
excuteNum2++;
//当数组中只有两个点
if(r-l==1){
returnnewPointPair(x[l],x[r],CaculateDist.dist(x[l],x[r]));
}elseif(r-l==2){//当数组中只有3个点时
doubled1=CaculateDist.dist(x[l],x[l+1]);
doubled2=CaculateDist.dist(x[l+1],x[r]);
doubled3=CaculateDist.dist(x[l],x[r]);
if(d1returnnewPointPair(x[l],x[l+1],d1);
}
if(d2<=d3){
returnnewPointPair(x[l+1],x[r],d2);
}
else{
returnnewPointPair(x[l],x[r],d3);
}
}elseif(l==r){//只有一个点
returnnewPointPair(x[l],x[r],Double.MAX_VALUE);
}else{
//数组中的点多于3个
//找出点集中以Y坐标为标准的分界平面,以此平面为界对空间点集进行划分
doublemid_Y=DealClass.FindMid(x,l,r);
intm=DealClass.Divide(x,mid_Y);
//分别找出左右两个空间点集的最近对best和right
PointPairright,best;
best=realclosestPair(x,l,m-1);
right=realclosestPair(x,m,r);
//比较左右两个点集的最近对距离,找出距离最短的一对点
if(right.getDist()best=right;
}
//将到平面Y=m的距离小于dist的点放在数组Z中
intk=0;
//初始化数组长度
Point1[]z=newPoint1[x.length];
//数组Z中存放X数组中距离平面距离小于合并前最小距离的点
for(inti=l;i<=r;i++){
if(Math.abs(mid_Y-x[i].getY())z[k++]=x[i];
}
}
//从三对点中找到距离最近的点
for(inti=1;ifor(intj=i+1;jdoubledp=CaculateDist.dist(z[i],z[j]);
if(dpbest=newPointPair(x[z[i].getOrder()-1],x[z[j].getOrder()-1],dp);
}
}
}
returnbest;
}
}
//输出最近点对及其距离
publicstaticvoidprint(PointPairpp){
Strings=toString(pp);
//LeftDownPanel.jtA2.setText(s);
System.out.println("分治法求得的空间点集的最近对为:
点"+pp.getPa().getId()+"和点"+pp.getPb().getId());
System.out.println("(分治法)两点之间的距离为:
"+pp.getDist());
}
publicstaticStringtoString(PointPairpp){
return"分治法求得的空间点集的最近对为:
点"+pp.getPa().getId()+"和点"+pp.getPb().getId()+"\n"+"(分治法)两点之间的距离为:
"+pp.getDist();
}
publicstaticStringtoString1(){
return"使用分治法求三维立体空间中的最近对所用的时间为:
"+useTime2+"\n"+"基本操作执行的次数为:
"+(excuteNum2+excuteNum3);
}
}
********************************
利用分治法求解空中飞行管理问题
—算法效率分析说明
文档编号:
NUC-2013-C02-05
版本:
1.0
作者:
杨晓晨
打印日期:
2013.12.26
拷贝份数:
1
©2013中北大学计算机与控制工程学院
5.1空中飞行管理问题蛮力法效率分析
算法描述:
已知集合S中有n个点,一共可以组成n(n-1)/2对点对,蛮力法就是对
这n(n-1)/2对点对逐对进行距离计算,得出所有点对之间的距离,通过循环求得点集中的最近点对。
算法时间复杂度:
算法一共要执行n(n-1)/2次循环,因此算法复杂度为O(n2)。
5.2空中飞行管理问题分治法效率分析
算法描述:
首先对所有点d(x,y,z)进行从y轴升序排列,取midY为分割面,将所有点分到L和R两个空间块中,分别计算L与R中的最近点距离d1、d2,并取其中较小的d为dmin,在分割面左右距离为dmin的空间内寻找最近点对,并进行比较,最终得出最近点。
算法时间复杂度:
首先进行排序,为O(2nlogn)
接下来在分治过程中,O(n)=2O(n/2)+(n/2)*6
最终可得O(n)
********************************
—总结
文档编号:
NUC-2013-C02-06
版本:
1.0
作者:
杨晓晨
打印日期:
2013.12.26
拷贝份数:
1
©2013中北大学计算机与控制工程学院
6.1课程设计总结
通过对题目的分析,确定出问题的实质,并与算法相联系,分别运用蛮力法与分治法对最近对问题进行求解。
通过程序可以明显看出,对同一组点集,分治法的运行时间要小于蛮力法,并且二者的时间差距随着点数的增多而增大,说明分治法在算法上要优于蛮力法。
但是分治法要为多个数组开辟更多的空间,而蛮力法对空间需求较小。
这次课程设计已经是学习算法一年之后了,发现对算法的相当一部分知识掌握的很不好,同时对一些算法中的重要基础已经忘掉了。
对编程语言的应用上有很多不足,需要重新学习、研究。
这次课程设计提高了我对算法的认识,加强了我对于专业知识的理解,并增强了自己的动手能力,非常有用。