第8章-数论算法及计算几何算法.pptVIP

  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文档。上传文档
查看更多
第8章-数论算法及计算几何算法

第八章 数论算法及计算几何算法 8.5 凸包问题 1、问题提出 给定一个点集S={P0,P1,…,Pn-1},它的凸包是一个最小的凸多边形P,且满足S中的每个点或者在P的边界上或者在P的内部。 如果点集S是两个点的集合,显然它的凸包是连接这两个点的线段; 如果S是由三个不共线的点组成的集合,那么凸包是以这三个点为顶点的三角形; 如果三点共线,则凸包是以距离最远的两个点为端点的线段。 对于更大的集合,在直观上,可以把S中的每个点看作订在地上的木桩,那么凸包就是将所有木桩围起来的一个拉紧的橡皮绳的形状,如图8-1所示。 解决方法: 1、穷举搜索法 2、分治法 8.5.1凸包问题的穷举搜索法 1、算法思想 : 根据凸多边形的定义,对于一个由n个点组成的集合S中的任意两个点Pi和Pj,当且仅当该集合中的其它点要么位于穿过Pi和Pj直线的同侧,要么位于线段PiPj上。则线段PiPj是该集合凸多边形边界的一部分。对每一个点都做一遍检验之后,满足条件的线段就构成了该凸包的边界。 2、算法求解步骤 : 步骤1:对于集合中的任意两点Pi和Pj ,定义穿过两点Pi和Pj的直线方程 。 (x-xi) / (xj-xi) =(y-yi) / (yj-yi) 步骤2:将点集S中的其余点代入直线方程,然后检查是否位于线段同侧,如果不是,说明线段PiPj不是点集S的凸多边形的边界。 否则,PiPj是凸多边形的边界。 步骤3:对点集中的每个点,重复上述步骤1和步骤2,直到找出全部多边形的边界。 3、算法程序语言描述 详见课本 4、算法分析 点集中的点构成的线段数目最多为n(n-1)/2,对每一条线段,最坏情况要检查点集中其余n-2个点属于哪个半平面, 故算法的时间复杂性为O(n3) 子集S1的凸包由线段P0Pn-1作为下边界、多节链条作为上边界组成。这条上边界称为上包。 子集S2的凸包由线段P0Pn-1作为上边界、多节链条作为下边界组成。这条下边界称为下包。 整个集合的凸包由上包和下包构成。如图8-2所示。 2、算法求解步骤 构造上包步骤: 找到子集S1中的点Pmax,它是距离线段P0Pn-1最远的点 连接 ,找出S1中位于直线 左边的点,这些点构成集合S11;找出S1中位于直线 左边的点,这些点构成集合S12;△P0PmaxPn-1内部的点不予考虑。 递归构造S11和S12的上包,然后简单地将它们连接起来,得到S1的上包。 构造下包步骤: 找到子集S2中的点Pmin,它是距离线段P0Pn-1最远的点 连接 ,找出S2中位于直线 右边的点,这些点构成集合S21;找出S2中位于直线 右边的点,这些点构成集合S22;△P0PminPn-1内部的点不予考虑 递归构造S21和S22的下包,然后简单地将它们连接起来,得到S2的下包 。 3、 算法程序语言描述 详见课本 8.6最接近点对问题 1、问题提出 最接近点对问题要求给定平面上n个点组成的集合S,找出其中n个点组成的点对中距离最近的一对点 。 该问题具有很大的实际应用价值,例如,一个控制空中或者海上交通的系统就需要了解2个最近的交通工具,以预测可能产生的相撞事故。 2、解决问题方法 穷举搜索、分治法(略) 8.6.1最接近点对问题的穷举搜索法 1、算法思想 分别计算点集中每一对点的距离Dij,从中找出值最小的那对点。 为了避免点对的重复计算,算法只考虑i<j的情况. 2、算法描述 Double shortdis( ) {double temp=∞,d=0; for(int i=0; i<n-1;i++ ) for(int j=i+1; j<n,j++ ) d=sqrt( (pow( p[i].x-p[j].x)) , 2)+pow((p[i].y-p[j].y),2 ); if(d<tempt) {tempt=d; p1=p[i]; p2=p[j]; } } 3、算法分析 从算法描述可知循环体内的时间是常数时间,循环次数 , 因此算法的时间复杂性为O(n2) 。 一维情形下最小点对: 算法描述: Step1:用xm将x1,x2,…,xn分成两部分S1和S2 Step2:递归求S1中最接近点对,其距离为d1; Step3:递归求S2中最接近点对,其距离为d2; Step4:求S1中的最大值

文档评论(0)

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

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

1亿VIP精品文档

相关文档