【问题标题】:Seems very hard to find out the time complexity of this simple program似乎很难找出这个简单程序的时间复杂度
【发布时间】:2017-05-14 05:04:31
【问题描述】:

我有下面的代码来模仿算法的递归行为,因为我没能弄清楚该算法的时间复杂度:

int M(int n)
{
    int result = 1;
    for (int i = n-1; i >= 0; --i)
    {
        result += M(i);
    }
    return result;
}

根据我的理解,我画了下面的树来说明算法:

(图中输入n为3)。 我认为树中的节点数是算法的复杂度。如果输入是n,那么时间复杂度是多少?谢谢!

【问题讨论】:

  • O(2^N) .. ...

标签: c++ algorithm recursion time-complexity


【解决方案1】:

我的背景不是 CS,但我可以为您提供一个简单的方法来解决这个问题,

所以我拿起纸和笔,开始使用不同的 n 值。

n = 2, cycles = 4
n = 3, cycles = 8
n = 4, cycles = 16
n = 5, cycles = 32.

你可以清楚地看到周期 = 2^N,因此我们可以得出结论,这个问题的时间复杂度是 O(2^N)。

现在换一种方式来看待这个问题

我们知道

f(0) = 1
f(1) = f(0) + 1 = 2
f(2) = f(1) + f(0) + 1 = 4
...
f(N) = f(N-1) + f(N-2) .. + f(0) + 1 = 2^N.

现在您有了与计算阶乘类似的递推关系,您可以进行数学运算或创建程序来测量问题的时间复杂度。

希望我的回答能帮助你理解计算时间复杂度的理论。

【讨论】:

  • 关于f的最后一个观察可以变成一个实际的证明。 f(N) = f(N-1) + ( f(N-2) + ... + f(0) + 1 ) ===> f(N) = 2 * f(N-1)。证明2 ^N 现在是微不足道的,无需挥手。
【解决方案2】:

你的树形图很有启发性。你能看到对称线吗? M(n) 的树看起来像 M(n-1) 的树的两个副本。因此树中的节点数为 2**n,算法复杂度为 O(2**n)。

【讨论】:

    【解决方案3】:

    我附上了一张图片,你可以看看。

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2022-01-01
      • 2021-02-25
      • 2021-06-14
      相关资源
      最近更新 更多