发现时间和空间的复杂性

问题描述

我需要找到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(即nn递归调用)的时间。因此,f3空间复杂度将为\Theta(n)

,

简而言之:
f3(n)的时间复杂度 = O(2 ^ n)

f3(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)