c - 这个递归函数的时间复杂度是多少

标签 c algorithm time-complexity

我试图找到这个 block 的时间复杂度,是 O(n!) 还是 O(2^n),如何?

void fun(int n)
{
    int i;
    count++;
    if(n>0)
    {
        for(i=1;i<n;i++)
        fun(n-i);
    }
}

我尝试了 n 和 count 的差异值赋予值(value)至2^n ??

谢谢

最佳答案

每次调用 T(n) 都会调用 T(n-1), T(n-2), ..., T(1) .

这给了我们复杂性函数:

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

如果我们使用归纳法和假设 T(k) <= c*2^k对于任何 k < n对于一些常数 c (正确检查 T(1) = 1 <= 2^1 后,我们得到:

T(n) = T(n-1) + ... + T(1) + 1 = 
     = c*2^(n-1) + c*2^(n-2) + ... + c*2^1 + 2^0  <= 
    <= c*(2^n - 1) <= c*2^n

最后一个等式来自几何级数之和。

因此,我们可以得出T(n)位于Theta(2^n)

关于c - 这个递归函数的时间复杂度是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35729755/

相关文章:

c - 因此,如果我 scanf ("%c",del),在读取字符串之前,它可以工作,但之后就不行了

c++ - 连续位的长度 1 流后跟 0

algorithm - 两个循环除以一个循环,可以吗?

编译器/语言运行时与中间件

c - 如何从 linux 内核中的目录获取文件列表?

java - 在另一个字符串中查找字符串的 Anagrams 的最佳算法

algorithm - 寻找一种有效的算法来获得一条线

data-structures - 为什么在二叉搜索树中查找是 O(log(n))?

java - 在数组中找到两个总和最小的非后续元素

c - SIGKILL 和 SIGSTOP 信号不能被捕获、阻塞或忽略,为什么?