【问题标题】:time complexity of recursion function递归函数的时间复杂度
【发布时间】:2018-05-29 07:59:01
【问题描述】:

我不知道从哪里开始计算这个函数的时间复杂度。这个函数的O(时间复杂度)是多少?我知道答案是 3^n。

int f3(int n) {
    if (n < 100)
        return 1;
    return n* f3(n-1) * f3(n-2) * f3(n-3)
}

【问题讨论】:

  • 对于初学者来说,它具有不同的时间复杂度,具体取决于 n &gt;= 100 与否。手动运行n=103 的代码并进行推断。此外,这将很快溢出int
  • 这个已经回答过了,看一下就行了Here
  • 我认为我们应该从n到103计算它。103之后看其他的并不重要,但我无法计算出来。
  • 首先写下复杂度的递归关系。
  • @AditiRawat 因为添加 TurboC++ 会有点过分。

标签: algorithm big-o


【解决方案1】:

我们有:
1 : if 语句
3 : * 运算符
3:函数语句
总共:7

所以我们有:

T(n)=t(n-1) + t(n-2) + t(n-3) + 7
T(99)=1
T(98)=1
...
T(1)=1

然后减少T(n),我们有T(n-3)&lt;T(n-2)&lt;T(n-1),因此:

T(n) <= T(n-1)+T(n-1)+T(n-1) + 7
T(n) <= 3T(n-1) + 7

所以我们可以解决T(n) = 3T(n-1) + 7(在大数中T(n-1) 几乎等于T(n-2) 和...)

那么我们可以通过以下方法计算T(n)

T(n) = 3.T(n-1) + 7
     =3.(3.T(n-2)+7) + 7     = 3^2.T(n-2) + 7.(3^1 + 3^0)
     =3^2.(3.T(n-3)+7) + ... = 3^3.T(n-3) + 7.(3^2 + 3^1 + 3^0)
                             = 3^4.T(n-4) + 7.(3^4 + 3^2 + 3^1 + 3^0)
     ...
     =3^(n-99).T(n-(n-99)) + 7.(3^(n-98) + 3^(n-97) + ...+ 3^1 + 3^0)
     =3^(n-99) + 7.(3^(n-98) + 3^(n-97) + ...+ 3^1 + 3^0)

所以考虑1 + 3 + 3^2 ...+3^(n-1) = 3^n - 1/2

因此我们达到了:

T(n) = 3^(n-99) + 7.(3^(n-99) + 1/2) = 8.3^(n-99) - 7/2
     = 8/(3^99) . 3^n -7/2 

最后:大O是O(3^n)

如果你只有T(1)=1,答案是一样的。

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 2021-11-11
    • 2023-03-14
    相关资源
    最近更新 更多