为集合 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 中的最近邻的算法的主要内容,如果未能解决你的问题,请参考以下文章