是否有一种数据结构可以有效地找到彼此靠近的点?

Is there a datastructure that allows finding points close to each other efficiently?

我正在寻找数据结构。
假设你有 n 个点 p := (x,y) 且 x,y ∈ [-128, 128]
您现在初始化数据结构并将所有 n 个点添加到其中。
现在对于任何你想轻松找到它附近的点。
更准确地说:
指定半径 r<1 和点 p.
您想要一个函数 F 输出所有点 q 的(未排序的)列表,其中 d(p,q) < r
现在我正在寻找一种允许优化此功能的数据结构 (标准算法在 O(n) 中,你能做得更好吗?)
如果能得到答复,我将不胜感激 :)

对于那些了解自己的东西并想进一步提供帮助的人:
假设点在间隔期间移动(最大距离为 < 2)。
在为每个点(n 次)调用每个间隔 F 期间,我们现在想要扩展优化,以便在每个间隔之后函数 F 都有效。
所以我们想要一个函数 G 来计算数据结构。
G 被调用一次,F 被调用 n 次。我们想要 O(G) + n*O(F) < O(n^2)

就最坏情况而言,确实没有改进的余地,因此我们假设在每个点 p 的每个间隔中,至少有 50% 的点在函数 F 指定的半径之外

上面的值是任意的,应该可以与任何其他数字交换。我选择这些数字是为了让问题更容易理解,另外 x 和 y 是浮点数。


我想要一个将我指向另一篇文章、维基百科条目或具有相同或相似问题的任何其他来源的答案。我真的希望没有人花一整天的时间向我解释数据结构;)

无论如何,感谢所有帮助。非常感谢。

有很多好的数据结构可以用来有效地解决二维问题。与标准线性搜索相比,k-d 树数据结构允许您相当快速地搜索矩形中的所有点,前提是这些点或多或少是随机分布的。四叉树数据结构同样支持这种搜索。 R 树是另一种选择,尽管它们主要针对拥有大量点并希望在磁盘上有效存储信息的情况进行了优化。

我的回忆是,在最坏的情况下,所有这些方法都需要时间 O(n),但仅限于病态选择的输入。对于具有“合理”分布的输入,这些算法的运行时间通常要好得多,因此它们被广泛使用。

希望对您有所帮助!

这个问题让我想起了前段时间写的一个粒子模拟(和你描述的问题类似)。我找到了一个数据结构,它允许(在实践中有一些小偏差并假设你选择了大量的块)复杂度为 O(n)。

您可以将您拥有的二维 space 分成小矩形(我认为正方形在您的情况下是最好的)块(边长大于 r)。

然后你需要 O(n) 时间将这些点分类到这些块中。

k 为您拥有的区块总数。

然后为每个点找到半径 r 内的所有点将需要 O(n*(n/k)) = O(n²/k) 其中 n/k 是每个块内点的近似数量(假设正则分布这对于粒子模拟来说是正确的,但不确定你的问题)。请记住,对于每一点,您还需要查看 8 个相邻的块!

然后你还有一个额外的 O(k),这是因为你需要遍历块来访问元素。

所以这个数据结构总共有 O(n²/k + n + k) 的复杂度。 现在要找到 n 和最佳 k 之间的关系,您必须找到函数 f(k) = a*n²/k + b*n + c*k 的最小值,这可以通过找到导数并将其设置为零来完成:

f'(k) = -an²/k² + c = 0n²/k² = c/a = constant → n 与 k 成正比,因此如果 k 可以选择最优:

O(n²/k + n + k) = O(n²/n + n+ n) = O(n)

最坏的情况当然还是O(n²)k = 1