最近点对算法的变种

时间:2012-07-17 15:49:13

标签: algorithm geometry

最近的点对问题在计算几何中是众所周知的:给定点(x,y)列表找到具有最小欧几里德距离的点对。现在我要问这个问题的变体:给定n个点(xi,yi)(n + 1> i> 0)的列表,找到每个点(xi,yi)的最近的欧几里德距离,然后计算所有点的平均最近欧几里德距离。我知道蛮力方法:

all_distance = [];
for i= 1 to n
    p = (xi,yi);
    dis = [];
    for j= 1 to n
      if j==i
          continue;
      else
          q = (xj,yj);
          pt_dis = distance(p,q);
      end 
      dis = [dis; pt_dis];
    end
    all_distance = [all_distance; nearest(dis)]

end
mean_distance = all_distance/n;

这种方法很简单,但计算起来很慢。我想知道是否有一些快速算法来解决这个问题。谢谢!

2 个答案:

答案 0 :(得分:2)

这个问题通常最好通过kd-treequadtree来解决,但是如果你想要快速和肮脏的东西,那么你应该尝试以某种方式来积分你的积分。也就是说,假设您的点大致均匀地分布在范围(0,0)到(10,10)中,您可以制作1个单位平方的桶,在这种情况下为100个桶。现在,您通过查找其存储桶中的最近点以及所有八个相邻存储桶来处理点。如果您发现任何1个单位或更少的点,那么您就知道它是最近的点,因为更近的点不一定在相邻的一个桶中,这意味着它必须超过1个单位。如果你没有找到一个接近的点,那么你将需要检查所有点,或者你可以扩展到下一个桶。

答案 1 :(得分:2)

您可以在O(n log n)时间内计算Delaunay triangulation,对于每个顶点,最近的点将是三角测量中的相邻点之一。将检查O(n)个总边缘,因此它由O(n log n)三角测量成本支配。