在找到最近的位置时,我怎么能比蛮力更好?

时间:2016-04-27 10:21:50

标签: 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(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之外还有其他算法可以用来提高性能吗? 是否有一些坐标属性我可以用来跳过循环的某些部分?

2 个答案:

答案 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) 与笛卡尔坐标完美配合。如果您使用地理坐标,则应首先对其进行转换。