Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在寻找最近的位置方面,我怎样才能比暴力做得更好?_Java_Android_Algorithm_Geolocation_Coordinates - Fatal编程技术网

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的位置。转换为笛卡尔坐标并非易事,但却是可能的。例如,见