recursion - 计算划分问题的大O复杂度

标签 recursion time-complexity big-o partitioning

我的伪代码如下所示:

solve(n)
    for i:= 1 to n do
       process(i);
       solve(n-i);

其中process(n)是一个具有一定复杂性的函数f(n)。就我而言,f(n)=O(n^2),但我也对一般情况感兴趣(例如,如果f(n)=O(n) )。

所以,我有T(n) = f(n) + ... + f(1) + T(n-1) + ... + T(1)。我无法应用主定理,因为子问题的大小不同。

如何计算此递归的复杂度?

最佳答案

小技巧 - 考虑solve(n-1):

solve(n)  :  T(n)   =  f(n) + f(n-1) + f(n-2) + ... + f(1) + T(n-1) + T(n-2) + ... + T(0)
solve(n-1):  T(n-1) =         f(n-1) + f(n-2) + ... + f(1) +          T(n-2) + ... + T(0)

从前者中减去后者:

enter image description here

重复展开:

enter image description here

求解 f(n) 的最后求和以获得复杂度。

例如对于f(n) = O(n):


替代方法 - 变量替换:

enter image description here

S(m) 是主定理的正确形式。

例如对于 f(n) = O(n) = O(log m),使用情况 2 和 k = 0:

enter image description here

相同的结果,q.e.d。

关于recursion - 计算划分问题的大O复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54842177/

相关文章:

python - 保留子文件夹结构的递归ffmpeg脚本

javascript - JavaScript 中的尾递归优化

algorithm - 使用递归方程的程序的时间复杂度

algorithm - 假设递归函数的递归关系

arrays - 找到将数组切成两半的位置,使得总和的差异最小

algorithm - 在没有主定理的情况下解决这个递归问题。回溯算法

javascript - Firebase onAuthStateChanged 退订递归

Java递归二分查找抛出越界异常?

java - 迷宫寻路时递归DFS的时间和空间复杂度

recursion - 确定递归函数的复杂性(大 O 表示法)