Advertisement
Guest User

Untitled

a guest
Dec 7th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.62 KB | None | 0 0
  1. public static double closestPair(List<Point> points) {
  2.     List<Point> ys = new ArrayList<>(points);
  3.     Util.sortByY(ys);
  4.     Util.sortByX(points);
  5.     return closest(points, ys);
  6.   }
  7.  
  8.   public static double closest(List<Point> points, List<Point> pointsY){
  9.     int size = points.size();
  10.     if (size <= 3){
  11.       return Util.bruteForce(points);
  12.     }
  13.    
  14.     int mid = size/2;
  15.     Point midPoint = points.get(mid);
  16.    
  17.     List<Point> left = points.subList(0, mid);
  18.     List<Point> right = points.subList(mid, points.size());
  19.    
  20.     List<Point> smthleft = new ArrayList<>();
  21.     List<Point> smthright = new ArrayList<>();
  22.     for (Point point : pointsY){
  23.       if (point.x < midPoint.x){
  24.         smthleft.add(point);
  25.       }
  26.       else {
  27.         smthright.add(point);
  28.       }
  29.     }
  30.    
  31.     double dl = closest(left, smthleft);
  32.     double dr = closest(right, smthright);
  33.    
  34.     double d = (dl > dr) ? dr : dl;
  35.    
  36.     List<Point> midStrip = new ArrayList<>();
  37.    
  38.     double midX = left.get(left.size() - 1).x;
  39.    
  40.     for (Point p : pointsY){
  41.       if (Math.abs(p.x - midX) <= d){
  42.         midStrip.add(p);
  43.       }
  44.     }
  45.    
  46.     for (int i = 0; i < midStrip.size() - 1; i++) {
  47.       Point point1 = midStrip.get(i);
  48.       // midStrip.size() && (midStrip.get(j).y - midStrip.get(i).y < d)
  49.       for (int j = i + 1; j < midStrip.size() && (midStrip.get(j).y - midStrip.get(i).y < d); j++) {
  50.         Point point2 = midStrip.get(j);
  51.         double distance = Util.distance(point1, point2);
  52.         if (distance < d) {
  53.           d = distance;
  54.         }
  55.       }
  56.     }
  57.    
  58.     return d;
  59.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement