Algorithm 最近点对算法的一种改进

Algorithm 最近点对算法的一种改进,algorithm,geometry,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;

最近点对问题在计算几何中是众所周知的:给定一组点(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;

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

这个问题通常最好用or来解决,但是如果你想要快速而肮脏的东西,那么你可能应该试着用某种方式来反驳你的观点。也就是说,假设您的点在(0,0)到(10,10)范围内大致均匀分布,您可以制作1个单位平方的桶,在本例中为100个桶。现在,您可以通过查找其桶中最近的点和所有八个相邻桶来处理点。如果您发现任何距离为1个单位或更少的点,则您知道它是最近的点,因为较近的点必须不在相邻的铲斗中,这意味着它必须距离1个单位以上。如果找不到如此接近的点,则需要检查所有点,或者可以扩展到下一个桶环。

可以计算O(n log n)时间,对于每个顶点,最近的点将是三角剖分上的一个相邻点。将有O(n)条总边需要检查,因此主要由O(n logn)三角测量成本决定

如果分布相对均匀,则桶形法工作正常,但对于非均匀分布,则失败严重。kd树或四叉树方法在所有情况下都更快,包括均匀分布。