【问题标题】:Big O notation for these functions这些函数的大 O 表示法
【发布时间】:2021-03-04 20:06:05
【问题描述】:

我想解决这个问题,但我不确定我是否正确。我发现 O(n^2-n)=O(n^2)

double fact(long i)
{
if (i==1 || i==0) return i;
else return i*fact(i-1);
}

funcQ2()
{
for (i=1; i<=n; i++)
sum=sum+log(fact(i));
}

【问题讨论】:

  • 可能是因为 SO 上有成千上万的问题与你的基本相同。
  • @MoB.I 从字面上搜索了一个类似的例子,连续 2 个小时,所以,没有
  • 好的。那我的回答解决了你的问题吗?

标签: c performance big-o


【解决方案1】:

你的fact函数是递归的,所以你应该先写出时间复杂度对应的递归关系T(i)

T(0) = 1             // base case i==0
T(1) = 1             // base case i==1
T(i) = T(i-1) + 1    // because fact calls itself on i-1 and does one multiplication afterwards

很容易看出,对于所有i &gt; 0,这个递归关系的解是T(i) = i,所以T(i) ∈ O(i)

您的第二个函数 funcQ2 没有输入,假设 n 是一个常数,它的复杂性是微不足道的 O(1)。另一方面,如果您假设n 是一个输入参数,并且想要测量与n 相关的时间复杂度,那么它将是O(n^2),因为您在循环内调用fact(i)(标准算术级数)。

【讨论】: