Closed. This question needs to be more focused. It is not currently accepting answers. Learn more
想改进这个问题吗?更新问题,使其只关注一个问题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 casen/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/

10-12 14:47