基于递归法的最接近点对问题.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  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文档。上传文档
查看更多
基于递归法的最接近点对问题

基于递归法的最接近点对问题 目 录 1、 问题综述 2 2、 用递归法解决 2 2.1 一维情形下的分析 2 2.2 二维情形下的分析 3 2.3 算法优化 6 2.4 算法实现 6 3、结论 9 基于递归法的最接近点对问题 摘要:在计算机应用中,常用诸如点、圆等简单的几何对象表现现实世界中的实体。在涉及几何对象的问题中,常需要了解其邻域中其他几何对象的信息。例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来处理,则具有最大碰撞危险的两架飞机就是这个空间中最近的一点。这类问题是计算机几何学中研究的基本问题之一。本文就运用递归法对一维和二维的情况加以讨论。 关键词:最接近点对 递归法 问题综述 最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。 实际情况下,最接近点对可能多于一对,为简单起见 ,我们只找其中的一对作为问题的解。有一个最直观的方法就是将每一点与其他n-1个点的距离算出,找出达到最小距离的两点即可。然而,这样做效率太低,我们想到用递归法来解决这个问题。 2、 用递归法解决 将所给的平面上n个点的集合S分成两个子集S1和S2 ,每个子集中约有n/2个点 。然后在每个子集中递归地求其最接近的点对。在这里,一个关键的问题是如何实现递归法中的合并步骤,即由S1 和S2的最接近点对,如何求得原集合S中的最接近点对。如果组成S的最接近点对的两个点都在S1中或都在S2中,则问题很明显就可以找到答案。可是还存在另外一种可能,就是这两给点分别在S1和S2 中的时候。下面主要讨论这种情况。 2.1 一维情形下的分析 为使问题易于理解和分析,我们先来考虑一维的情形。此时,S中的n各点退化为x轴上的n个实数x1,x2,x3…xn。最接近点对即为这n个实数中相差最小的两个实数。我们尝试用递归法来求解,并希望推广到二维的情形。 假设我们用x轴上的某个点m将S划分为两个集合S1和S2 ,使得S1={x∈S | x≤m} ; S2 ={ x∈S | x>m }。这样一来,对于所有p∈和q∈S2 有p<q。 递归地在S1和S2 上找出其最接近点对{p1,p2}和{q1,q2},并设 d=min{| p1- p2|,| q1- q2|} 由此易知,S中的最接近进点对或者是{ p1 ,p2},或者是{ q1 ,q2},或者是某个{p3,q3},其中,p3∈S1且q3∈S2 。如图2-1-1所示。 图2-1-1 一维情形的递归法 我们注意到,如果S的最接近点对是{p3,q3},即|p3-q3|<d,则p3和q3两者与m的距离不超过d,即| p3-m|<d,| q3 -m|<d。也就是说 ,p3∈(m-d,m],q3∈(m,m+d]。由于每个长度为d的半闭区间至多包含S1中的一个点,并且m是S1和S2 的分割点,由图2-1-1可以看出,如果(m-d,m]中有S中点 ,则此点就是S1中最大点。同理,如果(m,m+d]中有S中点,则此点就是S2 中最小点。因此,我们用线性时间就能找到区间(m-d,m]和(m,m+d]中所有点,即p3和q3。从而我们用线性时间就可以将S1的解和S2 的解合并成为S的解。 但是,还有一个问题需要认真考虑,即分割点m的选取,即S1和S2 的划分。选取分割点m的一个基本要求是由此将S进行分割,使得S= S1∪S2 ,S1≠Φ,S2 ≠Φ,且S1∈{x|x≤m },S2 ∈{x| x>m }。容易看出,如果选取m={max(S)+min(S)}/2,可以满足分割要求。然而,这样选取分割点,有可能造成划分出的子集S1和S2 的不平衡 。例如在最坏情况下,| S1|=1,| S2 |=n-1,这样的计算效率与分割前相比提高幅度不明显。这种现象可以通过递归法中“平衡子问题”的方法加以解决。我们可以适当选择分割点m,使S1和S2 中有个数大致相等的点。我们会想到用S中各点坐标的中位数来作为分割点。 由此,我们设计出一个求一维点集S的最接近点对的算法Cpair 1如下: --------------------------------------------------------------- Bool Cpair 1(S,d) { N=|S|; if(n<2){ d=∞; return false; } m=S中各点坐标的中位数; //构造S1和S2 ; S1={x∈S | x≤m} ; S2 ={ x∈S | x>m }; Cpair 1(S1,d1); Cpair 1(S2 ,d2); p=max(S1); q

文档评论(0)

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

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

1亿VIP精品文档

相关文档