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 }

 

posted @ 2014-08-04 23:29  big sun  阅读(132)  评论(0)    收藏  举报