Write code in C/C++ to generate a set of random points in 2D and find the closest pair of points. You'll implement two approaches:
Perform an experimental analysis of both methods to see how their performance compares in practice. Time both methods separately and run on increasingly large values of the number of points, until the difference in running times is signifiacnt. Create a table of the running times.
This is a warm-up assignment to get everyone comfortable with C/C++ and an opportunity to learn what quadratic complexity means in practice.
[ltoma@lobster] ./closest 100means that it will generate and compute on 100 points.
//compute and print the closest pair in P using the naive algorithm void closest_naive( array of points P) //compute and print the closest pair in P using a gridded approach void closest_grid( array of points P)
The details of this approach are intentionally left open-ended so that you can develop and implement your own ideas.
int *a; /* DON'T DO THIS: int a[n]; It's wrong and you're sure to get segfaults for larger values of n. YOU NEED TO ALLOCATE dynamically using malloc() because you don't know n at compile time. */ //allocate the space dynamically a =(int*)malloc(n * sizeof(int)); //put some data in it for (i=0; i < n; i++) a[i] = 1; //compute something sum=0; for (i=0;i< n;i++) sum += a[i]; //free the space free(a);
//an array of n ints, C++ style int *b; /* DON'T DO THIS: int b[n]; It's wrong and you're sure to get segfaults for larger values of n. YOU NEED TO ALLOCATE dynamically using new because you don't know n at compile time. */ //allocate the space dynamically b = new int[n]; //put some data in it for (i=0; i < n; i++) b[i] = 1; //compute something sum=0; for (i=0;i < n;i++) sum += b[i]; //free the space delete [] b;
//an array of Vectors, C++ style vector< int > *d; /* DON'T DO THIS: vector< int > d[n]; It's wrong and you're sure to get segfaults for larger values of n. YOU NEED TO ALLOCATE dynamically using new because you don't know n at compile time. */ //allocate the space dynamically d = new vector< int > [n]; //NOTE: we assume that c++ calls the constructor to create a new Vector at each d[i] //put some data in it for (i=0; i< n; i++) //d[i] is a Vector, so we push 1 into it d[i].push_back(1); //compute something sum=0; for (i=0;i< n;i++) sum += d[i][0]; //free the space delete [] d; printf("test4: sum=%f\n", sum);
//a structure for a point in 2D typedef struct _point2d { double x, y; } point2d; //a 2D array of Vectors of points vector< point2d > **grid; /* DON'T DO THIS: vector< point2d > grid [n][n] It's wrong and you're sure to get segfaults for larger values of n. YOU NEED TO ALLOCATE dynamically using new because you don't know n at compile time. */ //allocate first an array of vector* grid = new vector< point2d >* [n]; for (i=0; i < n;i++) { //grid[i] is a vector*, that is, an array (of vectors); we allocate it grid[i] = new vector< point2d > [n]; } //put some data in it for (i=0; i < n; i++) { for (j=0; j < n; j++) { //grid[i][j] is a Vector, so we push 1 into it assert(grid[i][j].size()==0); point2d p = {1.0, 1.0}; grid[i][j].push_back(p); assert(grid[i][j].size()==1); } } //compute something sum=0; for (i=0; i < n; i++) { for (j=0; j < n; j++) { // grid[i] is a vector;grid[i][j][0] is the first point in that vector sum += grid[i][j][0].x; } } //free the space delete [] e;
In addition to GitHub, please bring a hard copy of your code and of the README to class.