【问题标题】:Calculating closest point in Golang计算Golang中的最近点
【发布时间】:2019-02-27 00:49:49
【问题描述】:

我是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.025 秒。也许我在这里做的是过早的优化?由于我的公交车站数据可能不会超过 10k 点。

【问题讨论】:

  • 在 SO 上寻找库是题外话。优化:预先计算并保存最近的邻居/距离

标签: go geolocation geo


【解决方案1】:

您可以将整个平面分割成网格,这些网格可以通过点的纬度和经度的 O(1) 运算来决定,例如 (int(lat) / 10, int(lng) /10)。预先计算 5000 个点和每个网格的最大和最小距离是网格和点之间的距离。为每个网格维护一组可能产生最小距离的点。使用好的划分算法(通常只用一定的数字划分经纬度就足够了),集合应该很小,不超过10个点。

因此,当您收到查询时,您可以立即获取该点所在的网格,并且有一小部分可以作为壁橱的点。只需遍历它并找到它。

计算最小和最大距离是微不足道的,只是要小心一些特殊情况。可以通过保持当前的 (min,max) 来维护集合:当计算出一对新的 (minI,maxI) 时,将其与当前的比较。如果 maxI max,什么都不会发生。否则,只需添加新对并相应地更新最小值/最大值。

我目前使用的是移动设备,因此无法提供代码。如果你需要代码来看看它是如何完成的,我稍后会添加它。

【讨论】:

  • 是的,我对代码甚至更好..一些现有的库函数感兴趣
猜你喜欢
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
相关资源
最近更新 更多