计算机算法实验报告.docVIP

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算机算法实验报告

实验一 最接近点对问题 实验目的 为进一步学习分治策略的基本思想,本次实验将通过求最接近点对问题来加深我们对分治策略的认识。 实验问题描述 给定平面上N个点,找出其中的一对点,使得在n 个点组成的所有点对中,该点对间的距离最小。 设计思路及步骤 将所给平面上n个点的集合S分成两个子集S1和S2,每个子集中约有n/2个点。然后在每个子集中递归地求其最接近的点对。 先考虑一维的情形:设计一个求一维点集S的最接近点对的算法 Bool Cpairl(S,d) { N=|S|; if(n2) {d=无穷大;return falSe;} m=S中各点坐标的中位数; 构造S1和S2; //S1={x∈S|x=m},S2={x∈S|xm} Cpairl(S1,d1); Cpairl(S2,d2); p=max(S1); q=max(S2); D=min(d1,d2,q-p); return true; } 由此推广到二维的情形: 若矩形R中有多于6个S中的点,则由鸽舍原理易知,至少有一个(d/2)*(2d/3)的小矩形中有2个以上S中的点。设u,v是位于同一小矩形中的2个点,则 (x(u)-x(v))2+(y(u)-y(v))2=(d/2)2+(2d/3)2=25d2/36 因此 distance(u,v)=5d/6d,与d的意义相矛盾。 算法实现代码 //2d10-2?二维最邻近点对问题??? #includetime.h??? #includeiostream???? #includecmath??? using?namespace?std;?? const?int?M=50;?? //用类PointX和PointY表示依x坐标和y坐标排好序的点??? class?PointX?{?? public:??? int?operator=(PointX?a)const?? {?return?(x=a.x);?}?? int?ID;?//点编号??? float?x,y;?//点坐标???? };?? class?PointY?{??? public:??? int?operator=(PointY?a)const?? {?return(y=a.y);?}?? int?p;?//同一点在数组x中的坐标???? float?x,y;?//点坐标??? };?? float?Random();?? template?class?Type?? float?dis(const?Typeu,const?Typev);??? bool?Cpair2(PointX?X[],?int?n,PointX?a,PointX?b,?float?d);?? void?closest(PointX?X[],PointY?Y[],PointY?Z[],?int?l,?int?r,PointX?a,PointX?b,float?d);?? template?typename?Type??? void?Copy(Type?a[],Type?b[],?int?left,int?right);?? template?class?Type?? void?Merge(Type?c[],Type?d[],int?l,int?m,int?r);?? template?class?Type?? void?MergeSort(Type?a[],Type?b[],int?left,int?right);?? int?main()?? {??? srand((unsigned)time(NULL));?? int?length;?? cout请输入点对数:;?? cinlength;?? PointX?X[M];?? cout随机生成的二维点对为:endl;?? for(int?i=0;ilength;i++)?? {?? X[i].ID=i;?? X[i].x=Random();?? X[i].y=Random();?? cout(X[i].x,X[i].y)?;?? }?? PointX?a,b;??? float?d;?? Cpair2(X,length,a,b,d);??? coutendl;?? cout最邻近点对为:(a.x,a.y)和(b.x,b.y)?endl;?? cout最邻近距离为:?dendl;?? return?0;?? }?? float?Random()?? {?? float?result=rand()%10000;?? return?result*0.01;?? }?? //平面上任意两点u和v之间的距离可计算如下??? templat

文档评论(0)

wuyuetian + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档