我不知道从哪里开始计算这个函数的时间复杂度。这个函数的 O(时间复杂度)是多少?我了解到答案是 3^n。
int f3(int n) {
if (n < 100)
return 1;
return n* f3(n-1) * f3(n-2) * f3(n-3)
}
Run Code Online (Sandbox Code Playgroud)
我们有:
1 : if 语句
3 : * 运算符
3 : 函数语句
总共: 7
所以我们有:
T(n)=t(n-1) + t(n-2) + t(n-3) + 7
T(99)=1
T(98)=1
...
T(1)=1
Run Code Online (Sandbox Code Playgroud)
然后为了减少 T(n),我们有T(n-3)<T(n-2)<T(n-1) :
T(n) <= T(n-1)+T(n-1)+T(n-1) + 7
T(n) <= 3T(n-1) + 7
Run Code Online (Sandbox Code Playgroud)
所以我们可以解决T(n) = 3T(n-1) + 7(大数字T(n-1)几乎相等T(n-2)并且......)
那么我们可以T(n)通过以下方法计算:
T(n) = 3.T(n-1) + 7
=3.(3.T(n-2)+7) + 7 = 3^2.T(n-2) + 7.(3^1 + 3^0)
=3^2.(3.T(n-3)+7) + ... = 3^3.T(n-3) + 7.(3^2 + 3^1 + 3^0)
= 3^4.T(n-4) + 7.(3^4 + 3^2 + 3^1 + 3^0)
...
=3^(n-99).T(n-(n-99)) + 7.(3^(n-98) + 3^(n-97) + ...+ 3^1 + 3^0)
=3^(n-99) + 7.(3^(n-98) + 3^(n-97) + ...+ 3^1 + 3^0)
Run Code Online (Sandbox Code Playgroud)
所以考虑一下 1 + 3 + 3^2 ...+3^(n-1) = 3^n - 1/2
因此我们达到了:
T(n) = 3^(n-99) + 7.(3^(n-99) + 1/2) = 8.3^(n-99) - 7/2
= 8/(3^99) . 3^n -7/2
Run Code Online (Sandbox Code Playgroud)
最后:大O是O(3^n)
如果你只是有T(1)=1,答案是一样的。