收藏 分享(赏)

分而治之算法---距离最近的点对.doc

上传人:j35w19 文档编号:8703299 上传时间:2019-07-08 格式:DOC 页数:14 大小:37.50KB
下载 相关 举报
分而治之算法---距离最近的点对.doc_第1页
第1页 / 共14页
分而治之算法---距离最近的点对.doc_第2页
第2页 / 共14页
分而治之算法---距离最近的点对.doc_第3页
第3页 / 共14页
分而治之算法---距离最近的点对.doc_第4页
第4页 / 共14页
分而治之算法---距离最近的点对.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

1、分而治之算法-距离最近的点对距离最近的点对给定 n 个点(xi,yi) (1in) ,要求找出其中距离最近的两个点。例 14-7 假设在一片金属上钻 n 个大小一样的洞,如果洞太近,金属可能会断。若知道任意两个洞的最小距离,可估计金属断裂的概率。这种最小距离问题实际上也就是距离最近的点对问题。通过检查所有的 n(n- 1 ) / 2 对点,并计算每一对点的距离,可以找出距离最近的一对点。这种方法所需要的时间为(n2 )。我们称这种方法为直接方法。图 1 4 - 1 3 中给出了分而治之求解算法的伪代码。该算法对于小的问题采用直接方法求解,而对于大的问题则首先把它划分为两个较小的问题,其中一个问

2、题(称为 A)的大小为n /2,另一个问题(称为 B)的大小为n /2。初始时,最近的点对可能属于如下三种情形之一: 1) 两点都在 A 中(即最近的点对落在 A 中) ;2) 两点都在 B 中;3) 一点在 A,一点在 B。假定根据这三种情况来确定最近点对,则最近点对是所有三种情况中距离最小的一对点。在第一种情况下可对 A 进行递归求解,而在第二种情况下可对 B 进行递归求解。if (n 较小) 用直接法寻找最近点对R e t u r n ; / n 较大将点集分成大致相等的两个部分 A 和 B确定 A 和 B 中的最近点对确定一点在 A 中、另一点在 B 中的最近点对从上面得到的三对点中,

3、找出距离最小的一对点图 14-13 寻找最近的点对为了确定第三种情况下的最近点对,需要采用一种不同的方法。这种方法取决于点集是如何被划分成 A、B 的。一个合理的划分方法是从 xi(中间值)处划一条垂线,线左边的点属于 A,线右边的点属于 B。位于垂线上的点可在 A 和 B 之间分配,以便满足 A、B 的大小。例 2-8 考察图 14-14a 中从 a 到 n 的 1 4 个点。这些点标绘在图14-14b 中。中点 xi = 1,垂线 x = 1 如图 14-14b 中的虚线所示。虚线左边的点(如 b, c, h, n, i)属于 A,右边的点(如 a, e, f, j, k, l) 属于 B

4、。d, g, m 落在垂线上,可将其中两个加入 A, 另一个加入 B,以便 A、B 中包含相同的点数。假设 d ,m 加入 A,g 加入B。设是 i 的最近点对和 B 的最近点对中距离较小的一对点。若第三种情况下的最近点对比小。则每一个点距垂线的距离必小于,这样,就可以淘汰那些距垂线距离 的点。图 1 4 - 1 5 中的虚线是分割线。阴影部分以分割线为中线,宽为 2 。边界线及其以外的点均被淘汰掉,只有阴影中的点被保留下来,以便确定是否存在第三类点对(对应于第三种情况)其距离小于。用 RA、RB 分别表示 A 和 B中剩下的点。如果存在点对(p,q),p?A, q?B 且 p, q 的距离小

5、于,则 p?RA,q?RB。可以通过每次检查 RA 中一个点来寻找这样的点对。假设考察 RA 中的 p 点,p 的 y 坐标为 p.y,那么只需检查 RB 中满足 p.y- q.yp.y+ 的 q 点,看是否存在与 p 间距小于的点。在图 14-16a 中给出了包含这种 q 点的 RB 的范围。因此,只需将 RB 中位于2 阴影内的点逐个与 p 配对,以判断 p 是否是距离小于的第三类点。这个2 区域被称为是 p 的比较区(comparing region) 。例 2-9 考察例 2 - 8 中的 1 4 个点。A 中的最近点对为(b,h),其距离约为 0 . 3 1 6。B 中最近点对为(f

6、, j),其距离为 0 . 3,因此= 0 . 3。当考察是否存在第三类点时,除 d, g, i, l, m 以外的点均被淘汰,因为它们距分割线 x= 1 的距离 。RA =d, i, m,RB= g, l,由于 d 和 m 的比较区中没有点,只需考察 i 即可。i 的比较区中仅含点 l。计算 i 和 l 的距离,发现它小于,因此(i, l) 是最近的点对。为了确定一个距离更小的第三类点,RA 中的每个点最多只需和 RB 中的 6 个点比较,如图 1 4 - 1 6 所示。1. 选择数据结构为了实现图 1 4 - 1 3 的分而治之算法,需要确定什么是“小问题”以及如何表示点。由于集合中少于两

