C# Math.Sqrt()的时间复杂性?

C# Math.Sqrt()的时间复杂性?,c#,big-o,time-complexity,math.sqrt,C#,Big O,Time Complexity,Math.sqrt,我如何才能找到这个函数的复杂性 private double EuclideanDistance(MFCC.MFCCFrame vec1, MFCC.MFCCFrame vec2) { double Distance = 0.0; for (int K = 0; K < 13; K++) Distance += (vec1.Features[K] - vec2.Features[K]) * (vec1.Features[K] - vec2.Features[K]);

我如何才能找到这个函数的复杂性

private double EuclideanDistance(MFCC.MFCCFrame vec1, MFCC.MFCCFrame vec2)
{
  double Distance = 0.0;
  for (int K = 0; K < 13; K++)
     Distance += (vec1.Features[K] - vec2.Features[K]) * (vec1.Features[K] - vec2.Features[K]);
  return Math.Sqrt(Distance);
}
私有双欧几里德距离(MFCC.MFCCFrame vec1,MFCC.MFCCFrame vec2)
{
双倍距离=0.0;
对于(int K=0;K<13;K++)
距离+=(vec1.特征[K]-vec2.特征[K])*(vec1.特征[K]-vec2.特征[K]);
返回Math.Sqrt(距离);
}
我知道以下部分是O(1):

双倍距离=0.0;
对于(int K=0;K<13;K++)
距离+=(vec1.特征[K]-vec2.特征[K])*(vec1.特征[K]-vec2.特征[K]);
<>但是我无法理解<代码>数学> SQL()>代码>的复杂度。

可以考虑O(1):

换句话说,Math.Sqrt()转换为单个浮点 机器代码指令

资料来源:

如所述,Math.Sqrt实现将转换为一条到一条浮点机器码指令(fsqrt)。此指令的循环数是有界的(以下是一些示例)。这意味着它的复杂性是O(1)

这只是事实,因为我们使用的浮点值数量有限。该操作的“实际”复杂性取决于输入的位数。您可以找到基本算术函数复杂性的列表。根据该列表,平方根函数具有乘法函数的复杂性(对于两个n位数,O(n logn))


你们说过,你们假设加法和乘法函数的复杂度为O(1)。这意味着,您可以假设平方根函数虽然慢得多,但复杂性也为O(1)。

只是想知道,for语句的时间复杂性不应该为O(n),因为它有效地迭代数组吗?不,它是O(13),数组大小是固定的,所以O(1)实际上是固定的。参考,它可能是如何计算
Math.Sqrt()
的。我从未听说过一种算法能够在
O(1)
中找到平方根。在这个算法被加入到答案中之前,我将对答案进行向下投票。不管参数如何,计算周期是否相同?@qqq:你为什么不直接测量它?不管怎么说,答案是,复杂性相当于大多数CPU上的除法。如果性能比准确性更重要,那么您可以尝试使用其他方法。与欧几里德距离(我知道,OP不是你)不同,Doom等老游戏使用的是所有坐标的简单距离。在图像处理中,当颜色最接近时,我也省略了平方根(然后也不需要平方根)。@GyörgyKőszeg,对不起,如果你建议我用这个建议来解释时间复杂度:
为什么你不直接测量它?
我没有什么可以向你学习的。但无论如何,谢谢你的帮助。@qq:没必要生气。我提供了一个相当详细的答案,并链接了一个相关的帖子。你还指望什么?没有人的类似链接对你来说足够好,所以我真的认为做一些测量可以给出令人满意的答案。差不多。请注意,尽管结果取决于架构:在fiddle服务器上,平方根比四个基本操作慢约40%(它们的执行非常类似)。但在我的机器上,速度只慢了15%。没有一种算法可以在恒定时间内计算平方根。要计算固定大小的浮点数的平方根,只需预先计算每个浮点数的平方根表。从该表中检索给定数字的平方根将是一个O(1)算法。即使在(0;1)段中也有不可计数的数字。你不可能预先计算那么多的数字。更不用说所有的实数了,问题不在于实数。函数的作用是处理具有固定位数的浮点数。所以只有一组有限的数字,我们需要处理。但是,如果你想描述一个接受实数的算法,你就不能假定SurRoRoOT函数是O(1)。我们应该考虑实数,并把它作为两个不同的数字集合吗?
double Distance = 0.0;
for (int K = 0; K < 13; K++)
   Distance += (vec1.Features[K]-vec2.Features[K])*(vec1.Features[K]-vec2.Features[K]);