在笛卡尔平面上有随机点。像具有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];
}
}
}
}
}
}
}
是否有可能使此代码更高效,更省时。
答案 0 :(得分:0)
好吧,我只能推荐一种优化方法:
在if(findNearestPointTo[i]==points[j])
中找到该点之后,可以从该循环中break
作为if
块的最后一条语句。
您可以这样做,因为我们可以假设没有两个点具有相同的名称,因此可以保证此条件为false
。
它不会减小因子,而是O(n ^ 2),但实际上将时间减半(常数因子减半)。
答案 1 :(得分:0)
您可以在不使用第一个循环的情况下在O(n ^ 2)中求解它,因为您的查询数组大小和要返回的数组将具有sam大小,因此如果坐标和查询名称相等的条件相同到迭代点为止,并且所有其他条件都成立,只需将城市名称添加到index处的最近的City数组中即可,该数组与您要检查的查询相同