我在维数为m的超球面上有一个(大约10 ^ 5)个点(在10 ^ 4到10 ^ 6之间)。
我将对形式进行一系列查询"给定点p,找到n点中最接近的p"。我将对其中的n个进行查询。
(不确定超球面事实是否有帮助。)
解决此问题的简单朴素算法是,对于每个查询,将p与所有其他n个点进行比较。这样做n次最终会得到O(n ^ 2 m)的运行时间,这对我来说太大了,无法计算。
我可以使用更高效的算法吗?如果我能用一些对数因子来得到O(nm),那就很好了。
答案 0 :(得分:3)
可能不是。具有多个维度使得有效索引极其困难。这就是为什么人们寻找机会将维数减少到可管理的范围。
有关详情,请参阅https://en.wikipedia.org/wiki/Curse_of_dimensionality和https://en.wikipedia.org/wiki/Dimensionality_reduction。
答案 1 :(得分:0)
将你的空间划分为超立方体 - 调用这些单元格 - 选择边缘大小,这样平均每个立方体就有一个点。您需要一个从超级单元到它们包含的点集的地图。
然后,给定一点,检查其超晶胞是否有其他点。如果它是空的,请查看相邻的超级单元(为了简单起见,我推荐使用超级单元的文字超立方体,而不是对由超级单元构建的超球面的一些近似)。检查其他点。不断重复,直到你明白为止。假设你的积分是随机分布的,你可以在1-2次扩展中找到第二个点的几率很高。
找到一个点后,检查所有可能包含更近点的超级单元。这是可能的,因为您找到的点可能在一个角落,但在超立方体之外有一些更近的点,包含您目前已检查的所有超级单元。