远离点集的查询点的 3D 最近邻
3D Nearest neighbour for query points located far away from set of points
我需要回答很多关于在远离查询点的点集中寻找最近邻居的问题。到目前为止我发现的所有方法在这种情况下都不好用(例如,k-d 树每个查询可能有 O(N))或者需要使用 Voronoi 图(我有 ~10m 点所以 Voronoi 图太贵了)。
是否有为此类任务设计的已知算法?
这里的问题是距离。你看,当查询距离你的数据集很远时,kd-tree 必须检查很多点,从而减慢查询时间。
你面临的场景一般来说对于最近邻结构来说很难(而且这不是通常的情况),但如果我是你,我会用 Balanced Box-Decomposition trees 试一试,你可以阅读更多关于他们的算法和数据结构。
一些多维索引具有 kNN 查询,可以很容易地适应您的需要,尤其是 k==1 时。
kNN 算法通常必须首先估计近似的最近邻距离,然后他们使用这个距离来执行范围查询。
在 R 树或四叉树中,可以通过找到最接近搜索点的节点来有效地完成此估计。然后他们从最近的节点取一个点,计算到搜索点的距离,然后根据这个距离进行范围查询,通常会加上一些乘数,因为 k>1。
即使搜索点很远,这也应该是合理的效率。
如果您只搜索一个点 (k=1),那么您可以调整此算法以使用完全基于您找到的最近点的范围查询,无需额外扩展即可获得 k>1 个点。
如果您正在使用 Java,您可以使用我的开源实现 here. There is also a PH-Tree(一种四叉树,但 space 效率更高且加载速度更快),它使用相同的 kNN 方法。
我需要回答很多关于在远离查询点的点集中寻找最近邻居的问题。到目前为止我发现的所有方法在这种情况下都不好用(例如,k-d 树每个查询可能有 O(N))或者需要使用 Voronoi 图(我有 ~10m 点所以 Voronoi 图太贵了)。
是否有为此类任务设计的已知算法?
这里的问题是距离。你看,当查询距离你的数据集很远时,kd-tree 必须检查很多点,从而减慢查询时间。
你面临的场景一般来说对于最近邻结构来说很难(而且这不是通常的情况),但如果我是你,我会用 Balanced Box-Decomposition trees 试一试,你可以阅读更多关于他们的算法和数据结构。
一些多维索引具有 kNN 查询,可以很容易地适应您的需要,尤其是 k==1 时。 kNN 算法通常必须首先估计近似的最近邻距离,然后他们使用这个距离来执行范围查询。 在 R 树或四叉树中,可以通过找到最接近搜索点的节点来有效地完成此估计。然后他们从最近的节点取一个点,计算到搜索点的距离,然后根据这个距离进行范围查询,通常会加上一些乘数,因为 k>1。 即使搜索点很远,这也应该是合理的效率。
如果您只搜索一个点 (k=1),那么您可以调整此算法以使用完全基于您找到的最近点的范围查询,无需额外扩展即可获得 k>1 个点。
如果您正在使用 Java,您可以使用我的开源实现 here. There is also a PH-Tree(一种四叉树,但 space 效率更高且加载速度更快),它使用相同的 kNN 方法。