Algorithm 有效地找到50k二维坐标的n个最近邻?

Algorithm 有效地找到50k二维坐标的n个最近邻?,algorithm,Algorithm,我有一个带有纬度和经度的数组。任务是为所有坐标找到5个最近的坐标,而不必每次循环遍历所有坐标。根据您的数据(您没有告诉任何信息)和您希望的确定程度,有几种解决方案 如果数据是均匀分布的,则可以在数据的顶部创建栅格,并将点指定给栅格。之后,对于每个元素,您将找出它所属的栅格,并比较该栅格(以及最近栅格)中的距离。通过良好的网格选择,并假设网格中平均有k个元素,这可以为您提供潜在的O(n*k^2)运行时间。看看这个答案 对数据一无所知,您可以构造一个in O(n logn)时间,然后对数据库中的每

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

根据您的数据(您没有告诉任何信息)和您希望的确定程度,有几种解决方案

  • 如果数据是均匀分布的,则可以在数据的顶部创建栅格,并将点指定给栅格。之后,对于每个元素,您将找出它所属的栅格,并比较该栅格(以及最近栅格)中的距离。通过良好的网格选择,并假设网格中平均有k个元素,这可以为您提供潜在的
    O(n*k^2)
    运行时间。看看这个答案
  • 对数据一无所知,您可以构造一个in O(n logn)时间,然后对数据库中的每个点询问距离它最近的点是什么(在O(logn)中询问总共n个点)。所以总的复杂度是
    O(n logn)
  • 另一种方法是使用概率方法,称为。wiki页面太复杂了,即使知道这是什么,我也很难阅读该页面。看一看,以便更好地理解它
  • @Gene通过使用a提出了另一种方法(没有听说过这种树,所以将其保留为空)
因此,正如您所看到的,对于这项任务,有可能获得比
O(n^2)
更高的复杂性


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

2维数组?什么?也许你指的是R^2中的一维点阵列?使用欧几里德距离作为比较器将所有元素插入。抓取最上面的n个元素。看看BST的非常efficient@Marko无需排序即可找到前5个lol值。如果我理解正确,这是一个缓慢的解决方案,因为您无法在O(n)时间内更新堆。@Marko我认为您的解决方案完全错误。