适用于2D中快速k-最近邻搜索的数据结构和算法

我有一个大约100,000(X,Y)对的数据集表示2D空间中的点.对于每个点,我想找到它的k最近的邻居.

所以,我的问题是 – 什么数据结构/算法是一个合适的选择,假设我想绝对最小化整体运行时间?

我不是在寻找代码 – 只是指向一个合适的方法.我有点担心,似乎相关的选择范围 – 四叉树,R树,kd树等.

我认为最好的方法是建立一个数据结构,然后为每个点运行某种k-最近邻搜索.但是,由于(a)我提前知道这些要点,(b)我知道我必须对每一个点进行一次搜索,也许有更好的方法?

一些额外的细节:

>由于我想最大限度地减少整个运行时间,我不在乎大部分时间花在结构对搜索上.
>(X,Y)对相当好的扩展,所以我们可以假设一个几乎均匀的分布.

最佳答案
如果k相对较小(<20左右),并且您具有大致均匀的分布,则创建一个覆盖点落下的范围的网格,以使每个网格的平均点数舒适地高于k(从而一个中心位置的点通常会在该一个网格点中获得其k个邻居).然后创建一组其他网格,从每个轴的第一个(重叠)设置一半.现在,对于每个点,计算它落入哪个网格元素(由于网格是规则的,不需要搜索),并选择四个(或不同的重叠网格之一),其中最靠近其中心的那一个. 在每个网格元素中,这些点应该在一个坐标中排序(就是说x).从您选择的元素(使用二分法找到),沿排序列表向外走,直到找到k个项目(再次,如果k小,则保持k个最佳匹配列表的最快方法是使用二进制插入排序当插入时,让最差的匹配落到最后;插入排序通常会在现代硬件上比其他所有物品达到约30项).继续前进,直到你最远的最邻近的人比你离开你最近的距离更接近你(即不计算他们的y偏移量,所以可能没有新的点可能比迄今为止最近发现的最近) . 如果您还没有k点,或者您有k点,但是网格元素的一个或多个墙壁比k点最远的距离更靠近您的兴趣点,请将相关的相邻网格元素添加到搜索中. 这应该给你像O(N * k ^ 2)这样的东西,具有相对较低的常数因子.如果k大,那么这个策略太简单了,你应该选择一个在k中是线性或对数线性的算法,就像kd-tree一样.

转载注明原文:适用于2D中快速k-最近邻搜索的数据结构和算法 - 代码日志