我是writing a lambda function,需要将最接近的点返回到另一点。我在想,必须有一种比计算每次到all 5000 points的距离更好的方法。
func (places Places) closest(w place) (c place) {
c = places[0]
closestSoFar := w.Point.GreatCircleDistance(c.Point)
for _, p := range places[1:] {
distance := w.Point.GreatCircleDistance(p.Point)
if distance < closestSoFar {
// Set the return
c = p
// Record closest distance
closestSoFar = distance
}
}
return
}
如果您可以查看代码并指向我应该使用的库,我将不胜感激。我也想对不同的方法进行基准测试,所以我想知道如何定义它。我认为目前我的方法在i7系统上需要约0.025s。也许我在这里做的是过早的优化?由于我的巴士站数据可能不会超过1万点。
答案 0 :(得分:2)
您可以将整个平面划分为网格,这些网格可以由点的经度和纬度的O(1)运算来确定,例如(int(lat) / 10, int(lng) /10)
。对于5000个点中的每个点和每个栅格,预先计算栅格与该点之间的最大和最小距离。为每个网格维护一组可能会产生最小距离的点。有了良好的除法算法(通常只需将经度和纬度除以一定的数字就足够了),该集合应该很小,最多不超过10个点。
因此,当您进行查询时,可以立即获得该点所在的网格,并且具有可以作为壁橱的一小部分点。只需在其上循环并找到一个即可。
计算最小和最大距离很简单,在某些特殊情况下要小心。可以通过保持当前(min,max)来完成对集合的维护:当计算出新的一对(minI,maxI)时,将其与当前对进行比较。如果maxI
我目前正在移动设备上,因此我无法提供代码。如果您需要代码来查看完成方式,请稍后再添加。