我有两组k维向量,其中k大约为500,向量的数量通常较小。我想计算两组之间(任意定义的)最小距离。 一个天真的方法是:
(loop for a in set1
for b in set2
minimizing (distance a b))
但是,这需要O(n²*距离)计算。有没有更快的方法呢?
答案 0 :(得分:1)
当距离是任意的时(我必须检查每个可能的距离!),我认为你不能比O(n ^ 2)做得更好。对于给定的距离函数,我们可能能够利用函数的属性,但是没有任何通用算法可以使用任何距离函数优于O(n ^ 2)(即o(n ^ 2):注意smallOh)。
如果你的数据是动态的,你必须在不同的时间继续获得最接近的一对点,对于任意距离函数,Eppstein的以下论文可能会有所帮助(它们有特殊的更新操作,以便找到最接近的一对快点):
http://www.ics.uci.edu/~eppstein/projects/pairs/Papers/Epp-SODA-98.pdf。 [O(nlog ^ 2(n))更新时间]
您将能够将上述一组算法调整为两组算法(例如,通过将同一组点之间的距离定义为无穷大)。
对于欧几里德型(L ^ p)距离,有已知的O(nlogn)时间算法,它与一组给定的点一起工作(即你不需要任何特殊的更新算法):
当然,L ^ p适用于一组,但您可以将其调整为两组。
如果您提供距离功能,可能更容易帮助您。
希望它有所帮助。祝你好运!
答案 1 :(得分:0)
如果你的向量的组成部分是标量,我猜你的中等k = 500的情况下,O(n²)方法可能就像你得到的一样快。您可以通过最小化距离来简化计算。此外,距离(A_i,B_i)=距离(B_i,A_i),所以请确保只比较一次(你只有500!/(500-2)!对,而不是500)。
如果组件是m维向量A和B,则可以将向量A的组件存储在R-tree或kd-tree中,然后通过迭代所有组件来找到最接近的对。向量B并从A中找到它最接近的伙伴---这将是O(n)。不要忘记大O是针对n->无穷大的,所以树可能会带来一些相当昂贵的常数项(即这种方法可能只对大k有意义,或者如果向量A总是相同的话)。
答案 2 :(得分:0)
将两组坐标放入Spatial Index,例如一个KD-tree。
然后计算这两个指数的交集。