1. 程式人生 > >分治——最近點對

分治——最近點對

ddl package pack node poi 距離 quicksort start 2.x

代碼有點長

仍在奮鬥,提升技能 (? ??_??)? (*?????)?

public class pointNode {      //定義坐標結構
    double x;
    double y;
}

public class PArray {          //定義個坐標數組類
         pointNode []pN;
}

public class distance {     //兩坐標所構成的邊
    
    pointNode p1;
    pointNode p2;
    double dis;
}


*
 * 定義一個方法類,裏面包含實現該算法的一些方法;
 
* */ public class staticMethod { static double min(distance d1,distance d2){ // 返回兩條邊長度最小的那條邊 return d1.dis>d2.dis?d2.dis:d1.dis; } static double Distance(pointNode p1,pointNode p2){ //求兩點間的距離 return Math.sqrt((p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y)); }
static pointNode[] quickSort(pointNode pN[],char ch){ //用快速排序對x軸或y軸排序 ,ch表示x或y軸 double d[]=new double[pN.length]; if(ch==‘x‘){ for(int i=0;i<d.length;i++){ d[i]=pN[i].x; } } else{
for(int i=0;i<d.length;i++){ d[i]=pN[i].y; } } int t=d.length-1; pN=quickSort(0,d.length-1,pN,d); return pN; } private static pointNode[] quickSort(int start,int end,pointNode pN[],double d[]){ // 快排 int left=start+1,right=end; while(left<right){ while((d[right]>d[start])){right--;} if(right>left){ d[left]=d[right];pN[left++]=pN[right];} while((d[left]<d[start])){left++;} if(right>left){ d[right]=d[left];pN[right++]=pN[left];} d[left]=d[start]; pN[left]=pN[start]; } return pN; } } package 最近點對; public class theShortestDistance { public static void main(String a[]){ PArray p=new PArray(); p.pN=new pointNode[6]; //輸入點對坐標 for(int i=0;i<6;i++){ p.pN[i]=new pointNode(); } p.pN[0].x=1; p.pN[0].y=1; p.pN[1].x=2; p.pN[1].y=2; p.pN[2].x=4; p.pN[2].y=4; p.pN[3].x=7; p.pN[3].y=3; p.pN[4].x=9; p.pN[4].y=1; p.pN[5].x=10; p.pN[5].y=1; //結束輸入 distance dis=new distance(); //申請一條邊 tsd(0,5,p,dis); System.out.println("p1.x "+dis.p1.x+" p1.y "+dis.p1.y+" p2.x "+dis.p2.x+" p2.y "+dis.p2.y+" dis "+dis.dis); } public static void tsd(int start ,int end ,PArray p,distance dis){ if(start<end){ if(end-start==1){ dis.p1=p.pN[start]; dis.p2=p.pN[end]; dis.dis=staticMethod.Distance(dis.p1,dis.p2); } else{ distance d1,d2; d1=new distance(); d2=new distance(); tsd(start,(start+end)/2,p,d1); tsd((start+end)/2,end,p,d2); merge(start,end,p,d1.dis<d2.dis?d1:d2,dis); d1=d2=null; } } } public static void merge(int start,int end ,PArray p,distance dis1,distance dis){ if(end-start==2){ dis.p1=p.pN[start]; dis.p2=p.pN[end]; dis.dis=staticMethod.Distance(dis.p1, dis.p2); if(dis.dis>dis1.dis){ dis.p1=dis1.p1; dis.p2=dis1.p2; dis.dis=dis1.dis; } return ; } PArray p1=new PArray(); p1.pN=new pointNode[end-start+1]; int middle=(start+end)/2; int j=0; for(int i=0;i<end-start+1;i++){ if(Math.abs(p.pN[i].x-p.pN[middle].x) <= dis1.dis/2){ p1.pN[j++]=p.pN[i]; } } PArray p2=new PArray(); p2.pN=new pointNode[j]; for(int i=0;i<j;i++){ p2.pN[i]=p1.pN[i]; } p1.pN=staticMethod.quickSort(p2.pN,‘y‘); //對y坐標排序; j=0; for(int i=0;i<j;i++){ //篩選 if(Math.abs(p1.pN[i].y-p1.pN[j/2].y)<=dis1.dis/2){ p2.pN[j++]=p1.pN[i]; } } tsd(0,j-1,p,dis); if(dis.p1==null){ dis.p1=dis1.p1; dis.p2=dis1.p2; dis.dis=dis1.dis; } p1=p2=null; } }

分治——最近點對