Data structures 距离树在空间搜索问题中应用广泛吗?

Data structures 距离树在空间搜索问题中应用广泛吗?,data-structures,computational-geometry,kdtree,range-tree,Data Structures,Computational Geometry,Kdtree,Range Tree,我正在寻找一些数据结构的范围搜索。我认为范围树提供了很好的时间复杂性(但有一些存储要求) 然而,在我看来,其他数据结构,如KD树,比范围树更值得讨论和推荐。这是真的吗?如果是,原因是什么?我认为这是因为kd树可以直接扩展到包含点以外的对象。这为它提供了许多应用程序,例如虚拟世界,我们需要快速查询三角形。范围树的类似扩展并不简单,事实上我从未见过 简单回顾一下:kd树可以在O(n logn)时间内将d空间中的一组n点预处理到使用O(n)空间的结构中,这样任何d维范围查询都可以在O(n1-1/d+k

我正在寻找一些数据结构的范围搜索。我认为范围树提供了很好的时间复杂性(但有一些存储要求)


然而,在我看来,其他数据结构,如KD树,比范围树更值得讨论和推荐。这是真的吗?如果是,原因是什么?

我认为这是因为kd树可以直接扩展到包含点以外的对象。这为它提供了许多应用程序,例如虚拟世界,我们需要快速查询三角形。范围树的类似扩展并不简单,事实上我从未见过

简单回顾一下:kd树可以在O(n logn)时间内将d空间中的一组n点预处理到使用O(n)空间的结构中,这样任何d维范围查询都可以在O(n1-1/d+k)时间内得到回答,其中k是答案数。范围树需要O(n logd-1n)时间进行预处理,需要O(n logd-1n)空间,并且可以在O(logd-1n+k)时间内回答范围查询

如果我们讨论的是二维或三维空间,那么范围树的查询时间显然要比kd树好得多。然而,kd树有几个优点。首先,它总是只需要线性存储。其次,它总是在O(n logn)时间内构造。第三,如果维度非常高,它将优于范围树,除非您的点集非常大(尽管可以说,在这一点上,线性搜索几乎与kd树一样快)

我认为另一个重要的观点是kd树比射程树更为人们所熟知。在参加计算几何课程之前,我从未听说过距离树,但我以前听说过kd树,并曾使用过kd树(尽管是在计算机图形环境中)

编辑:当您有数百万个点时,您会问对于二维或三维固定半径搜索,什么样的数据结构更好。我真的不能告诉你!我倾向于说,如果执行许多查询,范围树将更快,但对于3D,构建速度将慢一倍O(logn),内存使用可能比速度更快。我建议集成这两种结构的良好实现,并简单地测试哪些更适合您的特定需求。

根据您的需要(2D或3D中的粒子模拟),您需要一种能够进行所有最近邻查询的数据结构。覆盖树是最适合此任务的数据结构。我在计算核密度估计的最近邻时遇到了它。这解释了树的基本定义,并有一个C++实现的链接。p>
单个查询的运行时间是O(c^12*logn),其中c是数据集的扩展常数。这是一个上限-实际上,数据结构的执行速度比其他结构快。显示粒子模拟所需的所有最近邻(所有数据点)批处理的运行时间为O(c^16*n),该理论线性界限也适用于您的需要。构建时间为O(nlogn),存储时间为O(n)。

因此,如果我想对粒子模拟进行2D或3D固定半径搜索,在有数百万个点且搜索范围比整个空间小得多的情况下,您认为哪种数据结构更好?我应该使用范围树还是有更好的替代方法?基本上,我希望对每个particles@Alaya在这种情况下,您可能正在寻找一种称为“所有最近邻搜索”的方法。我在谷歌上搜索了这些数据结构和算法,但发现它们似乎是用来解决最近邻问题的。那么,我应该如何使用它们来解决固定半径的邻居搜索,我是否需要反复进行第k个最近邻居搜索,直到我发现第k个邻居超出搜索半径?我没有试过,但我想那会造成很多浪费。@Alaya考虑到复杂性是O(mn log n),m是邻居的数量,很可能是这样。维基百科的页面也提供了一些参考。如果我想搜索固定半径内的所有邻居,而不是搜索最近的邻居,覆盖树仍然是一个实用的选择吗?当然,这正是它的目标