您的位置:首页 > 其它

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

2015-07-24 15:19 239 查看
//递归分支的思想求最近对问题

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]);

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: