在给定包含N个点的数组的情况下,在2D平面中找到距离原点最近的K点。你可以假设K远小于N而N非常大。
这是我到目前为止所做的:
public class OriginQuestion {
public static class Point {
public double x;
public double y;
}
public static Point[] closestk( Point myList[], int k ) {}
for(int i=0;i<myList.length;i++){
}
}
帮助表示赞赏
答案 0 :(得分:4)
此问题是nearest neighbor搜索问题的变体。最简单的解决方案是计算从原点到所有N个点的距离,然后找到最近使用的K,例如quickselect algorithm,给出O(n)的时间和空间复杂度。
答案 1 :(得分:2)
使用堆可以解决此问题。我们可以从创建大小为k的最大堆开始,然后开始向其添加点。在我们完成将K点添加到堆中之后。
现在,如果第(K + 1)点的距离低于最大堆根,我们删除root并将此第(K + 1)点添加到我们的最大堆中。
在我们完成处理所有N个点之后,我们的堆将为我们提供解决方案。 最坏的情况复杂度应为N(log K),因为我们将对N个数字执行此操作,并且需要日志K操作来移动堆中的节点。