我的伪代码如下:
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定理,因为子问题的大小不同。
如何计算此递归的复杂度?
答案 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)
从前者减去后者:
反复展开:
解决f(n)
的最后一个求和以获得复杂度。
例如为f(n) = O(n)
:
替代方法–变量替换:
S(m)
的形式适用于主定理。
例如对于f(n) = O(n) = O(log m)
,将案例2与k = 0
一起使用:
相同结果q.e.d。