想改进这个问题吗?更新问题,使其只关注一个问题editing this post。
9个月前关闭。
我无法解决我遇到的C中的时间和空间复杂度。
这是一个问题:
计算函数f3的时间和空间复杂度:
double g3(double n)
{
if (n<=1)
return 2;
double temp = g3(n/2);
return temp*temp;
}
double f3(double n){
return g3(g3(n));
}
计算G3的时间复杂度为O(Logn),其返回值为2 ^ 2 ^ n-1(对于n>=1)。从现在起我不知道该怎么办。
请解释一下你解决问题的方法。非常感谢:)
最佳答案
时间:
您已经计算出g3(n)
在每次递归调用时都会递归log_2 n
次。这也意味着base case(n/2
)在最终返回之前将被粗略地平方2
次。log_2 n
的返回值为~g3(n)
,简化为~2^(2^log_2 n)
。
要计算出2^n
中发生了什么,我们可以计算出内部g3(g3(n))
调用返回的g3(k)
中的k = 2^n
中发生了什么。您已经知道g3(n)
递归g3(k)
次,就像内部调用一样。因此,如果我们用内部结果替换log_2 k
,我们将得到k
递归调用,这将简化为log_2 (2^n)
。所以外部调用n
递归g3(g3(n))
次。
现在我们可以计算出总的时间复杂度。首先,它需要n
步骤才能计算出O(log n)
。其次,它需要g3(n)
步骤来计算O(n)
。因此,g3(2^n)
的总时间复杂度是内+外或g3(g3(n))
,其中O(log n) + O(n)
占主导地位。
因此,O(n)
需要f3(n)
时间。
空间:
要计算出使用了多少空间,我们需要考虑
在我们的程序中,内存分配在哪里?
作为“cc>”函数分配的最大内存量是多少?
我们没有任何数组占用内存,所以我们最担心的是为每个函数调用的stack frame分配内存。每次调用O(n)
时,都会分配一些内存来存储本地变量和其他数据。每次n
返回时,内存都会被释放,并可用于其他事情。
在执行期间,同时分配的堆栈帧的最大数目是多少?如果你能回答这个问题,那么你就可以算出被分配为“cc>函数”的帧的数量,从而计算出空间复杂度。我把最后的结果留给你看。
如果你不能解决某件事,把它分解成你能解决的小问题。每次你解决一个小问题,看看你如何利用结果来简化大问题。
关于c - 该函数的时间和空间复杂度是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54417806/