找到集合A中所有点的算法集合B中的最近邻居

时间:2012-10-21 17:34:58

标签: algorithm nearest-neighbor

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

有很多好算法可以找到一个点的最近邻居。有没有办法使用我们为a_1获得的信息,更有效地搜索a_2中的最近邻居或集合中的其他点?

我在考虑这样的事情:使用三角不等式来获得B中每个点与新点a_2之间可能距离的间隔,并对间隔的最大值和最小值进行排序,然后我只能搜索B中的点落在第一个间隔。

3 个答案:

答案 0 :(得分:11)

  1. 查找集合B的点Voronoi diagram
  2. 在集合B的集合A和Voronoi图上应用Sweep line algorithm。无论扫描线覆盖集合A的某个点,都要查看此点所在的Voronoi图的边缘。这允许确定该点属于Voronoi图的哪个面。这给出了与集合B最接近的点。
  3. 步骤2的详细信息:将Voronoi图的所有边缘(当前与扫描线相交)保留在某个有序容器中。当扫描线覆盖Voronoi图的某些顶点时,从/向容器移除/添加入射到此顶点的边。要查看某个点位于哪些边缘之间,请在容器中获取此点的后继/前导边缘。

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

答案 1 :(得分:1)

您可以阅读bentleys“编写有效的程序”,在那里他可以处理旅行商计划的案例研究。他认识到的一个节省是两点之间的差异涉及采用昂贵的平方根。取平方根给出实际距离,而不是取平方根给出一个可用于与其他相对值进行比较的数字。

我强烈推荐阅读这本书。它会把你的大脑放在正确的位置。

答案 2 :(得分:0)

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

相关问题