我正在寻找一种算法来获得最快的方法来找到一个盒子中的所有点 2D (x,y)(一个盒子由 2 个点定义:lowerLeft 和 upperRight)。
想象一下,我们在 2D 空间中有 200 万个点。
在那个 2D 空间中,我从 2 个点的某处创建了一个框,一个在左下角,另一个在右上角。获得盒子中所有分数的最快方法是什么?这是最坏情况的java测试:循环每个点(200万!)并确定它是否在盒子内。我敢肯定,如果点列表首先排序,我们会变得更快......
你有想法吗?
public class FindPointsInBox {
public static void main(String[] args) throws Exception {
// List of 2,000,000 points (x,y)
List<Point> allPoints = new ArrayList<Point>();
for(int i=0; i<2000000; i++) {
allPoints.add(new Point(46 - (Math.random()), -74 - (Math.random())));
}
// Box defined by 2 points: lowerLeft and upperRight
List<Point> pointsInBox = new ArrayList<Point>();
Point lowerLeft = new Point(44.91293325430085, -74.25107363281245);
Point upperRight = new Point(45.3289676752705, -72.93820742187495);
Date t1 = new Date();
// TODO: What is the fastest way to find all points contained in box
for(int i=0; i<allPoints.size(); i++) {
if(isPointInBox(allPoints.get(i), lowerLeft, upperRight))
pointsInBox.add(allPoints.get(i));
}
Date t2 = new Date();
System.out.println(pointsInBox.size() + " points in box");
System.out.println(t2.getTime()-t1.getTime() + "ms");
}
private static boolean isPointInBox(Point p, Point lowerLeft, Point upperRight) {
return (
p.getX() >= lowerLeft.getX() &&
p.getX() <= upperRight.getX() &&
p.getY() >= lowerLeft.getY() &&
p.getY() <= upperRight.getY());
}
}