【问题标题】:A variation of closest pair of points algorithm最近点对算法的一种变体
【发布时间】:2012-07-16 14:15:30
【问题描述】:

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

此方法简单明了,但计算速度较慢。我想知道是否有一些快速算法可以解决这个问题。谢谢!

【问题讨论】:

    标签: algorithm geometry


    【解决方案1】:

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

    【讨论】:

    • 如果分布是相对均匀的,bucket 方法可以正常工作,但对于非均匀分布会严重失败。 kd-tree 或 quadtree 方法在所有情况下都更快,包括均匀分布。
    【解决方案2】:

    您可以在 O(n log n) 时间内计算出Delaunay triangulation,对于每个顶点,最近的点将是三角剖分上的相邻点之一。将要检查的总边数为 O(n),因此它由 O(n log n) 三角剖分成本控制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-07
      • 2023-03-23
      • 2021-08-29
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多