在对数时间内找到矢量之间的最小角度

时间:2010-05-21 14:57:00

标签: language-agnostic math vector geometry big-o

我有n=10000个10维向量。 对于每个向量v1,我想知道最小化v2v1之间角度的向量v2

有没有办法比O(n^2)更快地解决这个问题?

4 个答案:

答案 0 :(得分:2)

你得到的基本上是球体上最接近点的问题(因为矢量之间的角度大致是它们的单位矢量所在的球体上的点之间的距离),所以你可能做某种二进制(也许三元会更容易避免太多的边界问题)空间分区分解。

但这对代码来说是不愉快的,并且可能没有比仅仅10,000点的天真方法快得多(特别是,你首先将点分为3 ^ 10 = 59049个盒子,尽管其中大部分都是是空的。一亿个十元素点产品应该不到一秒钟。

答案 1 :(得分:2)

您可以在O(n)时间内对所有向量进行归一化,并在最终的9维超球面上找到它们的参数化。然后,您可以在n-1维空间中使用空间搜索结构,如Kd树,以加速最近邻居查询。有很多众所周知的方法(ANN)可以做到这一点。

答案 2 :(得分:1)

哇。十维向量?你怎么用那些?

我想我会从将每个向量减少到单位长度开始 - 即,到超球面上的点 - 然后使用一些“最近邻搜索”(NNS)算法,如kD树(k维二叉树), R-tree,Best Bin First等。

这可能不可能比O(n log n)更快地解决这个问题,因为如果你能比这更快地解决这个问题,你可以比O的当前下界更快地解决更简单的“最接近的点对问题”。 (n log n)。

正如Tom Womack所指出的那样,蛮力O(n ^ 2)算法对于“小”数据量的这些更复杂的算法将花费更少的实际挂钟时间,并且它看起来像“n = 10000” 10维度相对较小。

答案 3 :(得分:-3)

如何计算每个向量的角度(O(n))然后根据角度(O(nlogn))对数组进行排序,然后只需遍历数组(O(n)),最近的向量是i + 1或i-1。

修改 正如评论中所指出的,这仅适用于2个维度。