我有 n=10000
个10维向量。
对于每一个向量 v1
,我想知道最小化 v1
和另一个向量 v2
之间夹角的向量 v2
是什么。
有没有一种比 O(n^2)
更快的方法来解决这个问题?
我有 n=10000
个10维向量。
对于每一个向量 v1
,我想知道最小化 v1
和另一个向量 v2
之间夹角的向量 v2
是什么。
有没有一种比 O(n^2)
更快的方法来解决这个问题?
您可以在O(n)时间内对所有向量进行归一化,并将它们参数化到结果为9维的超球面上。然后,您可以在n-1维空间中使用空间搜索结构,如Kd树,来加速最近邻查询。有已知的方法(ANN)可以做到这一点。
哇,十维向量?那你打算拿它们做什么?
我想我会先将每个向量缩小为单位长度——也就是在超球面上的点,然后使用一些“最近邻搜索”(NNS)算法,例如kD树(k维二叉树)、R树、Best Bin First等。
可能无法比O(n log n)更快地解决这个问题,因为如果您可以比这更快地解决此问题,则可以比当前下限O(n log n)更快地解决更简单的“最近对点问题”。
正如Tom Womack所指出的那样,“暴力”的O(n ^ 2)算法将需要比这些更复杂的算法更少的实际墙钟时间,而“n = 10000”在10个维度中看起来相对较小。
你可以为每个向量计算角度(O(n)),然后根据角度对数组进行排序(O(nlogn)),最后遍历整个数组(O(n)),最接近的向量要么是i+1,要么是i-1。
编辑: 正如评论中指出的那样,这种方法只适用于二维空间。