递归分支的思想求最近对问题
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]);
}
}
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]);
}
}
相关文章推荐
- Rabbitmq集群搭建笔记
- 垃圾回收器种类
- cocos2dx精灵变灰
- 安卓的开发步骤
- Timer计时不准确的解决方案 每次都重新调整,修正误差
- 3. Python 简介
- 报文拼接与解析
- C++对象模型5--多继承下的对象模型
- JAVA的类名与文件名必须一致
- sql查询
- namespace的用法
- JXL Excel模版模版下载(1)
- 如何让android studio在运行时自带签名
- SQL Server 2008数据库被标记为可疑的解决方法
- 多个数的最小公倍数 HDU1019
- javascript实现禁止鼠标滚轮事件
- 用kd树的最近邻搜索
- 黑马程序员——Java集合之Collection
- LVM详解
- 武汉学员,我们和传智播客boss在一起