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

Posted

技术标签:

【中文标题】为集合 A 中的所有点查找集合 B 中的最近邻的算法【英文标题】:Algorithm to find for all points in set A the nearest neighbor in set B 【发布时间】:2012-10-11 14:36:28 【问题描述】:

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

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

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

【问题讨论】:

努力在您的语境中是什么意思? 距离d(x,y)的计算。 对积分有什么限制吗? 我不知道这是否是最佳解决方案的一部分,只是它是相关的en.wikipedia.org/wiki/K-d_tree 【参考方案1】:
    为集合 B 的点查找 Voronoi diagram。 在集合 A 的点和集合 B 的 Voronoi 图上应用 Sweep line algorithm。只要扫描线覆盖集合 A 中的某个点,请查看该点位于 Voronoi 图的哪些边缘之间。这允许确定该点属于 Voronoi 图的哪个面。这给出了集合 B 的最近点。

步骤 2 的详细信息:将当前与扫描线相交的 Voronoi 图的所有边保留在某个有序容器中。当扫描线覆盖 Voronoi 图的某个顶点时,从/到容器删除/添加与该顶点相关的边。要查看某个点位于哪些边缘之间,请在容器中获取该点的后继/前继边缘。

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

【讨论】:

【参考方案2】:

您可能会从阅读本特利的“编写高效程序”中受益,他在其中处理了旅行推销员程序的案例研究。他认识到的其中一项节省是,两点之间的差异涉及取平方根,这很昂贵。取平方根给你实际距离,不取平方根给你一个数字,可以用来与其他相对值进行比较。

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于为集合 A 中的所有点查找集合 B 中的最近邻的算法的主要内容,如果未能解决你的问题,请参考以下文章

从几何角度切入最近邻

Dijkstra算法(贪心算法)

在一个集合中查找与另一个集合中的数字相加的一组数字

给定一个集合,查找集合中一共多多少种不同的元素

图的最大匹配算法

二分图