给定d维空间中的n个点,有几个数据结构,例如Kd-Trees,Quadtrees等,用于索引点。在这些数据结构上,可以针对给定输入点实现最近邻查询的直接算法。 是否有书籍,论文,调查......比较不同数据结构上最近邻居查询的理论(主要是预期)运行时间? 我正在查看的数据由相当小的点云组成,因此它可以在主内存中处理。为简单起见,我假设数据是均匀分布的。也就是说,我对现实世界的表现并不感兴趣,而是对理论结果感兴趣
答案 0 :(得分:4)
您可以不确定点的尺寸,只需给出点数的近似值。小意味着什么?它与一个人的意义相对较小。
当然,您搜索的内容并不存在。你的问题就是这个:
<强>问题强>:
对于一个小的(对你来说意味着什么),数据集,任何维度,数据遵循统一分布,是什么样的最佳数据结构?
<强>答案强>:
没有这样的数据结构。
对此有一个答案是不是很奇怪?一个错误的比喻是将这个问题作为同义词,&#34;哪个是最优的编程语言?&#34;大多数一年级本科生都有这样的问题。你的问题不是那么天真,而是它走在同一条轨道上。
为什么没有这样的数据结构?
因为,数据集的维度是可变的。这意味着,您可能拥有2个维度的数据集,但它也可能意味着您拥有1000个维度的数据集,甚至更好的1000个维度的数据集,其中intrinsic dimension远小于1000。考虑一下,可以提出一个数据结构,对我提到的三个数据集表现得同样好吗?我对此表示怀疑。
事实上,有些数据结构在低维度(例如四叉树和KD树)中表现得非常好,而其他数据结构在更高维度(例如RKD树林)中表现更好。
此外,用于最近邻搜索的算法和期望严重取决于数据集的维度(以及数据集的大小和查询的性质(例如,距离数据集太远或与数据集的点距离相等的查询可能会导致搜索性能变慢))。
在较低维度中,可以执行k-最近邻(k-NN)搜索。在更高维度中,执行k近似NN搜索更为明智。在这种情况下,我们遵循以下权衡:
速度VS准确度
通过牺牲结果的正确性,我们实现了更快的程序执行。换句话说,我们的搜索例程会相对较快,但它可能(这可能取决于许多参数,例如您的问题的性质和您正在使用的库)不返回true NN,但是精确NN的近似值。例如,它可能找不到确切的NN,而是查询点的第三个NN。您还可以查看approximate-nn-searching wiki标记。
为什么不总是搜索确切的NN?由于curse of dimensionality,导致较低维度中提供的解决方案表现得像蛮力一样好(搜索每个查询的数据集中的所有点)。
你看我的答案已经很大了,所以我应该停在这里。你必须承认,你的问题太宽泛,但有趣。 :)
总之,使用哪种最佳数据结构(和算法)取决于您的问题。您正在处理的数据集的大小,点的维度和内在维度起着关键作用。查询的数量和性质也起着重要作用。
答案 1 :(得分:0)
对于可能非均匀点数据的最近邻搜索,我认为kd树将为您提供最佳性能。至于广泛的概述和理论成本分析,我认为维基百科是一个可以开始的好地方,但请记住,它不包括太多的现实世界优化:
http://en.wikipedia.org/wiki/Nearest_neighbor_search
http://en.wikipedia.org/wiki/Space_partitioning
理论上的表现是一回事,但现实世界的表现完全是另一回事。实际的性能取决于数据结构实现的细节,与数据结构的类型有关。例如,由于提高了高速缓存一致性和更快的数据分配,无指针(紧凑数组)实现可以比基于指针的实现快许多倍。理论上更广泛的分支可能会更慢,但如果您利用SIMD同时测试多个分支,实际上更快。
您的点数据的确切性质也会对性能产生重大影响。统一分布要求较低,可以使用更简单的数据结构快速处理。非均匀分布需要更多关注。 (Kd-tree适用于统一数据和非统一数据。)另外,如果您的数据太大而无法处理内核,那么与较小的数据集相比,您将需要采用完全不同的方法。