Algorithm 递归、内循环和时间复杂性
考虑以下功能:Algorithm 递归、内循环和时间复杂性,algorithm,recursion,time-complexity,Algorithm,Recursion,Time Complexity,考虑以下功能: int testFunc(int n){ if(n < 3) return 0; int num = 7; for(int j = 1; j <= n; j *= 2) num++; for(int k = n; k > 1; k--) num++; return testFunc(n/3) + num; } 我得到第一个循环是Ologn,而第二个循环是On,它的时间复杂度总共是On。但是由于递归调用,我认为时间复杂度将
int testFunc(int n){
if(n < 3) return 0;
int num = 7;
for(int j = 1; j <= n; j *= 2) num++;
for(int k = n; k > 1; k--) num++;
return testFunc(n/3) + num;
}
我得到第一个循环是Ologn,而第二个循环是On,它的时间复杂度总共是On。但是由于递归调用,我认为时间复杂度将是Onlogn,但显然它只是开着的。有人能解释一下原因吗?对于使用递归算法的过程,例如:
procedure T( n : size of problem ) defined as:
if n < base_case then exit
Do work of amount f(n) // In this case, the O(n) for loop
T(n/b)
T(n/b)
... a times... // In this case, b = 3, and a = 1
T(n/b)
end procedure
应用查找时间复杂度,本例中的fn由于第二个for循环而打开,如您所说。这使得c=1
现在,logba=log31=0,这是该定理的第三种情况,根据该定理,使用递归算法的过程的时间复杂度Tn=Θfn=Θn.,如下所示:
procedure T( n : size of problem ) defined as:
if n < base_case then exit
Do work of amount f(n) // In this case, the O(n) for loop
T(n/b)
T(n/b)
... a times... // In this case, b = 3, and a = 1
T(n/b)
end procedure
应用查找时间复杂度,本例中的fn由于第二个for循环而打开,如您所说。这使得c=1
现在,logba=log31=0,这是定理的第三种情况,根据它,时间复杂度Tn=Θfn=Θn.递归调用几乎给出了以下复杂度,表示输入n的复杂度为Tn: 正如您正确指出的,第一个观察结果是,您可以忽略对数,因为它由n控制。现在我们只剩下Tn=n+Tn/3。例如,尝试将其写入0。我们有:
T(n) = n + n/3 + n/9+....
你可以很容易地证明上面的总和总是小于2*n。事实上,可以证明更好的限制,但这一限制足以说明总体复杂性是开的。递归调用基本上给出了以下复杂性,表示输入n的复杂性为Tn: 正如您正确指出的,第一个观察结果是,您可以忽略对数,因为它由n控制。现在我们只剩下Tn=n+Tn/3。例如,尝试将其写入0。我们有:
T(n) = n + n/3 + n/9+....
你可以很容易地证明上面的总和总是小于2*n。事实上,可以证明更好的极限,但这个极限足以说明总体复杂性是开的。比主定理更容易理解,我明白了。而且,总和也小于1.5*n.Ahh。这是一个几何级数。美好的explained@novalain是的,约翰布比特提到的值1.5是可能的最紧的界限,因为几何回归的和比主定理更容易理解,依我看,和也小于1.5*n.Ahh。这是一个几何级数。美好的explained@novalain是的,约翰布比特提到的值1.5是可能的最紧的界限,因为马斯特斯定理的几何回归之和,Tn=a*Tn/b+fn。将a、b和fn的值替换为1,3,我们知道fn=n+logn=>fn=n就像@john bupit answer一样。我们得到Tn=1*Tn/3+n=>Tn=Tn/3+n。现在看看@Ivaylo strandjev的答案。就像他说的,这将等于Tn=n+n/3+n/9+…=>在…上希望这有帮助。谢谢你们。即使是我也不能回答,但通过比较答案,它帮助了我,我应该为此感谢你们。根据马斯特斯定理,Tn=a*Tn/b+fn。将a、b和fn的值替换为1,3,我们知道fn=n+logn=>fn=n就像@john bupit answer一样。我们得到Tn=1*Tn/3+n=>Tn=Tn/3+n。现在看看@Ivaylo strandjev的答案。就像他说的,这将等于Tn=n+n/3+n/9+…=>在…上希望这有帮助。谢谢你们。即使是我也无法回答,但通过比较答案,它帮助了我,我应该为此感谢你们。