2D平面中与任何点自身除外最近的邻居

问题描述

给定一个二维平面和N个点(n1 =(x1,y1),n2 =(x2,y2)...,nN =(xN,yN)),什么是快速(O(n)或更好)算法,该算法将找到任何点的最近邻居(例如,n1最近邻居是n3,n2最近邻居是n4)。我当时正在考虑将其存储在字典中,在字典中,键是点,值是邻居。

关于SO似乎有很多类似的问题,但是我找不到Python中的任何代码或其他语言以外的答案。

解决方法

一种简单的解决方案可以使用平均比O(n)更好的结果,该方法使用 k-d树来存储点。构建树的最坏情况下的复杂度为O(nlogn)。之后,平均搜索结果为 O(logn),最坏情况下的搜索结果为O(n)(通常是指远离所有其他数据的点)。

另外,您可能会对LSH或位置敏感的哈希感兴趣,尽管它是一种近似方法,这意味着您将始终无法获得正确的答案,对于高维数据,它提供了重要的提速,其复杂度与所选参数密切相关。

,

对于给定的点P,简单的解决方案:

  • 计算P与所有其他点的距离,这是通过O(n)时间复杂度来完成的。
  • 将它们另存为元组(或类似数据结构)列表,即(点,距P的距离)的元组。
  • 在列表上走一圈可以为您排在前K个最接近的点,时间复杂度为O(n)。

第二种解决方案随着时间的流逝会花费更多的空间复杂性(O(n ^ 2))和维护,但是会缩短找到K个最近邻居的时间:

  • 按点的距离将字典从每个点保留到点的有序列表(或类似的数据结构)-一次构建此表为O(n ^ 2 * log(n))。 / li>
  • 查找K个最接近的点是O(k)-字典访问+从有序列表中复制k个元素。
  • 时间复杂度的开销是添加一个新点或删除一个旧点,以使该数据结构有效-两者均为O(n * log(n))。

您选择的解决方案应基于您要优化的内容