一尘不染

比较不同数据结构上的最近邻居查询的运行时

algorithm

给定d维空间中的n个点,可以使用几种数据结构(例如Kd树,四叉树等)为这些点建立索引。在这些数据结构上,可以为给定输入点周围的最近邻居查询实现直接算法。是否有一本书,论文,调查报告……可以比较不同数据结构上最近邻居查询的理论(大多数是预期的)运行时间?我正在查看的数据由相当小的点云组成,因此都可以在主内存中进行处理。为了简单起见,我假设数据是均匀分布的。也就是说,我对现实世界的表现不感兴趣,而是对理论结果感兴趣


阅读 157

收藏
2020-07-28

共1个答案

一尘不染

您可以使点的尺寸不确定,而仅给出点数的近似值。小意味着什么?一个人小小的意思是相对的。

您搜索的内容当然不存在。您的问题几乎是这样的:


问题

对于小型数据集(无论对您而言意味着什么),对于具有遵循均匀分布的数据的任何维度,最佳的数据结构是什么?

没有这样的数据结构。


对此没有答案是否太奇怪?一个错误的类比就是这个问题的代名词:“哪种是最佳编程语言?”
大部分第一年的本科生都有这个问题。您的问题不是那么幼稚,而是走在同一条路上。


为什么没有这样的数据结构?

因为,数据集的维度是可变的。这意味着,您可能有一个2维的数据集,但也可能意味着您有一个1000维的数据集,或者甚至有一个1000维的数据集,其固有维数远小于1000。考虑一下,是否可以提出一种数据结构,使其对我提到的三个数据集表现同样好?我对此表示怀疑。

实际上,有些数据结构在低维度上表现得非常好(例如四叉树和KD树),而另一些数据结构在较高维度上的表现要好得多(例如RKD树森林)。

此外,用于最近邻居搜索的算法和期望值在 很大程度上
取决于数据集的维度(以及数据集的大小和查询的性质(例如,距离数据集太远或等距的查询)从数据集的角度来看可能会导致搜索性能降低))。

在较小的维度中,将执行k最近邻(k-NN)搜索。在更高的维度上,执行k-近似NN搜索会更明智。在这种情况下,我们遵循以下权衡:

速度VS精度

发生的是,通过牺牲结果的正确性,我们可以更快地执行程序。换句话说,我们的搜索例程将相对较快,但是(可能会取决于许多参数,例如您的问题的性质和所使用的库)(它的可能性取决于)
而不是
返回真正的NN,而是近似确切的NN。例如,它可能找不到确切的NN,而是找到查询点的第三个NN。您也可以检查近似nn搜索的 Wiki标记。

为什么不总是搜索确切的NN?由于维数诅咒,导致较低维数提供的解决方案的行为与蛮力一样好(在每个查询中搜索数据集中的所有点)。


您看到我的答案已经很大,所以我应该在这里停止。我必须承认,你的问题太笼统了,但很有趣。:)


总之,哪种最佳数据结构(和算法)可以使用取决于您的问题。 您正在处理的数据集的大小,点的尺寸和固有尺寸起着关键作用。查询的数量和性质也起着重要作用。

2020-07-28