C++ Theta递归运行时
如何计算此给定代码的θ运行时:C++ Theta递归运行时,c++,recursion,runtime,big-theta,C++,Recursion,Runtime,Big Theta,如何计算此给定代码的θ运行时: void f(int n) { for (int i=3; i<n; ++i) for (int j=0; j<i; ++j) f(n-1); } 由于每个嵌套for循环的复杂度都是O(N^2),并且每次在另一个函数中调用函数时,复杂度都会成倍增加,最终得到O((N!)^2),其中N也是递归的次数。这当然是因为N!=N*(N-1)*(N-2)*…*(N-N+1),用于创建阶乘的所有值都是平方。如果我们将
void f(int n)
{
for (int i=3; i<n; ++i)
for (int j=0; j<i; ++j)
f(n-1);
}
由于每个嵌套for循环的复杂度都是O(N^2),并且每次在另一个函数中调用函数时,复杂度都会成倍增加,最终得到O((N!)^2),其中
N
也是递归的次数。这当然是因为N!=N*(N-1)*(N-2)*…*(N-N+1)
,用于创建阶乘的所有值都是平方。如果我们将3替换为零(这显然不会改变Θ),我们可以很容易地得出函数调用的确切数量:
Θf(1)=1Θf(n)=n2⋅ Θf(n-1)∀ n>0 所以,利用乘积的交换性 N N n
Θf(n)= ∏ j 2 = ∏ J ⋅ ∏ j=n!⋅ n
i=1 i=1 i=1
=(n!)2
正如Jason所说。提示:n^2*(n-1)^2*(n-2)^2*…=(n*(n-1)*(n-2)*…)^2
f
没有返回值,因此f(n)
不等于任何值;大θ(也叫大-O)表示法关注的是在执行算法时执行的操作数空格是否正确?这是相当黑客的,我讨厌手头没有LaTeX/MathJax。
f(n) = n^2 * f(n-1)
f(n) = n^2 * (n-1)^2 * f(n-2)
f(n) = n^2 * (n-1)^2 * (n-2)^2 * f(n-3)
...