蛮力法和分治法的性能比较Word格式.docx
- 文档编号:13601032
- 上传时间:2022-10-12
- 格式:DOCX
- 页数:11
- 大小:48.72KB
蛮力法和分治法的性能比较Word格式.docx
《蛮力法和分治法的性能比较Word格式.docx》由会员分享,可在线阅读,更多相关《蛮力法和分治法的性能比较Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
1.蛮力法
(1)基本思想
蛮力法求解最近对问题的过程是:
分别计算每一对点之间的距离,然后通过排序找出距离最小的一对,为了避免对同一对点计算两次距离,只考虑i<
j的那些点对(Pi,Pj)。
(2)复杂度分析
算法的基本操作是计算两个点的欧几里得距离。
在求欧几里得距离时,我们要避免求平方根操作,因为求平方根时要浪费时间,而在求解此问题时,求解平方根并没什么更大的意义。
如果被开方的数越小,则它的平方根也越小。
因此,算法的基本操作就是求平方即可,其执行次数为:
T(n)==2=n(n-1)=O(n)
2.分治法
用分治法解决最近对问题,就是将集合S分成两个子集S1和S2,每个子集中有n/2个点。
然后在每个子集中递归的求其最接近的点对,在求出每个子集的最接近点对后,关键问题是如何实现分治法中的合并步骤,如果组成S的最接近点对的2个点都在S1中或都在S2中,则问题很容易解决。
但是,如果这2个点分别在S1和S2中,则对于S1中任一点p,S2中最多只有n/2个点与它构成最接近点对的候选者,仍需计算才能得到准确结果。
应用分治法求解含有n个点得最近对问题,其时间复杂性可由下面的递推式表示:
T(n)=2T(n/2)+f(n)
合并子问题的解的时间f(n)=O
(1),由通用分治递推式的主定理可得:
T(n)=O(nlogn)
为提高算法效率,在算法中采用预排序技术,即在使用分治法之前,预先将S中的n个点依其y坐标排序好。
经过预排序处理后的算法所需的计算时间T(n)满足递归方程:
当n小于4时,T(n)=O
(1);
当n大于等于4时,T(n)=2T(n/2)+O(n)。
由此易知,T(n)=O(nlogn)。
预排序所需的计算时间显然为O(nlogn)。
因此,整个算法所需的计算时间为O(nlogn)在点的个数比较少的时候,蛮力法所用时间比分治法少,点数比较多的情况下,分治法的优势就很明显了,所用时间明显比蛮力法少。
算法描述
(1)蛮力法在最近对问题中的算法描述
程序:
importjava.util.*;
publicclassmanlifa{
publicstaticvoidmain(String[]args)
{
Scannerin=newScanner(System.in);
System.out.println("
有多少对点需要比较?
"
);
intn=in.nextInt();
int[]x=newint[n];
int[]y=newint[n];
请输入这些点,横坐标:
for(inti=0;
i<
n;
i++)
x[i]=in.nextInt();
}
请输入这些点,纵坐标:
y[i]=in.nextInt();
doubleminDist=Double.POSITIVE_INFINITY;
doubled;
intindexI=0;
intindexJ=0;
doublestartTime=System.currentTimeMillis();
//startTime
n-1;
for(intj=i+1;
j<
j++)
d=Math.sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
if(d<
minDist)
minDist=d;
indexI=i;
indexJ=j;
}
doubleendTime=System.currentTimeMillis();
//endTime
比较的点为:
("
+x[indexI]+"
"
+y[indexI]+"
)and("
+x[indexJ]+"
+y[indexJ]+"
)"
最近距离为:
"
+minDist);
基本语句用时"
+(endTime-startTime)+"
milliseconds!
}
运行结果:
(2)分治法在最近对问题中的算法描述
importjava.util.*;
publicclassfenzhifa
{
publicstaticvoidmain(String[]args)
intn=in.nextInt();
请输入这些点,x坐标和y坐标:
Point[]S=newPoint[n];
doublestartTime=System.currentTimeMillis();
for(inti=0;
intx=in.nextInt();
inty=in.nextInt();
S[i]=newPoint(x,y);
+S[i].getX()+"
+S[i].getY()+"
/**
*求出这点的x坐标的中位数mid
*/
intminX=(int)Double.POSITIVE_INFINITY;
intmaxX=(int)Double.NEGATIVE_INFINITY;
if(S[i].getX()<
minX)
minX=S[i].getX();
if(S[i].getX()>
maxX)
maxX=S[i].getX();
intmid=(minX+maxX)/2;
ArrayListpoint1=newArrayList();
ArrayListpoint2=newArrayList();
=mid)
point1.add(S[i]);
else
point2.add(S[i]);
Point[]S1=newPoint[point1.size()];
Point[]S2=newPoint[point2.size()];
point1.toArray(S1);
point2.toArray(S2);
sortX(S1);
sortX(S2);
doubleminDist1=Double.POSITIVE_INFINITY;
intindexI1=0;
intindexJ1=0;
S1.length-1;
for(intj=i+1;
S1.length;
doubled=Math.sqrt(Math.pow((S1[i].getX()-S1[j].getX()),2)+Math.pow((S1[i].getY()-S1[j].getY()),2));
if(d<
minDist1)
minDist1=d;
indexI1=i;
indexJ1=j;
doubleminDist2=Double.POSITIVE_INFINITY;
intindexI2=0;
intindexJ2=0;
S2.length-1;
S2.length;
doubled=Math.sqrt(Math.pow((S2[i].getX()-S2[j].getX()),2)+Math.pow((S2[i].getY()-S2[j].getY()),2));
minDist2)
minDist2=d;
indexI2=i;
indexJ2=j;
doubled1=Math.min(minDist1,minDist2);
ArrayList<
Point>
pp1=newArrayList<
();
pp2=newArrayList<
if((mid-S1[i].getX())<
d1)
pp1.add(S1[i]);
if((S2[i].getX()-mid)<
pp2.add(S2[i]);
Point[]P1=newPoint[pp1.size()];
Point[]P2=newPoint[pp2.size()];
pp1.toArray(P1);
pp2.toArray(P2);
*将P1和P2中的点按Y坐标升序排列
*/
sortY(P1);
sortY(P2);
doubled2=Double.POSITIVE_INFINITY;
P1.length;
for(intj=0;
P2.length;
if(Math.abs(P1[i].getY()-P2[j].getY())<
doubletemp=Math.sqrt(Math.pow((P1[i].getX()-P2[j].getX()),2)+Math.pow((P1[i].getX()-P2[j].getX()),2));
if(temp<
d2)
d2=temp;
doubleendTime=System.currentTimeMillis();
//endtime
doubleminDist=Math.min(d1,d2);
Sys
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蛮力法 分治 性能 比较
![提示](https://static.bdocx.com/images/bang_tan.gif)