在笛卡尔平面上找到最近的点?

时间:2019-05-06 08:58:54

标签: algorithm performance time-complexity big-o complexity-theory

在笛卡尔平面上有随机点。像具有X坐标(2,4,2)和Y坐标(6,3,4)的PlottedPointName(a,b,c)一样,如果我们找到了findNearestPointTo(a,b)的最近点,则该点为NearestPointName(c )(最接近Point(a))和NearestPointName(c)(最接近Point(b))。

我已经为它编写了时间复杂度为O(n ^ 3)的代码。通过计算findNearestPointTo(a,b)到所有其他点的距离并找到最小值。

string[] PlottedPointName={"a","b","c"};
int[] x_cord = {2,4,2};
int[] y_cord = {6,3,4};

int min = 0;
int distance =0;
string[] findNearestPointTo = {"a", "b"};
string[] nearestPoints= new string[findNearestPointTo.length];

for(int i=0;i<findNearestPointTo.length;i++)
 {
   min=0;
   for(int j=0;j<PlottedPointName.lenght;j++)
     {
        if(findNearestPointTo[i]==points[j])
          {
            for(int k=0;k<PlottedPointName.length;k++)
             {
               if(k!=j){
               distance = abs(x_cord[i] - x_cord[k]) + abs(y_cord[i] - y_cord[k]);
               if(min==0)
                 {
                   min=distance;
                   nearestPoints[i]= PlottedPointName[k];
                 }
                else if(min>0)
                 {
                   if(min>distance)
                     {
                       min= distance;
                       nearestPoints[i]= PlottedPointName[k];
                     }
                 }
                }
             } 
          }
     }
 }

是否有可能使此代码更高效,更省时。

2 个答案:

答案 0 :(得分:0)

好吧,我只能推荐一种优化方法:

if(findNearestPointTo[i]==points[j])中找到该点之后,可以从该循环中break作为if块的最后一条语句。

您可以这样做,因为我们可以假设没有两个点具有相同的名称,因此可以保证此条件为false

它不会减小因子,而是O(n ^ 2),但实际上将时间减半(常数因子减半)。

答案 1 :(得分:0)

您可以在不使用第一个循环的情况下在O(n ^ 2)中求解它,因为您的查询数组大小和要返回的数组将具有sam大小,因此如果坐标和查询名称相等的条件相同到迭代点为止,并且所有其他条件都成立,只需将城市名称添加到index处的最近的City数组中即可,该数组与您要检查的查询相同