【问题标题】:Fast way to compute the minimal distance of two sets of k-dimensional vectors计算两组 k 维向量的最小距离的快速方法
【发布时间】:2010-06-06 13:30:23
【问题描述】:

我有两组k维向量,其中k在500左右,向量的个数通常更小。我想计算两组之间的(任意定义的)最小距离。 一个天真的方法是这样的:

(loop for a in set1
      for b in set2
      minimizing (distance a b))

但是,这需要 O(n² * 距离) 计算。有更快的方法吗?

【问题讨论】:

    标签: algorithm computational-geometry


    【解决方案1】:

    当距离是任意的(你必须检查每个可能的距离!)时,我认为你不能比 O(n^2) 做得更好。对于给定的距离函数,我们可能能够利用函数的属性,但不会有任何 general 算法可以比 O(n^2) 更好地处理任何距离函数(即o(n^2) : 注意小哦)。

    如果您的数据是动态的,并且您必须在不同时间不断获得最近的一对点,对于任意距离函数,Eppstein 的以下论文可能会有所帮助(其中有特殊的更新操作,以便找到最近的一对快点):

    您将能够将上述一组算法调整为两组算法(例如,通过将同一组点之间的距离定义为无穷大)。

    对于欧几里得类型 (L^p) 距离,有已知的 O(nlogn) 时间算法,它们适用于给定的一组点(即您不需要任何特殊的更新算法):

    当然,L^p 是针对一组的,但您也许可以将其调整为两组。

    如果您提供距离函数,可能我们更容易为您提供帮助。

    希望对您有所帮助。祝你好运!

    【讨论】:

      【解决方案2】:

      如果您的向量的分量是标量,我猜想对于您的中等 k=500 的情况,O(n²) 方法可能会尽可能快。您可以通过最小化距离²来简化计算。另外,距离(A_i, B_i) = distance(B_i, A_i),所以请确保您只比较它们一次(您只有 500!/(500-2)! 对,而不是 500²)。

      如果分量是 m 维向量 A 和 B,您可以将向量 A 的分量存储在 R-treekd-tree 中,然后通过遍历向量 B 的所有分量并找到最接近的对它最接近 A 的伙伴---这将是 O(n)。不要忘记 big-O 代表 n->infinity,因此树可能带有一些非常昂贵的常数项(即这种方法可能只对大 k 或向量 A 始终相同时才有意义)。

      【讨论】:

        【解决方案3】:

        将两组坐标放入Spatial Index,例如KD-tree

        然后计算这两个索引的交集。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-22
          • 1970-01-01
          • 2019-02-26
          • 2011-12-26
          • 1970-01-01
          • 1970-01-01
          • 2013-02-02
          相关资源
          最近更新 更多