问题语句如下:在2D平面K近邻
查找K个最接近点在二维平面上的原点,给出 含N百分点。输出必须在非阵列降序。
解决方案:我已经解决了这个使用比较和优先级队列和我的代码看起来像下面:
class Point {
double x;
double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
public class KClosestPoints {
public Point[] getKNearestPoints(Point[] points, int k) {
if (k == 0 || points.length == 0) {
return new Point[0];
}
Point[] rValue = new Point[k];
int index = k - 1;
if (points.length < k) {
index = points.length - 1;
}
final Point org = new Point(0, 0);
PriorityQueue<Point> pq = new PriorityQueue<Point>(k,
new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
Double d2 = getDistance(o2, org);
Double d1 = getDistance(o1, org);
if (d2 > d1) {
return 1;
} else if (d2 < d1) {
return -1;
} else
return 0;
}
});
for (int i = 0; i < points.length; i++) {
pq.offer(points[i]);
if (pq.size() > k) {
pq.poll();
}
}
while (!pq.isEmpty()) {
rValue[index] = pq.poll();
index--;
}
return rValue;
}
private static double getDistance(Point a, Point b) {
return Math.sqrt(((a.x - b.x) * (a.x - b.x))
+ ((a.y - b.y) * (a.y - b.y)));
}
我的代码适用于所有的测试情况下,我已经使用,除了这一点:
test6[0] = new Point(Double.MIN_VALUE, Double.MAX_VALUE);
test6[1] = new Point(Double.MIN_VALUE, Double.MIN_VALUE);
test6[2] = new Point(Double.MAX_VALUE, Double.MAX_VALUE);
getKNearestPoints(test6, 2);
答案应该是test6 [0]和test6 [1],而这段代码的答案是test6 [0]和test6 [2]。帮助我找到问题。
编辑:后来我已经注意到它在所有的测试案例,其中k给出错误的答案= 2时的点是积极的和消极的,一个这样的试验情况进行了
那么,什么是'Double.MIN_VALUE - Double.MIN_VALUE'在Java中?顺便说一下,是否有一个原因,你为什么使用优先级队列,而不是按距离原点排序点并返回它们的第一个“k”? – 2016-12-29 20:11:37
我可以没有优先级队列。然后,我必须计算每个点与原点之间的距离,然后对距离进行排序并获取前k个距离。距离可以使用散列图映射到点。我只是想保存内存,而不是采用hashmap。这两种情况下的复杂性将是O(n logn) – ojas
我想通过treeMap解决方案虽然 – ojas