最近一对点算法变异

时间:2013-04-05 14:02:35

标签: c graph depth-first-search closest-points

我知道这可能是重复的,但它似乎是“最近点对”算法的变体。

  

给定一组 N 点(x,y)的单位平方和距离 d ,找到所有点对它们之间的距离最多为 d

对于大型 N ,强力方法不是一种选择。除了“扫描线”和“分而治之”的方法,还有一个更简单的解决方案吗?这对点是无向图的边缘,我需要遍历它并说它是否连接(我已经使用DFS做过,但是当N = 100万时它永远不会完成!)。

欢迎任何伪代码,评论或想法, 谢谢!

编辑:我在Sedgewick上发现了这本书(我现在正在查看代码):

  

当N足够大时,程序3.18使用链接列表的二维数组来将程序3.7的运行时间提高约1 / d2。它划分了单位   平方成一个相等大小的正方形网格。然后,对于每个方块,它构建所有的链接列表   属于那个方块的点数。二维阵列提供立即访问的能力   接近给定点的点集;链表提供了将点存储在哪里的灵活性   它们可能会在没有我们提前知道每个网格平方有多少点的情况下掉落。

2 个答案:

答案 0 :(得分:2)

我们真的在寻找一个圆心(x,y)和半径d内的点。

包围圆的正方形是中心(x,y)和边2d的正方形。这个广场的任何一点都不需要检查,它就出来了。因此,如果abs(xa-x)> a,则a(xa,ya)的点是out。 d或abs(ya -yb)> d。

由该圆圈封闭的正方形相同的是中心(x,y)和对角线2d的正方形。不需要检查该方块外的任何点,它都在。因此,如果abs(xa-x)<1,则a(xa,ya)为a点。 (d * 1.412)或abs(ya -yb)&lt; (d * 1.412)。

这两个简单的规则相结合,减少了很多要检查的点数。如果我们用x对点进行排序,过滤可能的点,按y排序,我们就会得到我们真正需要计算全距离的点。

答案 1 :(得分:0)

对于任何给定点,您可以使用曼哈顿距离(x-delta加y-delta)启发式滤除大部分不在距离“d”内的点 - 过滤掉曼哈顿距离更大的任何点比(sqrt(2)* d),然后对其余点进行昂贵且精确的距离测试。