2D,C ++中的所有k个最近邻居

时间:2010-11-13 11:50:43

标签: c++ algorithm nearest-neighbor large-data

我需要为数据集的每个点找到所有最近的邻居。数据集包含约。 1000万2D点。数据接近网格,但不形成精确的网格......

此选项排除(在我看来)使用KD树,其中基本假设是没有点具有相同的x坐标和y坐标。

我需要一个快速算法O(n)或更好(但实现起来并不太困难:-)))来解决这个问题......由于boost没有标准化,我不想使用它...

感谢您的回答或代码示例...

2 个答案:

答案 0 :(得分:12)

我会做以下事情:

  1. 在积分之上创建一个更大的网格。

  2. 线性地浏览这些点,并为每一个点找出它所属的大“单元格”(并将这些点添加到与该单元格关联的列表中)。

    (这可以在每个点的恒定时间内完成,只需对点的坐标进行整数除法。)

  3. 现在再次线性地浏览这些点。要找到10个最近的邻居,您只需要查看相邻较大的单元格中的点。

    由于您的分数相当均匀,您可以按照与每个(大)单元格中的点数成比例的时间进行此操作。

  4. 这是描述情况的(丑陋)图片:

    enter image description here

    单元格必须足够大(中心),相邻单元格必须包含最接近的10个点,但要小到足以加速计算。您可以将其视为“哈希函数”,您可以在其中找到同一个桶中最近的点。

    (请注意,严格来说,它不是 O(n),但通过调整较大单元格的大小,你应该足够接近。: - )

答案 1 :(得分:1)

我使用了名为ANN(近似最近邻)的库,取得了巨大成功。它确实使用了Kd-tree方法,尽管尝试了多种算法。我用它来表示三角形表面上的点位置。你可能会有运气。它很简单,只需放入源代码就很容易包含在我的库中。

祝你好运这个有趣的任务!