K closest points to a given point (x, y). N is in millions and K is few hundreds.
package array;
import java.util.*;
public class KClosestPoints {
//http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=172475&extra=page%3D2%26filter%3Dsortid%26sortid%3D311%26searchoption%5B3046%5D%5Bvalue%5D%3D2%26searchoption%5B3046%5D%5Btype%5D%3Dradio%26sortid%3D311
int dist(Point p1, Point p2) {
int dx = p1.x - p2.x;
int dy = p1.y - p2.y;
return dx * dx + dy * dy;
}
int qs(Point[] arr, Point target, int start, int end) {
Point pivot = arr[end]; // end out
int targetdist = dist(pivot, target);
while (start < end) {
while (start < end && dist(arr[start], target) < targetdist) {
start++;
}
arr[end] = arr[start]; // into end
while (start < end && dist(arr[end], target) > targetdist) {
end--;
}
arr[start] = arr[end]; // into start, end empty
}
arr[end] = pivot; // into end
return end;
}
public Point[] kn(Point[] arr, Point target, int k) {
int mid = -1;
int low = 0;
int high = arr.length - 1;
do {
mid = qs(arr, target, low, high);
if (mid < k) {
low = mid + 1;
} else if (mid > k) {
high = mid - 1;
}
} while (mid != k);
return Arrays.copyOfRange(arr, 0, k);
}
public static void main(String[] args) {
KClosestPoints s = new KClosestPoints();
Point p1 = new Point(0, 0);
Point p2 = new Point(1, 0);
Point p3 = new Point(0, 1);
Point p4 = new Point(0, 2);
Point p5 = new Point(2, 0);
Point p6 = new Point(1, 2);
Point p7 = new Point(2, 1);
Point[] points = { p1, p2, p3, p4, p5, p6, p7 };
for (Point p : s.kn(points, new Point(3, 0), 5))
System.out.println("x:"+p.x+" y:"+p.y);
}
}
class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}