Ric*_*ard 6 algorithm 2d nearest-neighbor computational-geometry data-structures
我正在尝试找到一种快速算法,用于在二维空间中查找给定点的(近似,如果需要)最近的邻居,其中经常从数据集中删除点并添加新点。
(相关地,我对这个问题有两种变体:一种可以认为点是随机添加和删除的,另一种是所有点都在不断运动。)
一些想法:
这里有什么好的选择?
我同意(几乎)@gsamaras 所说的一切,只是添加一些内容:
该图取自本文档,有关更多信息,请参阅下面的要点。检查Bkd-Tree,它是:
基于 kd 树的I/O 高效动态数据结构。[..]无论对其执行的更新次数有多少,Bkd 树都保持其高空间利用率以及出色的查询和更新性能。
然而,这种数据结构是多维的,并且不专门用于较低维度(如 kd 树)。
在bkdtree中使用它。
动态四叉树也可以是候选者,具有 O(logn) 查询时间和 O(Q(n)) 插入/删除时间,其中 Q(n) 是在所使用的数据结构中执行查询的时间。请注意,此数据结构专门用于 2D。然而,对于 3D,我们有八叉树,并且以类似的方式可以将结构推广到更高的维度。
一个实现是QuadTree。
R*-tree是另一种选择,但我同意你的普遍性。r -star-tree实现也存在。
也可以考虑覆盖树,但我不确定它是否符合您的描述。在这里阅读更多内容,并检查CoverTree上的实现。
Kd 树仍然应该被考虑,因为它在二维上的性能非常出色,并且它的插入复杂度是对数的。
nanoflann和CGAL只是它的两个实现,第一个不需要安装,第二个不需要安装,但性能可能更高。
无论如何,我会尝试不止一种方法和基准(因为它们都有实现,并且这些数据结构通常受到数据性质的影响)。