package divideconquer;
import java.util.Arrays;
import java.util.Comparator;
class Point{
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class ClosestPairofPoints {
/**
* @param args
*/
public static double getCloseDis(Point[] points){
double min = Double.MAX_VALUE;
for(int i=0;i<points.length-1;i++){
for(int j=i+1;j<=points.length-1;j++){
double dis = Math.sqrt((Math.pow((points[i].x-points[j].x), 2)+Math.pow((points[i].y-points[j].y), 2)));
if(dis<min){
min = dis;
}
}
}
return min;
}
public static double getMin(double a,double b){
if(a<b)return a;
return b;
}
public static void ClosestPairof(Point[] points){
Point[] pointsy = new Point[points.length];
for(int i=0;i<pointsy.length;i++){
pointsy[i] = new Point(points[i].x, points[i].y);
}
Arrays.sort(points, new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
if(o1.x>=o2.x){
return 1;
}else{
return -1;
}
}
});
Arrays.sort(pointsy, new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
if(o1.y>=o2.y){
return 1;
}else{
return -1;
}
}
});
double count = ClosestPairofcore(points,pointsy,0,points.length-1,points.length);
System.out.println(count);
}
private static double ClosestPairofcore(Point[] points,Point[] pointsy, int left, int right,
int length) {
if(length<=3){
return getCloseDis(points);
}
int mid = (left+right)/2;
Point midP = points[mid];
Point[] pleft = new Point[mid+1];
Point[] pright = new Point[right-mid];
int i=0;int j=0;
for(int k=0;k<pointsy.length;k++){
if(pointsy[k].x<=midP.x){
pleft[i]=pointsy[k];
i++;
}else{
pright[j]=pointsy[k];
j++;
}
}
double leftdis = ClosestPairofcore(points, pleft, left, mid, mid-left+1);
double rightdis = ClosestPairofcore(points, pright, mid+1, right, right-mid);
double dis = getMin(leftdis, rightdis);
Point[] skip = new Point[length];
int size = 0;
for(int k=0;k<pointsy.length;k++){
if(pointsy[k].x-midP.x<=dis){
skip[size++]=pointsy[k];
}
}
double distwo = getSkipDis(skip,size,length);
return getMin(dis, distwo);
}
private static double getSkipDis(Point[] skip, int size, int dis) {
double min = Double.MAX_VALUE;
for(int i=0;i<size-1;i++){
for(int j=i+1;j<size&&(skip[j].y-skip[i].y<=dis);j++){
double diss = Math.sqrt(((Math.pow((skip[i].x-skip[j].x), 2)+Math.pow((skip[i].y-skip[j].y), 2))));
if(diss<min){
min = diss;
}
}
}
return min;
}
public static void main(String[] args) {
//Point P[] = {{2, 3}, {12, 30}, {40, 50}, {5, 1}, {12, 10}, {3, 4}};
Point[] points = new Point[6];
points[0] = new Point(2, 3);
points[1] = new Point(12, 30);
points[2] = new Point(40, 50);
points[3] = new Point(5, 1);
points[4] = new Point(12, 10);
points[5] = new Point(3, 4);
ClosestPairof(points);
}
}
最近点问题
最新推荐文章于 2022-04-19 16:23:44 发布