7、点时不存在最近点对,因此必须保证分解过程不会产生少于两点的点集。如果将少于四点的点集做为“小问题” ,就可以避免产生少于两点的点集。每个点可有三个参数:标号, x 坐标,y 坐标。假设标号为整数,每个点可用 P o i n t l 类(见程序 1 4 - 8)来表示。为了便于按 x 坐标对各个点排序,可重载操作符=。归并排序程序如 1 4 -3 所示。程序 14-8 点类class Point1 friend float dist(const Point1friend void close(Point1 *, Point2 *, Point2 *, int, int, Point1friend

8、 bool closest(Point1 *, int, Point1friend void main();p u b l i c :int operator= 2 个点中寻找最近点对/ 如果少于 2 个点,则返回 f a l s e/ 否则,在 a 和 b 中返回距离最近的两个点if (n m) Zg+ = Yi;else Zf+ = Yi;/ 对以上两个部分进行求解c l o s e ( X , Z , Y, l , m , a , b , d ) ;float dr;Point1 ar, br;c l o s e ( X , Z , Y, m + 1 , r, a r, b r, d r

9、 ) ;/ (a,b) 是两者中较近的点对if (dr d) a = ar;b = br;d = dr;M e r g e ( Z , Y,l,m,r);/ 重构 Y/ /距离小于 d 的点放入 Zint k = l; / Z 的游标for (i = l; i = r; i+)if (fabs(Ym.x - Yi.x) d) Zk+ = Yi;/ 通过检查 Z l : k - 1 中的所有点对,寻找较近的点对for (i = l; i k; i+)for (int j = i+1; j k j + + ) float dp = dist(Zi, Zj);if (dp d) / 较近的点对d =

10、 dp;a = XZi.p;b = XZj.p;函数 c l o s e(见程序 1 4 - 11)用来确定 X1:r 中的最近点对。假定这些点按 x 坐标排序。在 Y 1 : r 中对这些点按 y 坐标排序。Z 1 : r 用来存放中间结果。找到最近点对以后,将在a, b 中返回最近点对,在 d 中返回距离,数组 Y 被恢复为输入状态。函数并未修改数组 X。首先考察“小问题” ,即少于四个点的点集。因为分割过程不会产生少于两点的数组,因此只需要处理两点和三点的情形。对于这两种情形,可以尝试所有的可能性。当点数超过三个时,通过计算 m = ( 1 + r ) / 2 把点集分为两组 A 和 B

11、,X 1 : m 属于 A,X m + 1 : r 属于 B。通过从左至右扫描 Y 中的点以及确定哪些点属于A,哪些点属于 B,可以创建分别与 A 组和 B 组对应的,按 y 坐标排序的 Z 1 : m 和 Z m + 1 : r 。此时 Y 和 Z 的角色互相交换,依次执行两个递归调用来获取 A 和 B 中的最近点对。在两次递归调用返回后,必须保证 Z 不发生改变,但对 Y 则无此要求。不过,仅Y l : r 可能会发生改变。通过合并操作(见程序 1 4 - 5)可以以 Z 1 : r 重构 Y 1 : r 。为实现图 1 4 - 1 6 的策略,首先扫描 Y 1 : r ,并收集距分割线小

12、于的点,将这些点存放在 Z 1 : k - 1 中。可按如下两种方式来把 RA 中点 p 与 p 的比较区内的所有点进行配对:1) 与RB 中 y 坐标p.y 的点配对;2) 与 y 坐标p.y 的点配对。这可以通过将每个点 Z i (1i k,不管该点是在 RA还是在 RB 中)与 Zj 配对来实现,其中 ij 且 Z j . y - Z i . y 。对每一个 Z i ,在 2 区域内所检查的点如图 1 4 - 1 7 所示。由于在每个 2 子区域内的点至少相距。因此每一个子区域中的点数不会超过四个,所以与 Z i 配对的点 Z j 最多有七个。2. 复杂性分析令 t (n) 代表处理 n 个点时,函数 close 所需要的时间。当 n4时,t (n) 等于某个常数 d。当 n4 时,需花费(n) 时间来完成以下工作:将点集划分为两个部分,两次递归调用后重构 Y,淘汰距分割线很远的点,寻找更好的第三类点对。两次递归调用需分别耗时 t (n /2和 t (?n /2?).这个递归式与归并排序的递归式完全一样,其结果为 t (n) = (nl o gn)。另外,函数 c l o s e s t 还需耗时(nl o gn)来完成如下额外工作:对 X 进行排序,创建 Y 和 Z,对 Y 进行排序。因此分而治之最近点对求解算法的时间复杂性为(nl o gn)。

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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