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

时间:2015-06-13 03:47:01

标签: algorithm data-structures graph-algorithm nearest-neighbor point-clouds

假设在x-y-z 3D空间中存在具有50 000个点的点云。对于这个云中的每个点,应该实现什么算法或数据限制来找到给定点的k个邻居,这些邻居在[R,r]的距离内?天真的方法是对50 000点中的每一点通过49 999点中的每一点并进行度量测试。但这种方法需要很长时间。就像kd树在很短的时间内找到最近的邻居一样,那么是否有一些实时的DS /算法实现预处理点云以实现最短时间的目标?

4 个答案:

答案 0 :(得分:1)

您的问题是Nearest Neighbor Search主题的一部分,或者更准确地说是k-Nearest Neighbor Search。您的问题的答案取决于您用于存储点的数据结构。如果您使用R-treesR*-trees等变体,并且您正在对数据库进行多次搜索,那么与天真线性搜索相比,您可能会在二维或三维空间中发现显着的性能提升。在更高的维度中,空间划分方案往往表现不如线性搜索。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

如果您使用普通的欧几里德度量标准,您可以遍历列表三次并提取每个维度中R内的那些点,实质上是提取封闭的多维数据集。搜索结果列表仍然是O(n ^ 2),但是要小得多。

答案 3 :(得分:0)

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

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

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