找到2个阵列中2个点之间的最小距离

时间:2014-01-03 13:10:59

标签: c# algorithm distance min points

我有2个包含点(x,y和z)的列表,并希望找到最近的点。

我认为我需要做这样的事情:

for (int i = 0; i < myarray1.Count; i++)
{
  for (int j = 0; j < myarray2.Count; j++)
  {
    // Calculate the quadratic distance between 2 points (point in index i and j)
    // Then store the minimum distance I guess?   
  }
}

5 个答案:

答案 0 :(得分:3)

另一种选择是使用Kd-tree
使用Nearest neighbour search将为您提供O(log n)复杂度,以便找到与给定点集最近的点,并且您的代码将为O( n log n),而不是O (n^2)

请参阅here了解如何使用它的实现和示例。

答案 1 :(得分:2)

  double min_dist = DOUBLE_MAX;
  for (i = 0; i < myarray1.Count; i++)
   {
     for (j = 0; j < myarray2.Count; j++)
     {
       curr_dist = dist(a[i],a[j]);  
       if( min_dist > curr_dist)
         {
              min_dist = curr_dist;
         }
     }
   }

,其中

double dist(Point a, Point b) {
  return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)+pow(a.z-b.z,2);
}

答案 2 :(得分:1)

计算距离:

double sqr(double x) {return x*x;}

double distance(MyPoint a, MyPoint b) {
  return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z);
}

然后在第二个循环中存储到目前为止找到的最小距离:

double d = distance(myarray1[i],myarray2[j]);
if (d<min_d) min_d = d;

其中min_d在开头定义:

double min_d = Float.MAX_VALUE;

答案 3 :(得分:0)

在C#中,我会使用Linq。

首先,我将定义计算两点之间距离的函数,如Emanuelle Paolini的答案所示:

public double Distance(Point p1, Point p2)
{
   return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p1.y) * (p1.y - p1.y) + (p1.z - p1.z) * (p1.z - p1.z));
}

然后我会按如下方式查询两个列表:

var distanceQuery = from p1 in myarray1
                    from p2 in myarray2
                    select Dist(p1, p2);

最后我会找回最小距离:

var minimumDistance = distanceQuery.Min();

答案 4 :(得分:0)

公式

  

Math.sqrt(Math.pow(Math.abs(x1-x2),2) + Math.pow(Math.abs(y1-y2),2)+ Math.pow(Math.abs(z1-z2),2))