1
+ /*************************************************************************
2
+ * Compilation: javac RangeSearchVisualizer.java
3
+ * Execution: java RangeSearchVisualizer input.txt
4
+ * Dependencies: PointSET.java KdTree.java Point2D.java RectHV.java
5
+ * StdDraw.java In.java
6
+ *
7
+ * Read points from a file (specified as a command-line arugment) and
8
+ * draw to standard draw. Also draw all of the points in the rectangle
9
+ * the user selects by dragging the mouse.
10
+ *
11
+ * The range search results using the brute-force algorithm are drawn
12
+ * in red; the results using the kd-tree algorithms are drawn in blue.
13
+ *
14
+ *************************************************************************/
15
+
16
+ import java .util .*;
17
+
18
+
19
+ public class AverageExperiment {
20
+
21
+ private static ArrayList <Point2D > kdpoints ;
22
+
23
+ private static KdTree kdtree ;
24
+
25
+ public static void main (String [] args ) {
26
+
27
+ int N = Integer .parseInt (args [0 ]); // for how many points
28
+
29
+ long iterations = 1 ;
30
+
31
+ long totalBrute = 0 ;
32
+ long totalKd = 0 ;
33
+
34
+ for (int iter =0 ; iter < iterations ; iter ++) {
35
+ PointSET brute = new PointSET ();
36
+ kdtree = new KdTree ();
37
+ kdpoints = new ArrayList <Point2D >();
38
+
39
+ // Generates N points between 0-1 and intialize the data structures
40
+ Point2D [] points = new Point2D [N ];
41
+ for (int i = 0 ; i < N ; i ++) {
42
+ double x = StdRandom .uniform (100 );
43
+ double y = StdRandom .uniform (100 );
44
+ x = x /100 ;
45
+ y = y /100 ;
46
+ points [i ] = new Point2D (x , y );
47
+ //points[i].draw();
48
+ //System.out.printf("%f %f\n", points[i].x(), points[i].y());
49
+ //kdtree.insert(points[i]);
50
+
51
+ kdpoints .add (points [i ]);
52
+ brute .insert (points [i ]);
53
+ }
54
+
55
+ buildTree (kdpoints ,true );
56
+ //StdDraw.show();
57
+
58
+ //Random rectangle between 0-0.1
59
+ double xmin = StdRandom .uniform (100 );
60
+ double ymin = StdRandom .uniform (100 );
61
+
62
+ xmin = xmin / 100 ;
63
+ ymin = ymin / 100 ;
64
+
65
+ double xmax = xmin + 0.1 ;
66
+ double ymax = ymin + 0.1 ;
67
+
68
+ // draw rectangle
69
+ RectHV rect = new RectHV (xmin , ymin , xmax , ymax );
70
+ //RectHV rect = new RectHV(0.3, 0.4, 0.5, 0.5); //uncomment this line to see the big rectangle, original rectangle is very small (0-.1)
71
+
72
+ //////////////////////////////////////////////////
73
+ // draw the range search results for brute-force data structure in red
74
+
75
+ long startTime , endTime ;
76
+
77
+ //////
78
+ startTime = System .nanoTime ();
79
+ Iterable <Point2D > bruteRange = brute .range (rect );
80
+ endTime = System .nanoTime ();
81
+ ///////
82
+
83
+ totalBrute += (endTime - startTime );
84
+ //System.out.printf("Time Taken by Brute Force %d \n", endTime - startTime);
85
+
86
+ //StdDraw.clear();
87
+
88
+ // draw the range search results for kd-tree in blue
89
+
90
+ /////////
91
+ startTime = System .nanoTime ();
92
+ Iterable <Point2D > kdRange = kdtree .range (rect );
93
+ endTime = System .nanoTime ();
94
+ /////////
95
+ totalKd += (endTime - startTime );
96
+ //System.out.printf("Time Taken by KDTree %d \n", endTime - startTime);
97
+
98
+ }
99
+
100
+ totalKd /= iterations ;
101
+ totalBrute /= iterations ;
102
+
103
+ System .out .printf ("Average Time Taken by Brute Force %d \n " , totalBrute );
104
+ System .out .printf ("Average Time Taken by KDTree %d \n " , totalKd );
105
+ }
106
+
107
+
108
+ public static void buildTree (ArrayList <Point2D > points , boolean xysort ) {
109
+ //if xy sort = 1, sort by x
110
+ //otherwise sort by y
111
+
112
+ ArrayList <Point2D > sortedPoints ;
113
+ if (points .size () > 2 ) {
114
+ if (xysort ) {
115
+ sortedPoints = sortMeByX (points );
116
+ xysort = false ;
117
+ }else {
118
+ sortedPoints = sortMeByY (points );
119
+ xysort = true ;
120
+ }
121
+
122
+ int size = sortedPoints .size ();
123
+ int median = size /2 ;
124
+
125
+ kdtree .insert (sortedPoints .get (median ));
126
+ //kdtree.draw();
127
+ //StdDraw.show();
128
+
129
+ ArrayList <Point2D > right = new ArrayList <Point2D >(sortedPoints .subList (median +1 ,size ));
130
+ ArrayList <Point2D > left = new ArrayList <Point2D >(sortedPoints .subList (0 ,median ));
131
+
132
+ buildTree (right ,xysort );
133
+ buildTree (left ,xysort );
134
+ }else {
135
+ for (Point2D p : points ) {
136
+ kdtree .insert (p );
137
+ //kdtree.draw();
138
+ //StdDraw.show();
139
+ }
140
+ }
141
+
142
+
143
+ }
144
+
145
+ public static ArrayList <Point2D > sortMeByX (ArrayList <Point2D > points ){
146
+ int n = points .size ();
147
+ int c , d ;
148
+ Point2D swap ;
149
+
150
+ for (c = 0 ; c < ( n - 1 ); c ++) {
151
+ for (d = 0 ; d < n - c - 1 ; d ++) {
152
+ if (points .get (d ).x () > points .get (d +1 ).x ()) {
153
+ swap = points .get (d );
154
+ points .set (d , points .get (d +1 ));
155
+ points .set ((d +1 ), swap );
156
+ }
157
+ }
158
+ }
159
+ return points ;
160
+ }
161
+
162
+
163
+ public static ArrayList <Point2D > sortMeByY (ArrayList <Point2D > points ){
164
+ int n = points .size ();
165
+ int c , d ;
166
+ Point2D swap ;
167
+
168
+ for (c = 0 ; c < ( n - 1 ); c ++) {
169
+ for (d = 0 ; d < n - c - 1 ; d ++) {
170
+ if (points .get (d ).y () > points .get (d +1 ).y ()) {
171
+ swap = points .get (d );
172
+ points .set (d , points .get (d +1 ));
173
+ points .set ((d +1 ), swap );
174
+ }
175
+ }
176
+ }
177
+
178
+ return points ;
179
+ }
180
+ }
0 commit comments