ImageVerifierCode 换一换
格式:DOC , 页数:5 ,大小:89KB ,
资源ID:234731      下载积分:15 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/234731.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(分治法最近对问题.doc)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

分治法最近对问题.doc

1、算法设计与分析实验报告学 号: 姓 名: 日 期: 得 分: 一、 实验内容:分治法和蛮力法求最近对问题及其时间复杂度比较。二、所用算法的基本思想及复杂度分析:1.蛮力法求最近对问题:1) 基本思想:分别计算每一对点之间的距离,然后找出距离最小的那一对,为了避免对同一对点计算两次距离,只考虑的那些点对。2)复杂度分析:对于此算法,主要就是算两个点的欧几里得距离。注意到在求欧几里得距离时,避免了求平方根操作,其原因是:如果被开方的数越小,则它的平方根也越小。所以复杂度就是求平方,求执行次数为:;即时间复杂度为。2.分治法求最近对问题:1)基本思想:用分治法解决最近点对问题,就是将一个问题分解两个

2、子问题,然后递归处理子问题,然后合并。可能两个点在每个子问题中,也可能两个点分别在两个子问题中,就这两种情况。则基本过程为:找一条中垂线(坐位集合坐标的中位数)把个元素分成左右两部分元素,然后分别求得两边的最短距离,,然后取两者中的最小者记为,在中线两边分别取的距离,记录该距离范围内点的个数,中线左边有个元素,右边有个元素,分别将两边的点按y坐标升序排列,在左边集合中每一个点,找右边集合的点,找到与之距离小于的点,更新最短距离,直到循环结束,即可求出最短距离。2)复杂度分析:应用分治法求解含有个点的最近对问题,其时间复杂性可由递推式表示:。由以上分析:合并子问题的解的时间。进而可得分治法求最近

3、对问题的时间复杂度为:。三、 源程序及注释:#include#include#include#include#includeusing namespace std;#define eps 1e-8#define MAXN 10000000#define N 5000struct Pointdouble x,y;Point SN*2,S1N,S2N,P1N,P2N;double Distance(Point a,Point b) return sqrt(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);int cmp1(Point a, Point b)return

4、a.xb.x;int cmp2(Point a, Point b)return a.yb?b:a;/分治法求最近对问题double ClosestPoints1(Point S,int n)int i,j,m;if (n2) return MAXN; elsedouble d0=MAXN;double d,d1,d2;int k1=0;int k2=0;int j1=0;int j2=0;sort(S,S+n,cmp1);Point p=Sn/2;m=p.x;/m=S中各点x坐标的中位数for(i=0;i(n+1)/2;i+)S1j1.x=Si.x;S1j1.y=Si.y;j1+;/构造S1中

5、点的坐标小于mfor(i=(n+1)/2;in;i+)S2j2.x=Si.x;S2j2.y=Si.y;j2+;/构造S2中点的坐标大于md1=ClosestPoints1(S1,j1);d2=ClosestPoints1(S2,j2);d=min(d1,d2);for (i=0;ij1;i+)if (m-S1i.xd)P1k1.x=S1i.x;P1k1.y=S1i.y;k1+;/构造P1为S1中点的坐标与m的距离小于d的点集for (i=0;ij1;i+)if (S2i.x-md)P2k2.x=S2i.x;P2k2.y=S2i.y;k2+;/构造P2为S2中点的坐标与m的距离小于d的点集sor

6、t(P1,P1+k1,cmp2);/将P1中的点按y坐标升序排列sort(P2,P2+k2,cmp2);/将P2中的点按y坐标升序排列for(i=0;ik1;i+)for(j=0;jk2;j+)double ans=Distance(P1i,P2j);d0=min(d0,ans);/求最小距离return min(d0,d);/蛮力法求最近对问题double ClosestPoints2(Point S,int n) double d0=MAXN; for(int i=0;in;i+) for(int j=i+1;jn;j+) double d=Distance(Si,Sj);if(dd0)d

7、0=d; return d0;/测试两种算法int main()int n=5000;int i;srand(unsigned)time(NULL);for(i=0;in;i+)Si.x=rand()/(double)(RAND_MAX/10000);Si.y=rand()/(double)(RAND_MAX/10000); /产生随机点集clock_t start1,end1,start2,end2;start1=clock();double d1=ClosestPoints1(S,n);end1=clock();start2=clock();double d2=ClosestPoints2

8、(S,n);end2=clock();cout分治法求最近对问题运行时间及结果endldouble(end1-start1)/CLOCKS_PER_SEC d1endl;cout蛮力法求最近对问题运行时间及结果endldouble(end2-start2)/CLOCKS_PER_SEC d2endl;return 0;四、 运行输出结果:比较运行结果,得出结论,分治法与蛮力法所求结果相同,从运行时间上来讲分治法运行远远快于蛮力法。五、调试和运行程序过程中产生的问题、采取的措施及获得的相关经验教训:1.课本只给出了伪代码,具体的实验要靠自己动手上机反复实验才能完成。要通过赋简单值法来初步检验程序的是否正确,再以相同数据检验两种方法的运行结果是否一致来进一步判断程序是否正确,同时使得两种算法的比较更加公平,实验更有可信度。2.要比较分治法和蛮力法求最近对问题的时间复杂度,就要两者各自的运行时间。为此,必须要有大量数据,便利用了rand()函数产生大量随机数,还增加了实验可信度。3.不要太迷信课本。其中课本上伪代码的函数返回值类型定义为int型,使得赋简单值时运行结果始终为0,注意到这一点,将int改为double才得到了较准确的运行结果。所以,编程是要自己多动脑思考,才能真正解决问题。5

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1