5.分治法解最近对问题

本文介绍了一种利用分治法解决平面上n个点中寻找距离最近点对的问题,通过将点集分为两半并计算左右两侧及中间带内的最小距离,有效地减少了计算复杂度。

分治法求最近对

1. 问题

设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。

2. 解析

可以划一条垂线,把点集分成两半:PL和PR。于是最近点对或者在PL中,或者在PR中,或者PL,PR各有一点。
把三种距离情况定义为dL, dR, dC.
其中dL, dR可以递归求解,于是问题就变为计算dC。
设s=min(dL, dR). 通过观察能得出结论:如果dC<s,则只需计算dC。如果dC满足这样的条件,则决定dC的两点必然在分割线的s距离之内,称之为带(strip)
否则不可能满足dC<s, 于是缩小了需要考虑的点的范围。

3. 设计

   int ClosestPoints(int n, int x[ ], int y[ ]){ 
   minDist=Double.POSITIVE_INFINITY;; 
   for (i=1; i< n; i++) 
      for (j=i+1; j<=n; j++) 
     { 
         d=(x[i]-x[j])* (x[i]-x[j])+(y[i]-y[j])* (y[i]-y[j]); 
         if (d< minDist) { 
             minDist=d; 
             index1=i; 
             index2=j; 
        } 
      } 
     return  minDist; 
} 

4. 源码

https://github.com/Marshmello11/Algorithm/tree/master/Experiment_5

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值