递归分支的思想求最近对问题

//递归分支的思想求最近对问题
public class ClosestPair {
    
    public static String closestpair(Point[] p,int start,int end){
        if(start<end){
            String s1=closestpair(p,start,start+(end-start)/2);
            String s2=closestpair(p,start+(end-start)/2+1,end);
            String[] res=(s1+","+s2).split(",");//点对及点对间的距离
            double[] re=new double[res.length];//转换字符串res
            double dis, dis1,dis2;
            for(int i=0;i<res.length;i++){
                String str=res[i];
                if(str!=null)
                  re[i]=Double.parseDouble(str);
            }
            dis1=re[re.length/2+re.length%2-1];//第一个最近对的距离
            dis2=re[re.length/2+re.length%2+1];//第二个最近对的距离
            if(dis1<=dis2) dis=dis1;
            else dis=dis2;
            for(int i=start;i<=start+(end-start)/2;i++){
                if(p[end/2].x-dis<=p[i].x){
                    for(int j=start+(end-start)/2+1;j<=end;j++){
                        if(p[j].y<=p[i].y+dis&&p[j].y>=p[i].y-dis&&p[j].x<=p[end/2].x+dis){
                            dis1=Math.sqrt((p[j].x-p[i].x)*(p[j].x-p[i].x)+(p[j].y-p[i].y)*(p[j].y-p[i].y));
                            if(dis1<dis) {dis=dis1;re[0]=i;re[1]=j;re[2]=dis;s1=i+","+j+","+dis;}
                        }
                    }
                }
            }
            //System.out.println("最近对为: "+s1);
            //System.out.println("最近对为: ("+p[(int)re[0]].x+","+p[(int)re[0]].y+")-->("+p[(int)re[1]].x+","+p[(int)re[1]].y+") 距离为:"+re[2]);
            return s1;
        }
        else return start+","+"65535";//当有一个点的时候设他的距离为无限大
        
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
       Point[] p=new Point[]{new Point(1,0),new Point(2,4),new Point(4,7), new Point(10,20),new Point(-1,0)};//Point是自定义类
        String[] res=closestpair(p,0,p.length-1).split(",");//返回的最近对由字符串表示,格式为    第一个点的下标,第二个点的下标,距离
        double[] re=new double[res.length];//转换字符串res
        for(int i=0;i<res.length;i++){
            String str=res[i];
            if(str!=null)
              re[i]=Double.parseDouble(str);
        }
        System.out.println("最近对为: ("+p[(int)re[0]].x+","+p[(int)re[0]].y+")-->("+p[(int)re[1]].x+","+p[(int)re[1]].y+") 距离为:"+re[2]);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值