2.11 寻找最近点对
在编程之美中,对最近点对的处理采用分治法来减少时间复杂度。具体算法省略,Java实现代码见下
1.Point类用来保存点的坐标
1 package edu.test.algorithm; 2 3 public class Point implements Comparable<Point> { 4 public int x; 5 public int y; 6 public boolean sortFlag = true;// true:x;false:y; 7 8 public int compareTo(Point o) { 9 // TODO Auto-generated method stub 10 if (sortFlag) { 11 return (this.x - o.x); 12 } else { 13 return this.y - o.y; 14 } 15 } 16 17 public float distance(Point o) { 18 return (float) Math.sqrt((this.x - o.x) * (this.x - o.x) 19 + (this.y - o.y) * (this.y - o.y)); 20 } 21 22 public String toString() { 23 return "(" + this.x + "," + this.y + ")"; 24 25 } 26 27 }
2.closetPoint类(实现分治算法)
1 package edu.test.algorithm; 2 3 import java.util.Arrays; 4 5 public class ClosetPoint { 6 private Point point[]; 7 private Point temp[]; 8 private Point lowPoint = new Point();//保存排序后下标小的Point 9 private Point highPoint = new Point();//保存排序后下标大的Point 10 11 public float min(float a, float b) { 12 return a < b ? a : b; 13 } 14 15 public float cloest_pair(int left, int right) { 16 float d = Float.POSITIVE_INFINITY; 17 if (left == right) { 18 lowPoint = highPoint = point[left]; 19 return d; 20 } 21 if (left == right - 1) { 22 lowPoint = point[left]; 23 highPoint = point[left + 1]; 24 return point[left].distance(point[left + 1]); 25 } 26 int mid = (left + right) >> 1; 27 float leftMin = cloest_pair(left, mid); 28 float rightMin = cloest_pair(mid + 1, right); 29 float min = min(leftMin, rightMin); 30 int index = 0; 31 for (int i = 0; i < point.length; i++) { 32 if (point[i].x >= (point[mid].x - min) 33 && point[i].x <= point[mid].x + min) { 34 point[i].sortFlag = false; 35 temp[index++] = point[i]; 36 37 } 38 } 39 Arrays.sort(temp, 0, index); 40 for (int i = 0; i < index; i++) { 41 for (int j = i + 1; j < index 42 && (float) (point[j].y - point[i].y) < min; j++) { 43 float kMin = point[i].distance(point[j]); 44 if (min > kMin) { 45 min = kMin; 46 lowPoint = point[i]; 47 highPoint = point[j]; 48 } 49 } 50 } 51 return min; 52 53 } 54 55 public static void main(String[] args) { 56 ClosetPoint cp = new ClosetPoint(); 57 Point[] point = new Point[5]; 58 int x[] = { 0, 1, 4, -1, 7 }; 59 int y[] = { 0, 5, 7, 3, 8 }; 60 for (int i = 0; i < x.length; i++) { 61 Point tempPoint = new Point(); 62 tempPoint.x = x[i]; 63 tempPoint.y = y[i]; 64 point[i] = tempPoint; 65 } 66 Arrays.sort(point, 0, 5); 67 cp.point = point; 68 cp.temp = new Point[5]; 69 cp.cloest_pair(0, 4); 70 System.out.println(cp.lowPoint); 71 System.out.println(cp.highPoint); 72 } 73 }

浙公网安备 33010602011771号