空间查询点的第k个最近邻居

时间:2017-09-02 11:34:33

标签: c++ data-structures spatial knn nearest-neighbor

我正在研究一种算法,该算法反复需要距离某个给定查询点的第k个最近点的(欧几里德)距离,这些点都来自点矢量。此外,我反复需要找到一个点的给定半径内的所有点。

我正在考虑使用nanoflann库中的k-d树。但是,knnSearch()函数返回所有k个最近邻居,这是我不需要的。 (但是,radiusSearch()函数很适合我。)

有没有更有效的方式来获得我需要的东西,除了每次都在穿过所有k个最近的邻居?更好的数据结构还是更好的实现? (我正在使用C ++。)

1 个答案:

答案 0 :(得分:1)

  

我正在考虑使用k-d树

2D或3D的绝佳选择。

对于低维数据而言,k-d树是一个很好的选择(我假设你已经将nanoflann“主要针对2D或3D点云进行了优化。”)。

  

是否有更有效的方法来获得我需要的东西,除了每次都在k所有k个最近的邻居之外?

你需要第k个最近邻(NN),但是当在kd树中搜索k个NN时,昂贵的操作(就时间而言)是找到第一个NN(需要你从树上下来,所有从根到叶子的方式。)

找到第2个,第3个或另一个索引的NN相对便宜,我高度怀疑它会损害性能(即从树返回的k个NN中获取第k个NN将成为瓶颈)。 / p>

所以,我强烈建议你不要担心这一步。

  

更好的数据结构还是更好的实施?

我不这么认为。我没有使用nanoflann,但CGAL用于此类查询,值得尝试(但CGAL需要安装(不是小菜一碟),而nanoflann只是一个标题包括)。