【问题标题】:Efficiently find the n nearest neighbours of 50k 2D coordinates?有效地找到 50k 2D 坐标的 n 个最近邻?
【发布时间】:2016-04-24 04:18:21
【问题描述】:

我有一个包含纬度和经度的数组。任务是为所有坐标找到最近的 5 个坐标,而不是每次都循环遍历所有坐标。

【问题讨论】:

  • 二维数组?什么?也许您的意思是 R^2 中的一维点数组?
  • 使用欧几里得距离作为比较器将所有元素插入Binary heap。抓取前 n 个元素。
  • 看看en.m.wikipedia.org/wiki/Binary_search_tree BST 的效率很高
  • @Marko 无需排序即可找到前 5 个值,哈哈。如果我理解正确,这是一个缓慢的解决方案,因为您无法比 O(n) 时间更快地更新堆。
  • @Marko 我认为您的解决方案完全错误。

标签: algorithm


【解决方案1】:

有几个解决方案取决于您的数据(您什么都没说)以及您想要的程度。

  • 如果您的数据是均匀分布的,那么您可以在数据之上创建一个网格并将点分配给网格。之后,对于每个元素,您找出它属于哪个网格并比较该网格(以及最近的网格)中的距离。通过良好的网格选择并假设网格中平均有 k 个元素,这可以为您提供潜在的 O(n * k^2) 运行时间。查看more explanation 的这个答案。
  • 对数据一无所知,您可以在 O(n log n) 时间内构造一个2-d tree,然后对数据库中的每个点询问离它最近的点是什么(您在 O(logn)总共 n 个点)。所以总复杂度是O(n log n )
  • 另一种方法是使用称为local sensitivity hashing 的概率方法。 wiki 页面太复杂了,即使知道这是什么,我也很难阅读该页面。请查看this description 以更好地理解它。
  • @Gene 建议使用quadtree 的另一种方法(还没有听说过这种树,所以将其留空)

因此,正如您所见,这项任务的复杂性可能比 O(n^2) 更好。

所有方法都描述了如何找到离您正在搜索的点最近的点。很明显,找到最近的点后,您可以将其删除并找到另一个最近的点,依此类推,直到找到您的点的 5 个最近点。

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 2018-09-16
    • 2018-02-06
    • 1970-01-01
    • 2015-02-24
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多