【问题标题】:Calculating time complexity of a recursive function having a loop inside it计算内部有循环的递归函数的时间复杂度
【发布时间】:2018-07-08 13:18:10
【问题描述】:

我正在研究一个简单的问题,我想出了一个 C++ 中的递归函数,下面是我的函数。

void test(int arr[],int n,int x = 0){
    cout<<arr[x];
    for(int i = x+1;i < n;i++){
        test(arr, n, i);
    }
}

如果有人能计算出上述方法的时间复杂度,我想知道上述函数的时间复杂度是多少,这将对改进我的函数有很大帮助。

【问题讨论】:

  • 递归可以看作是一种花哨的循环。因此,如果您可以将递归重写为循环,那么它可能会更容易。
  • 你为什么不写x = x + 1; test(arr, n, x);而不是test(arr, n, i);?它是等价的,但更简单、更容易理解。
  • 我们不能在这里使用任何主定理吗??
  • 这乍一看似乎是指数复杂度算法。

标签: c++ algorithm data-structures time-complexity


【解决方案1】:

你可以像下面这样写它的循环关系:

 T(n) = T(n-1) + T(n-2) + ... + T(1) + 1

确实T'(x)T(n - x)T(1) = 1(最后一个是cout)。我们可以看到:

T(2) = T(1) + 1 = 2
T(3) = T(2) + T(1) + 1 = 2 + 1 + 1 = 4
T(4) = 4 + 2 + 1 + 1 = 2^2 + 2^1 + 2^0 + 1 = 8
T(5) = 8 + 4 + 2 + 1 + 1 = 2^3 + 2^2 + 2^1 + 2^0 + 1 = 16
.
.
.
T(n) = 2^{n-2} + 2^{n-1} + ... + 2^0 + 1 = 2^{n-1}

因此,T(n) = \Theta(2^n)

【讨论】:

  • 你是如何使用 T(n-1) 的?我猜应该是n+1??如果我错了,请纠正我
  • @MohdShibli 正如我所说,T(n-1)x = 1 的时间复杂度,一般来说,T(i)x = n - i
  • 可能复杂度为 O(k^n),因为循环将在最坏的情况下运行 k 次
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多