用JAVA实现计算平面最近点对问题

刚写的作业,就贴核心的这一段。求最近点对之前要两次排序。

public static Pair closePair(Point1[] x, Point2[] y, Point2[] z, int left, int right){
  if(right-left == 1)//2点情形
   return new Pair(x[left], x[right], dist(x[left], x[right]));
  
  if(right-left == 2){//3点情形
   double d1 = dist(x[left], x[left+1]);
   double d2 = dist(x[right], x[left+1]);
   double d3 = dist(x[left], x[right]);
   
   if(d1<=d2 && d1<=d3)
    return new Pair(x[left], x[left+1], d1);
   if(d2<=d3)
    return new Pair(x[left+1], x[right], d2);
   else
    return new Pair(x[left], x[right], d3);
  }
  //多于3点的情形,分治法解决
  int mid = (left+right)/2;
  int i, j, k;
  for(i=left, j=left, k=mid+1; i<=right; i++){
   if(y[i].p>mid)
    z[k++] = y[i];
   else
    z[j++] = y[i];
  }
  //递归求解
  Pair dp1 = closePair(x, z, y, left, mid);
  Pair dp2 = closePair(x, z, y, mid+1, right);
  if(dp1.dist > dp2.dist)
   dp1 = dp2;
  merge(y, z, left, mid, right);//数组z左右部分分别是对y坐标有序的, 将其合并到y数组
  //将d矩形条内的点置于z[]中
  for(i=left, k=left; i<=right; i++){
   if(Math.abs(x[mid].x-y[i].x)<dp1.dist)
    z[k++] = y[i];
  }
  //搜索z[]
  for(i=left; i<k; i++){
   for(j=i+1; j<k && (z[j].y-z[i].y)<dp1.dist; j++){
    double dp = dist(z[i], z[j]);
    if(dp<dp1.dist)
     dp1 = new Pair(x[z[i].p], x[z[j].p], dp);
   }
  }
  return dp1;

 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值