Skip to content

Commit 69403f7

Browse files
committed
first
0 parents  commit 69403f7

21 files changed

+1104029
-0
lines changed

AverageExperiment.java

+180
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
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

Comments
 (0)