我有一个包含500,000个点的100维空间数据库,我想找到最接近的2个点。如何做到呢?
更新:空间是欧几里得空间,抱歉。谢谢大家的回答。顺便说一句,这不是作业。
我有一个包含500,000个点的100维空间数据库,我想找到最接近的2个点。如何做到呢?
更新:空间是欧几里得空间,抱歉。谢谢大家的回答。顺便说一句,这不是作业。
算法导论中有一章专门讲解如何在二维空间中以O(n*logn)的时间找到两个最近的点。你可以在Google图书上查看。事实上,我建议每个人都去看看,因为他们将分治技术应用于这个问题的方式非常简单、优雅和令人印象深刻。
虽然它不能直接扩展到您的问题(因为常数7
将被替换为2^101 - 1
),但对于大多数数据集来说,它应该是完全可以胜任的。所以,如果您的输入数据相当随机,它会给您提供O(n*logn*m)
的时间复杂度,其中n
是点的数量,m
是维数。
编辑
这一切都是基于您有欧几里得空间的假设。即,向量v
的长度是sqrt(v0^2 + v1^2 + v2^2 + ...)
。然而,如果您可以选择度量标准,就可能有其他优化算法的选项。
对你的数据运行PCA,将向量从100维转换为20维。然后创建一个K-最近邻树(KD-Tree),并基于欧几里得距离获取最接近的2个邻居。
通常,如果维数非常大,则必须采用蛮力方法(并行+分布式/映射缩减)或基于聚类的方法。