我需要解决一个计算问题,即在两个点集之间搜索相互最近的点对。该问题大致如下:
给定欧几里得空间中点集A和点集B,找到所有满足条件(a,b)的点对,其中b是B中距离a最近的点,而a是A中距离b最近的点。
集合A和B的大小大约相等,我们将其称为N。 对于我的特定问题,N大约为250,000。
暴力解决方案是将每个点与其他每个点进行比较,这具有二次时间复杂度。 是否有更有效的算法来解决这个问题呢?
我需要解决一个计算问题,即在两个点集之间搜索相互最近的点对。该问题大致如下:
给定欧几里得空间中点集A和点集B,找到所有满足条件(a,b)的点对,其中b是B中距离a最近的点,而a是A中距离b最近的点。
集合A和B的大小大约相等,我们将其称为N。 对于我的特定问题,N大约为250,000。
暴力解决方案是将每个点与其他每个点进行比较,这具有二次时间复杂度。 是否有更有效的算法来解决这个问题呢?
for(a in A)
b := nearest(B, a)
if a = nearest(A, b)
add (a, b) to results
end if
end for
function nearest(X, y)
return nearest member of set X to point y
end function
很抱歉挑起了一个比较旧的话题,但我只是想添加一个我在算法设计课程教材中找到的解决方案:
可以使用分治(类似于归并排序)方法解决此问题,时间复杂度应该为O(n logn)
,我只看过用于在一组点内查找最短距离的情况,但应该很容易适应需要每个匹配对由来自不同集合的点组成的情况。
d
)。p
),并检查p_x
和p_x + d
之间所有点的距离,如果其中任何距离都比d
短,则返回该d
作为结果,否则返回d
。虽然这是一个旧帖子,但我看到有一个相当新的评论。
我认为对于一个n维点集,两个集合之间的近点可以通过找到集合差的原点附近点来找到。您可以查找贝尔实验室的菲利普·沃尔夫(Phillip Wolfe)的论文,其中他阐述了该算法。您可以考虑从集合A中取一个随机点,找到集合B中最近的点,然后找到与集合B中该点最近的点,以此类推。 http://link.springer.com/article/10.1007%2FBF01580381