在一定范围内找到k个邻居的算法?

Algorithm to find k neighbors in a certain range?

假设在 x-y-z 3D space 中有一个具有 50 000 个点的点云。对于这个云中的每个点,应该实施什么算法或数据结构来找到给定点在 [R,r] 距离内的 k 个邻居?天真的方法是对 50 000 个点中的每个点都检查 49 999 个点中的每个点并进行度量测试。但这种方法将花费大量时间。就像有 kd 树可以在短时间内找到最近的邻居一样,是否有一些实时 DS/algo 实现来预处理点云以实现最短时间的目标?

如果您使用的是普通欧几里德度量,则可以遍历该列表三次并提取每个维度中 R 内的那些点,实质上是提取封闭的立方体。搜索结果列表仍然是 O(n^2),但在更小的 n.

有高效的算法(平均而言,对于随机数据),参见Nearest neighbor search

您的方法效率不高,但很简单。

请仔细阅读,检查您的要求并返回,以便我们提供帮助。

您的问题是 Nearest Neighbor Search, or more precisely, k-Nearest Neighbor Search. The answer to your question depends on the data structure you are using to store the points. If you use R-trees or variants like R*-trees 主题的一部分,并且您正在对您的数据库进行多次搜索,您可能会发现二维或三维 space 与朴素的线性搜索。在更高维度中,space 分区方案往往不如线性搜索。

正如一些答案已经建议的 NN 搜索,您可以使用一些树算法,如 k-d-tree。所有编程语言都有可用的实现。

如果您的描述 [R,r] 建议空心球体,您应该比较一次性测试(在间隔内)与两个阶段(外部测试并移除通过内部测试的样本) .

您也没有提到性能要求(时序或帧率?)和您的预期应用(可行的方法?)。