首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个函数的时间和空间复杂度是多少?

这个函数的时间和空间复杂度是多少?
EN

Stack Overflow用户
提问于 2019-01-29 09:32:17
回答 1查看 69关注 0票数 1

我无法用C来解决这个时间和空间的复杂性。这就是问题所在:

计算函数f3的时间和空间复杂度:

代码语言:javascript
复制
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)。从现在起,我不知道该怎么做。

请解释一下你解决这个问题的方法。(非常感谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-29 12:18:31

时间:

您已经计算出,由于每次递归调用的g3(n)都是n/2,所以n/2会在log_2 n时间内递归。这也意味着,在基箱 (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)占主导地位。

因此,O(n) f3(n)采用time

空间:

为了计算出使用了多少空间,我们需要考虑

  1. 在我们的程序中,内存在哪里分配?
  2. 作为n函数分配的最大内存量是多少?

我们没有任何占用内存的数组,因此我们最关心的是分配给每个函数调用的堆栈框架的内存。每次调用g3(n)时,都会分配一些内存来存储局部变量和其他数据。每次g3(n)返回时,该内存都会被释放,并可用于其他事情。

在执行过程中,同时分配的堆栈帧的最大数量是多少?如果您能够回答这个问题,那么您就可以计算出作为n函数分配的帧数,从而计算出空间复杂性。我会把最后的结果留给你去辨别。

如果你不能解决某件事,就把它分解成你能解决的小问题。每次解决一个小问题时,看看如何使用结果来简化大问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54417806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档