Skip to content

Commit 04a6004

Browse files
committed
Divide and Conquer in O(nlogn)
1 parent dbbf745 commit 04a6004

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

closestPair.cpp

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#include <bits/stdc++.h>
2+
#define ll long long
3+
using namespace std;
4+
5+
struct point {
6+
ll x;
7+
ll y;
8+
};
9+
10+
bool compX(point a, point b) {
11+
return a.x < b.x;
12+
}
13+
14+
bool compY(point a, point b) {
15+
if(a.y < b.y)
16+
return true;
17+
if(a.y > b.y)
18+
return false;
19+
return a.x < b.x;
20+
}
21+
22+
point result1, result2;
23+
double minDist = DBL_MAX;
24+
25+
double euclideanDistance(point a, point b) {
26+
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
27+
}
28+
29+
double bruteMin(vector<point> &pointsByX, ll low, ll high) {
30+
ll i,j;
31+
double dist,bestDistance = DBL_MAX;
32+
for(i=low; i<=high; i++) {
33+
for(j=i+1; j<=high; j++) {
34+
dist = euclideanDistance(pointsByX[i], pointsByX[j]);
35+
if(dist < bestDistance) {
36+
bestDistance = dist;
37+
if(bestDistance < minDist) {
38+
minDist = bestDistance;
39+
result1 = pointsByX[i];
40+
result2 = pointsByX[j];
41+
}
42+
}
43+
}
44+
}
45+
return bestDistance;
46+
}
47+
48+
double closestPair(vector<point> &pointsByX, vector<point> &pointsByY, ll low, ll high) {
49+
ll i,j,n = high - low + 1;
50+
if (n <= 3) {
51+
return bruteMin(pointsByX, low, high);
52+
}
53+
54+
ll mid = low + (high - low)/2;
55+
56+
double distLeft = closestPair(pointsByX, pointsByY, low, mid);
57+
double distRight = closestPair(pointsByX, pointsByY, mid+1, high);
58+
59+
double bestDistance = min(distLeft, distRight);
60+
61+
vector<point> pointsInStrip;
62+
for(i=0; i<n && abs(pointsByY[i].x - pointsByX[mid].x) < bestDistance; i++) {
63+
pointsInStrip.push_back(pointsByY[i]);
64+
}
65+
66+
for(i=0; i<pointsInStrip.size(); i++) {
67+
for(j=i+1; j<pointsInStrip.size() && abs(pointsInStrip[i].y - pointsInStrip[j].y) < bestDistance; j++) {
68+
double dist = euclideanDistance(pointsInStrip[i], pointsInStrip[j]);
69+
if(dist < bestDistance) {
70+
bestDistance = dist;
71+
result1 = pointsInStrip[i];
72+
result2 = pointsInStrip[j];
73+
}
74+
}
75+
}
76+
77+
return bestDistance;
78+
}
79+
80+
int main() {
81+
ll i,n;
82+
cin>>n;
83+
vector<point> pointsByX(n), pointsByY(n);
84+
for(i=0; i<n; i++) {
85+
cin>>pointsByX[i].x>>pointsByX[i].y;
86+
pointsByY[i].x = pointsByX[i].x;
87+
pointsByY[i].y = pointsByX[i].y;
88+
}
89+
sort(pointsByX.begin(), pointsByX.end(), compX);
90+
sort(pointsByY.begin(), pointsByY.end(), compY);
91+
92+
cout<<"Shortest distance = "<<closestPair(pointsByX, pointsByY, 0, n-1)<<endl;
93+
cout<<"Points are ("<<result1.x<<","<<result1.y<<") and ("<<result2.x<<","<<result2.y<<")\n";
94+
return 0;
95+
}

0 commit comments

Comments
 (0)