问题描述
我需要找到f3
的时间和空间复杂度。
我认为g
的空间复杂度为log(n)
,所以对于时间复杂度,但是我不确定如何找到f3
的时间和空间复杂度,因为对{{ 1}}位于g
内,这是否意味着每次都会调用for
来检查是否g
?
g(i) < n
解决方法
由于g(n)
将在Theta(log(n))
中运行,并且每次向最终结果加1时,g(i)
的最终值将为\ceil{log(i)} + 1
。另一方面,f3
中的循环将在g(i) < n
时运行。这意味着循环将最多迭代2^n
。因此,f3
将运行2^n
次。因此, f3(n) = sum_{i=1}^{2^n} log(i) = log((2^n)!) = \Theta(n * 2^n)
的时间复杂度(如log((2^n)!) ~ (2^n) log(2^n)
)。
关于空间复杂度,g(i)
的最大深度将是i = 2^n
(即n
(n
递归调用)的时间。因此,f3
的空间复杂度将为\Theta(n)
。
简而言之:
f3(n)的时间复杂度 = O(2 ^ n)
空间复杂度 = O(n)
g(n)的时空复杂度= O(log(n))
注意:(这里我引用的所有日志均为log base2 link,所有符号均为Big O符号)
详细信息:
函数“ g()”返回floor(log(n))+ 1。函数“ f3()”中的循环一直持续到函数“ g()”返回n为止。为了使g(i)返回“ n”,我需要为“ 2 ^(n-1)”。
为了终止“ f3()”中的循环,“ i”必须达到2 ^(n-1)。因此,“ g()”被称为2 ^(n-1)次。
所以“ f3()”的时间复杂度 = 2 ^(n-1)x(g()的时间复杂度)= 2 ^ nx(log n)= O( 2 ^ n)
使用的最大内存将在最后一次调用“ g(i)”期间进行,其中i == 2 ^(n-1)。
因此,“ f3()”的空间复杂度 = log(2 ^(n-1))= O(n)