Java 在寻找最近的位置方面,我怎样才能比暴力做得更好?
我有以下代码:Java 在寻找最近的位置方面,我怎样才能比暴力做得更好?,java,android,algorithm,geolocation,coordinates,Java,Android,Algorithm,Geolocation,Coordinates,我有以下代码: 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(
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;
}
公共静态位置findClosest(位置myPosition,数组列表点){
双最小值=双最大值;
位置更近=空;
对于(我的位置:点){
浮动距离=数学绝对值(位置距离(myPosition));
如果(距离<最小值){
最小值=距离;
闭合=位置;
}
}
回程更近;
}
这是一种蛮力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;
}
公共静态位置findClosest(位置myPosition,数组列表位置){
位置更近=空;
双最小值=双最大值;
(地点:地点){
Location currentMin=findClosest(myPosition,places.getSpots());
浮动距离=数学绝对值(当前最小距离到(我的位置));
如果(距离<最小值){
最小值=距离;
闭合=当前最小值;
}
}
回程更近;
}
考虑到斑点的大小并没有那么大,最多200个,目前还可以使用。如何改进我的方法?
除了geohashing,还有其他算法可以提高性能吗?
有一些坐标属性可以用来跳过循环的某些部分吗?因为你说的是O(N^2),但这是一个O(N)函数,我假设你在循环中调用它来确定每个点的最近距离。那样的话,我不知道什么会更快 但是,为了避免每次要存储最近点时都必须运行此函数的麻烦,请将所有点的哈希映射添加到最近点,并检查是否已添加该点。如果添加了一个新点,只需检查它和所有原始点
希望这有点帮助。如果你的问题是从任何地方的所有“地方”找到最近的“点”,你的函数将被多次调用(用相同的“地方”和“点”),也许你应该考虑创建某种空间数据结构(这就是我所说的预处理)。 例如四叉树()。四叉树的构建可能需要一些时间,但您在搜索时会非常高效。 -元素插入需要O(logN)(即N个点的总数为(N*logN)(您的情况可能是N=M*M)) -搜索只需要O(日志N)
在笛卡尔坐标系下工作非常完美。如果您使用的是地理坐标,您应该首先转换它们。您可以使用优先级队列而不是列表,此时您将得到O(1),我在这里也看到了O(n),除非我遗漏了什么…我看不到O(n^2)-但仅是线性的。无论如何,如果你能够“以某种方式”对斑点进行预处理,你可以将它们存储在一些空间数据结构中,如R-树、四叉树、KD-树等。。。加快搜索速度。正确的数据结构取决于您使用的dimmensions数等。。例如,请参见@Palcente:如何使用优先级队列?我没有understand@convexHull你说得对。它不是O(N),因为我从另一个循环调用这个函数,我没有提到这个循环。我将更新OP。我不知道可以进行什么预处理。在插入过程中,优先级队列中的顺序保持不变。因此,您的
findClosest()
方法只需要从点中拾取第一个项目,它将被保证是最近的位置。我的问题是给出1个位置和其他位置的列表,从列表中找到最靠近X1的位置)我有列表,但目标位置未知。我可以创建这样一个树结构来适应这种情况吗?2) 我有地理坐标。转换它们的最佳方法是什么?如果只搜索一次最近的数据结构,这种数据结构可能会增加开销,而且您的解决方案已经足够好了。但是,如果您多次搜索最近的点(或者如果有可能多次询问),您可以(例如)为您的点列表构建四叉树。然后你可以很容易地询问任何uknown的位置。转换为笛卡尔坐标并非易事,但却是可能的。例如,见