分治-最接近点问题
来源:互联网 发布: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
- 分治-最接近点问题
- 分治---最接近点对问题
- 分治法--最接近点对问题
- 最接近点对问题(分治法)
- 【分治法】最接近点对问题
- 分治法--最接近点对问题
- 分治法求最接近点对问题
- 分治法——最接近点问题
- HDU-5721 Palace(最接近点问题 分治)
- 【分治法】最接近点对问题
- 最接近点对问题(分治)
- 【分治法】最接近点对问题——Java 实现
- nlogn的二维最接近点对问题(分治)
- 最接近点对问题
- 最接近点对问题
- 最接近点对问题
- 最接近点问题
- 最接近点对问题
- #import #include @class的区别
- 瀑布流实现
- awt和Swing
- const限定符
- 第八天学习笔记
- 分治-最接近点问题
- 文章标题
- String literal is not properly closed by a double-quote
- PostgreSQL数据库导出导入
- 背包问题
- Java入门篇--HelloWorld
- C++笔试题目总结
- 关于C++程序中出现error C3872: "0xa0"错误解决办法
- 类和方法学习笔记(python)