Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 递归、内循环和时间复杂性_Algorithm_Recursion_Time Complexity - Fatal编程技术网

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+…=>在…上希望这有帮助。谢谢你们。即使是我也无法回答,但通过比较答案,它帮助了我,我应该为此感谢你们。