2

关于this question的阐述,但有更多限制。欧几里得数据密度可变的简单k最近邻算法?

这个想法是相同的,找到一个简单,快速的2个欧几里德维数最近的邻居算法。如果您可以找到适合分区数据的网格大小,则分流网格似乎可以很好地工作。但是,如果数据不是均匀分布的,而是密度非常高和非常低的地区(例如美国人口),那么没有固定的电网规模可以保证足够的邻居和效率?这种方法是否仍能挽救?

如果没有,其他的建议将是有益的,但我希望的答案比移动到KD树那么复杂等

回答

1

如果你没有太多的元素,只是比较每一个与所有其他人。这可能会比你想象的要快得多;今天的机器是快速。不幸的是,平方因素迟早会抓住你;我认为对一百万个物体的线性搜索不需要太长的时间,所以你可能会有多达1000个元素。使用网格,甚至条纹,可能会大大提高这个数字。

但我认为你被困在四叉树(k-d树的特定形式)。你的整个地图是一个块,其中可以包含四个子块(左上,右上,左下,右下)。当一个块填充的元素多于你想进行线性搜索时,将其分解为更小的元素并传输元素。 (只有叶节点具有元素。)在给定点的给定半径内进行搜索很容易。从顶部开始,如果块的一部分位于点的范围内,请检查它的子块是否具有相同的方式。如果没有,请检查其元素。 (当搜索“最接近”时,要小心,方格意味着距离较近的物体可能位于一个更远的区域内,必须将所有物体都放在给定的半径内,然后检查它们是否全部如果你想要10最接近,你的半径20只拿起5,你需要尝试更大的半径,你可能有一个被拒绝的项目,证明是30远,认为你应该抓住它和其他几个人来弥补你的10。可能是25个客场中的一些物品,整个街区都被拒绝了,而你却想要它们,应该有更好的解决方案,但我还没有弄明白,我只是猜测半径和双倍直到我得到足够的。)

Quadtrees很有趣。如果你可以设置你的数据然后访问它,那很容易。当你试图找出谁在接近什么时,你的映射元素出现,消失和移动时会出现问题。