收藏 分享(赏)

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

上传人:gnk289057 文档编号:4715649 上传时间:2019-01-08 格式:DOC 页数:10 大小:93KB
下载 相关 举报
基于递归法的最接近点对问题.doc_第1页
第1页 / 共10页
基于递归法的最接近点对问题.doc_第2页
第2页 / 共10页
基于递归法的最接近点对问题.doc_第3页
第3页 / 共10页
基于递归法的最接近点对问题.doc_第4页
第4页 / 共10页
基于递归法的最接近点对问题.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、基于递归法的最接近点对问题目 录1、 问题综述 .22、 用递归法解决 .22.1 一维情形下的分析 .22.2 二维情形下的分析 .32.3 算法优化 .62.4 算法实现 .63、结论 .9基于递归法的最接近点对问题摘要:在计算机应用中,常用诸如点、圆等简单的几何对象表现现实世界中的实体。在涉及几何对象的问题中,常需要了解其邻域中其他几何对象的信息。例如,在空中交通控制问题中,若将飞机作为空间中移动的一个点来处理,则具有最大碰撞危险的两架飞机就是这个空间中最近的一点。这类问题是计算机几何学中研究的基本问题之一。本文就运用递归法对一维和二维的情况加以讨论。关键词:最接近点对 递归法1、 问题

2、综述最接近点对问题的提法是:给定平面上 n 个点,找其中的一对点,使得在 n 个点组成的所有点对中,该点对间的距离最小。实际情况下,最接近点对可能多于一对,为简单起见 ,我们只找其中的一对作为问题的解。有一个最直观的方法就是将每一点与其他 n-1 个点的距离算出,找出达到最小距离的两点即可。然而,这样做效率太低,我们想到用递归法来解决这个问题。2、 用递归法解决将所给的平面上 n 个点的集合 S 分成两个子集 S1 和 S2 ,每个子集中约有 n/2 个点 。然后在每个子集中递归地求其最接近的点对。在这里,一个关键的问题是如何实现递归法中的合并步骤,即由 S1 和 S2 的最接近点对,如何求得

3、原集合 S 中的最接近点对。如果组成 S 的最接近点对的两个点都在 S1 中或都在 S2 中,则问题很明显就可以找到答案。可是还存在另外一种可能,就是这两给点分别在 S1 和 S2 中的时候。下面主要讨论这种情况。2.1 一维情形下的分析为使问题易于理解和分析,我们先来考虑一维的情形。此时,S 中的 n 各点退化为 x轴上的 n 个实数 x1,x 2,x 3xn。最接近点对即为这 n 个实数中相差最小的两个实数。我们尝试用递归法来求解,并希望推广到二维的情形。假设我们用 x 轴上的某个点 m 将 S 划分为两个集合 S1 和 S2 ,使得 S1=xS | xm ;S2 = xS | xm 。这

