Algorithm 查找集合A中所有点的算法集合B中的最近邻

Algorithm 查找集合A中所有点的算法集合B中的最近邻,algorithm,nearest-neighbor,Algorithm,Nearest Neighbor,假设我们有两组点A,B,我们想为集合A中的每个点找到它在集合B中的最近邻居 有很多很好的算法可以找到一个点的最近邻。有没有什么方法可以利用我们得到的关于a_1的信息,更有效地搜索a_2或集合中其他点的最近邻居 我的想法是这样的:使用三角形不等式来获得B中每个点和新点a_2之间可能距离的区间,并对区间的最大值和最小值进行排序,然后我可以只搜索B中第一个区间内的点。阅读Bentley的“编写高效程序”可能会让你受益匪浅在那里,他处理了一个旅行推销员计划的案例研究。他认识到的一个节省是两点之间的距离需

假设我们有两组点A,B,我们想为集合A中的每个点找到它在集合B中的最近邻居

有很多很好的算法可以找到一个点的最近邻。有没有什么方法可以利用我们得到的关于a_1的信息,更有效地搜索a_2或集合中其他点的最近邻居


我的想法是这样的:使用三角形不等式来获得B中每个点和新点a_2之间可能距离的区间,并对区间的最大值和最小值进行排序,然后我可以只搜索B中第一个区间内的点。

阅读Bentley的“编写高效程序”可能会让你受益匪浅在那里,他处理了一个旅行推销员计划的案例研究。他认识到的一个节省是两点之间的距离需要取一个平方根,这是很昂贵的。平方根表示实际距离,而不是平方根表示可以与其他相对值进行比较的数字

我强烈推荐你读这本书。它会让你的大脑处于正确的位置

  • 查找集合B的点
  • 在集合a的点和集合B的Voronoi图上应用a。只要扫掠线覆盖集合a中的某个点,请查看该点位于Voronoi图的哪些边之间。这允许确定该点属于Voronoi图的哪个面。它给出了距离集合B最近的点
  • 步骤2的详细信息:将Voronoi图的所有边(当前与扫描线相交)保留在某个有序容器中。当扫描线覆盖Voronoi图的某些顶点时,从/到容器移除/添加与该顶点相关的边。若要查看某个点所在的边之间的位置,请获取容器中该点的后续/前置边


    时间复杂度为O((M+N)logm)。N=| A |,M=| B |。

    蛮力解决方案可以是使用集合B最近点的密度图。然后将集合A的每个点与密度图进行比较。您也可以使用delaunay三角测量创建密度图。

    在您的上下文中,努力意味着什么?计算距离d(x,y)。您可以对点设置任何限制吗?我不知道这是否是最佳解决方案的一部分,只是它是相关的