计算分区问题的大O复杂度

时间:2019-02-23 13:35:46

标签: 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)。我不能应用Master定理,因为子问题的大小不同。

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

1 个答案:

答案 0 :(得分:3)

小技巧–考虑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。