Algorithm 超球面上与另一点最近的点

Algorithm 超球面上与另一点最近的点,algorithm,performance,computational-geometry,Algorithm,Performance,Computational Geometry,在维度为m(10^4到10^6之间)的超球面上,我有n个(大约10^5)点 我将做一系列的查询,形式是“给定一个点p,找到n个点中与p最近的一个”。我将提出这些查询中的大约n个 (不确定hypersphere事实是否有帮助。) 解决这个问题的简单朴素算法是,对于每个查询,将p与所有其他n个点进行比较。这样做n次,最终得到的运行时间是O(n^2m),这对我来说太大了,无法计算 有没有更有效的算法可以使用?如果我能用一些对数因子把它计算到O(nm),那就太好了。可能不行。拥有多个维度使得高效的索引非

在维度为m(10^4到10^6之间)的超球面上,我有n个(大约10^5)点

我将做一系列的查询,形式是“给定一个点p,找到n个点中与p最近的一个”。我将提出这些查询中的大约n个

(不确定hypersphere事实是否有帮助。)

解决这个问题的简单朴素算法是,对于每个查询,将p与所有其他n个点进行比较。这样做n次,最终得到的运行时间是O(n^2m),这对我来说太大了,无法计算


有没有更有效的算法可以使用?如果我能用一些对数因子把它计算到O(nm),那就太好了。

可能不行。拥有多个维度使得高效的索引非常困难。这就是为什么人们寻找机会将维度的数量减少到可管理的程度


更多信息,请参见和。

将您的空间划分为超立方体(称为这些单元),并选择边缘大小,以便平均每个立方体有一个点。您需要从超单元到它们包含的点集的映射

然后,给定一个点,检查其超单元中的其他点。如果它是空的,请查看相邻的超单元(为了简单起见,我建议使用超单元的文字超立方体,而不是类似于由超单元构建的超球体)。检查其他点。不断重复,直到你得到一个要点。假设你的分数是随机分布的,那么你很可能会在1-2次扩展中找到第二个点


一旦找到一个点,检查所有可能包含一个较近点的超单元。这是可能的,因为你找到的点可能在一个角落里,但在超立方体外面有一个更近的点,包含了你迄今为止检查过的所有超单元。

这种方法在2-3维中非常有效。但在10000中就不是那么好了,因为每个点都有可能最终形成一个无与伦比的超立方体,你无论如何都得看看最后的每个点。