分治-最接近点问题

来源:互联网 发布:mac版spss23 编辑:程序博客网 时间:2024/05/01 14:21

u为了使问题易于理解和分析,先来考虑一维的情形。此时,S中的n个点退化为x轴上的n个实数 x1,x2,…,xn。最接近点对即为这n个实数中相差最小的2个实数。

Ø假设我们用x轴上某个点m将S划分为2个子集S1和S2 ,基于平衡子问题的思想,用S中各点坐标的中位数来作分割点。
Ø递归地在S1和S2上找出其最接近点对{p1,p2}和{q1,q2},并设d=min{|p1-p2|,|q1-q2|},S中的最接近点对或者是{p1,p2},或者是{q1,q2},或者是某个{p3,q3},其中p3∈S1且q3∈S2。
Ø能否在线性时间内找到p3,q3

u如果S的最接近点对是{p3,q3},即|p3-q3|<d,则p3和q3两者与m的距离不超过d,即p3∈(m-d,m],q3∈(m,m+d]。
u由于在S1中,每个长度为d的半闭区间至多包含一个点(否则必有两点距离小于d),并且m是S1和S2的分割点,因此(m-d,m]中至多包含S中的一个点。由图可以看出,如果(m-d,m]中有S中的点,则此点就是S1中最大点。
u因此,我们用线性时间就能找到区间(m-d,m]和(m,m+d]中所有点,即p3和q3。从而我们用线性时间就可以将S1的解和S2的解合并成为S的解。
u下面来考虑二维的情形。
Ø选取一垂直线l:x=m来作为分割直线。其中m为S中各点x坐标的中位数。由此将S分割为S1和S2。
Ø递归地在S1和S2上找出其最小距离d1和d2,并设d=min{d1,d2},S中的最接近点对或者是d,或者是某个{p,q},其中p∈P1且q∈P2。
Ø能否在线性时间内找到p,q
u考虑P1中任意一点p,它若与P2中的点q构成最接近点对的候选者,则必有distance(p,q)<d。满足这个条件的P2中的点一定落在一个d×2d的矩形R中
u由d的意义可知,P2中任何2个S中的点的距离都不小于d。由此可以推出矩形R中最多只有6个S中的点。
u因此,在分治法的合并步骤中最多只需要检查6×n/2=3n个候选者
double cpair2(S){      n=|S|;      if (n < 2) return ;1、m=S中各点x间坐标的中位数;      构造S1和S2;      //S1={p∈S|x(p)<=m},      S2={p∈S|x(p)>m}2、d1=cpair2(S1);      d2=cpair2(S2);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中的扫描指针逐次向上移动时,Y中的扫描指针可在宽为2dm的区间内移动;      设dl是按这种扫描方式找到的点对间的最小距离;6、d=min(dm,dl);      return d;}



0 0
原创粉丝点击