4、样一来,对于所有 p和 qS 2 有 pq。递归地在 S1 和 S2 上找出其最接近点对p 1,p 2和q 1,q 2,并设d=min| p1- p2|,| q 1- q2|由此易知,S 中的最接近进点对或者是 p 1 ,p 2,或者是 q 1 ,q 2,或者是某个p 3,q 3,其中,p 3S 1 且 q3S 2 。如图 2-1-1 所示。图 2-1-1 一维情形的递归法我们注意到,如果 S 的最接近点对是p 3,q 3,即|p 3-q3|d,则 p3 和 q3 两者与 m 的距离不超过 d,即| p3-m|d,| q3 -m|d。也就是说 ,p 3(m-d,m ,q 3(m,m+d。由于每

5、个长度为 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= S1S 2 ,S 1,S 2 ,且S1x|xm

6、 ,S2 x| xm 。容易看出,如果选取 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(n2)d=;return

7、false;m=S 中各点坐标的中位数;/构造 S1 和 S2 ;S1=x S | xm ;S2 = xS | xm ;Cpair 1(S1,d1);Cpair 1(S2 ,d2);p=max(S1);q=min(S2 );d=min(d1,d2,q-p);return true-2.2 二维情形下的分析以上一维算法可以推广到二维的情形。设 S 中的点为平面上的点,它们都有两个坐标值 x 和 y。为了将平面上点集 S 线性分割为大小大致相等的两个子集 S1 和 S2 ,我们选取一垂直线 L:x=m 来作为分割直线。其中,m 为 S 中各点 x 坐标的中位数。由此将 S 分割为 S1=pS |

8、x (p) m 和 S2 =pS | x (p) m 。从而使 S1 和 S2 分别位于直线 L 的左侧和右侧,且 S=S1S 2 。由于 m 是 S 中各 x 坐标的中位数,因此 S1 和 S2 中得点数大致相等。递归地在 S1 和 S2 上解最接近点对问题,我们分别得到 S1 和 S2 中的最小距离 d1和 d2。现设 d=mind1,d2。若 S 的最接近点对(p,q) 之间的距离小于 d,则 p 和 q 必分属于S1 和 S2 。不妨设 pS 1,q S2 。那么 p 和 q 距直线 L 的距离均小于 d。因此,若我们用P1 和 P2 分别表示直线 L 的左边和右边的宽为 d 的两个垂

9、直长条区域,则 pP 1 且 qP 2,如图 2-2-1 所示。图 2-2-1 距直线 L 的距离小于 d 的所有点在一维情形下 ,距分割点距离为 d 的两个区间(m-d,m和(m,m+d中最多各有 S中一个点。因而这两点成为唯一的未检查过的最接近点对候选者。二维的情形则要复杂些。此时,P 1 中所有点和 P2 中所有点构成的点对均为最接近点对的候选者。在最坏的情况下有n2/4 对这样的候选者。考虑 P1 中任意一点 p,它若与 P2 中的点 q 构成最接近点对的候选者,则必有 distance(p,q) d。满足这个条件的 P2 中的点有多少个呢?容易看出这样的点一定落在一个 d*2d 的矩

10、形 R 中,如图 2-2-2 所示。图 2-2-2 包含点 q 的 d*2d 矩形 R由 d 的意义可知,P 2 中任何两个 S 中的点的距离都不小于 d。由此可以推出矩形 R 中最多只有 6 个 S 中的点。下面我们来证明这个结论 。我们可以将矩形 R 的长为 2d 的边 3 等分,将它的长为 d 的边 2 等分,由此导出 6 个(d/2)*(2d/3)的矩形。如图 2-2-3(a) 所示。如图 2-2-3 矩形 R 中点的稀疏性若矩形 R 中有多于 6 个 S 中的点,则由鸽舍原理 1易知至少有一个( d/2)*(2d/3)的小矩形中有 2 个以上 S 中的点。设 u,v 是这样 2 个点

11、,它们位于同一小矩形中,则(x(u)-x(v) ) 2+(y(u)-y(v) ) 2 (d/2) 2+(2d/3 ) 2=25/36d2因此, distance(u,v) 5d/6 d。这与 d 的意义相矛盾。也就是说矩形 R 中最多只有6 个 S 中的点。1 鸽舍原理也称“抽屉原理” ,一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有 n+1 或多于 n+1 个元素放到 n 个集合中去,其中必定至少有一个集合里至少有两个元素。 ”图 2-2-3(b)是矩形中恰有 6 个 S 中点的极端情形。由于这种稀疏性质 ,对于 P1 中任意一点 p,P 2 中最多只有 6 个

12、点与它构成最接近点对的候选者。因此,在递归法的合并步骤中,我们最多只需要检查 6*n/2=3n 个候选者,而不是 n2/4 个候选者。我们将 p 和 P2 中所有 S2 的点投影到垂直线 L 上。由于能与 p 点一起构成最接近点对候选者的 S2 中点一定在矩形 R 中,所以它们在直线 L 上的投影点距 p 在 L 上投影点的距离小于 d。由上面的分析可知, 这种投影点最多只有 6 个。因此,若将 P1 和 P2 中所有S 中点按其 y 坐标排好序,则对 P1 中所有点,对排好序的点列做一次扫描,就可以找出所有最接近点对的候选者。对 P1 中每一点最多只要检查 P2 中排好序的相继 6 个点。至

13、此,我们给出用递归法求二维点集最接近点对的算法 Cpair 2 如下:-bool Cpair 2(S,d)N=|S|;If(nm 2. Cpair 2(S1,d1);Cpair 2(S2 ,d2);3. dm=min(d1,d2);4. 设 P1 是 S1 中距垂直分割线 L 的距离在 dm 之内的所有点组成的集合;P2 是 S2 中距分割线 L 的距离在 dm 之内所有点组成的集合;将 P1 和 P2 中点依其 y 坐标值排序;并设 X 和 Y 是相应的已经排好序的点列;5. 通过扫描 X 以及对于 X 中每个点检查 Y 中与其距离在 dm 内的所有点(最多 6 个)可以完成合并;当 X 中

14、的扫描指针逐次向上移动时, Y 中的扫描指针可在宽为 2dm 的一个区间内移动;设 dl 是按这种扫描方式找到的点对间的最小距离;6. d=min(dm,dl);return true;-2.3 算法优化在以上二维情形下的算法中,在每次执行第 4 步时都要进行排序,这将花费较多的时间,从而增加算法的复杂度。因此,在这里我们要作一个技术处理。我们采用设计算法时常用的预排序技术,在使用递归法之前,预先将 S 中 n 个点依其 y 坐标值排好序,设排好序的点列为 P*。在执行递归法的第 4 步时,只要对 P*作一次线性扫描,即可抽取出我们所需要的排好序的点列 X 和 Y。然后,在第 5 步时再对 X

15、 作一次线性扫描,即可求得 dl。2.4 算法实现在具体实现算法 Cpair 2 时,我们分别用类 Point X 和 Point Y 表示依 x 坐标和依 y 坐标排序的点。-Class Point XPublic:Int operatorInline float distance(const Type Float dy=u.y-v.y;Return sqrt(dx * dx + dy * dy);-在算法 Cpair 2 中,用数组 X 存储输入的点集。在算法的预处理阶段,将数组 X 中的点依 x 坐标和依 y 坐标排序,排好序的点集分别存储在数组 X 和数组 Y 中。事实上,我们只要取

16、m=(L+r)/2,则 XL:m和 Xm+1:r就是满足要求的分割。依 y 坐标排好序的数组 Y用于在算法的合并步中快速检查 d 矩形条内最接近点对的候选者。-Bool Cpair 2(Point X X,int n,Point XElseZf+ = Yi ;Closest (X,Z,Y,L,m,a,b,d);Float dr;Point X ar ,br;Closest (X,Y,Z,m+L,r,ar,br,dr);If (drd) a = ar;b = br;d =dr;Merge(Z,Y,L,m,r); /重构数组 Y/d 矩形条内的点置于 Z 中Int k = L;For (int i

17、 = L, i= r, i+)If(fabs(Ym.x Yi.x)d)Zk+=Yi; /搜索 ZL:k-1For(int i = L;i=k;i+)For (int j =i+1;jk j+)Float dp = distance (Zi,Zj);If (dp p)d = dp;a =XZi.p;b =XZj.p;3、结论3.1.对于一类问题,如果该问题规模为 n,但是可以分解为 k 个互相独立且与原问题相同的规模较小的子问题的话,我们就可以运用递归法,递归的解决这些子问题,然后将各子问题的解合并得到原问题的解。 3.2 通过对最接近点对问题的解决 ,熟悉了解决问题的基本步骤和方法:首先对问题进行分类,然后运用该类问题的处理思路进行算法的设计,最后还要考察所设计算法的复杂性,进一步进行优化处理。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报