我正在尝试找到一种快速算法,用于在二维空间中找到给定点的近似(近似,如果需要),其中经常从数据集中删除点并添加新点。
(相关地,我感兴趣的是这个问题的两个变体:一个可以被认为是随机添加和删除的点,另一个是所有点都在不断运动的颜色。)
一些想法:
这里有什么好选择?
答案 0 :(得分:2)
检查Bkd-Tree,即:
基于kd-tree的I / O高效动态数据结构。 [...] Bkd树保持其高空间利用率和优秀 查询和更新性能,无论对其执行的更新次数如何。
然而,这种数据结构是多维的,并不专门用于较低的维度(如kd树)。
在bkdtree中播放。
Dynamic Quadtrees也可以是候选者,具有O(logn)查询时间和O(Q(n))插入/删除时间,其中Q(n)是时间 在所使用的数据结构中执行查询。请注意,此数据结构专用于2D。然而,对于3D,我们有八叉树,并且以类似的方式可以将结构推广到更高的维度。
实施是QuadTree。
R*-tree是另一种选择,但我同意你的一般性。还存在r-star-tree个实现。
也可以考虑Cover tree,但我不确定它是否符合您的描述。阅读更多here,并检查CoverTree上的实施情况。
Kd-tree仍然应该被考虑,因为它在2个维度上的表现非常出色,并且其插入复杂度的大小也是对数。
nanoflann和CGAL是jsut的两个实现,其中第一个不需要安装而第二个需要安装,但可能性能更高。
无论如何,我会尝试多种方法和基准测试(因为它们都有实现,而且这些数据结构通常受数据的性质影响)。
答案 1 :(得分:2)
我同意(几乎)@gsamaras所说的所有内容,只是为了添加一些内容: