我目前正在学习C,并且最近编写了一个程序,使用Prim算法找到最小生成树。这个程序工作正常,但需要每个边缘的成本(当然)。
如果我想找到大量 2D 坐标(例如50)的MST,我需要首先找到点的欧几里德距离矩阵。我的问题是:这可以在没有计算的情况下在C中完成吗
distance = sqrt((x2-x1)^2+(y2-y1)^2)
对于每一个点,例如通过使用循环?
我一直在尝试使用
arrayX[] = {x1,x2,x3,...xn}
arrayY[] = {y1,y2,y3,...yn}
并使用for
循环,但由于我的经验不足而无法这样做(如果这是1D,当然,这将非常简单!)。
任何人都可以给我任何关于该怎么做的指示?提前谢谢!
答案 0 :(得分:1)
如果您只需要比较距离值而不需要实际值,那么您可以跳过昂贵的sqrt()调用。比较的结果将与调用的结果保持一致。
答案 1 :(得分:0)
最好对数据进行清晰的建模。例如,如果您正在使用具有整数坐标的2D点,请模拟:
typedef struct {
int x, y;
} point2d;
现在你创建一个这样的数组:
point2d my_points[] = { { x1, y1 }, { x2, y2 }, ... };
高于x1
,y1
等等当然应该是实际的整数值。
你可以循环使用:
for(size_t i = 0; i < sizeof my_points / sizeof *my_points; ++i)
printf("Point %zu is at (%d,%d)\n", i, my_points[i].x, my_points[i].y);
等等。请注意,上面的代码段假定为C99。
计算距离时,请记住C中的^
是按位XOR,而不是取幂。对于后者,请使用pow()
或powf()
函数。如上所述,如果您只是要比较相对距离,那么计算sqrt()
就没有意义了。