我有以下代码:
public static Location findClosest(Location myPosition, ArrayList<Location> spots) {
double min = Double.MAX_VALUE;
Location closer = null;
for(MyPosition aPosition:spots) {
float dist = Math.abs(aPosition.distanceTo(myPosition));
if(dist < min) {
min = dist;
closer = aPosition;
}
}
return closer;
}
这是一种蛮力O(N ^ 2)方法,因为这是从以下函数调用的:
public static Location findClosest(Location myPosition, ArrayList<Places> places) {
Location closer = null;
double min = Double.MAX_VALUE;
for(Places place:places) {
Location currentMin = findClosest(myPosition, places.getSpots());
float dist = Math.abs(currentMin.distanceTo(myPosition));
if(dist < min) {
min = dist;
closer = currentMin;
}
}
return closer;
}
现在可以正常工作,考虑到斑点的大小不是那么大~200最大
我该怎么做才能改善我的做法?
除了geohashing之外还有其他算法可以用来提高性能吗?
是否有一些坐标属性我可以用来跳过循环的某些部分?
答案 0 :(得分:1)
因为你说O(N ^ 2),但这是一个O(N)函数,我假设你在一个循环中调用它来确定每个点最接近。在那种情况下,我不知道什么会更快。
但是,为了省去每次要存储最近点时必须运行此函数的麻烦,请将所有点的HashMap添加到最近的点,并检查该点是否已添加。如果添加了一个新点,只需检查它以及所有原始点。
希望这有帮助,如果只是一点点。
答案 1 :(得分:0)
如果您的问题是找到最近的&#34;现货&#34;来自所有&#34;地点&#34;对于任何位置,您的功能将被多次调用(使用相同的&#34;地点&#34;和#34;斑点&#34;),也许您应该考虑创建某种空间数据结构(即我所谓的预处理)。 例如四叉树(https://en.wikipedia.org/wiki/Quadtree)。四叉树的构造可能需要一些时间,但您在搜索时会非常有效。 - 元素插入需要O(log N)(N点完全为(N * logN)(你的情况可能是N = M * M)) - 搜索只需O(log N) 与笛卡尔坐标完美配合。如果您使用地理坐标,则应首先对其进行转换。