给出以下代码:
(1) e(n)
(2) foo = 1
(3) for j=0 to n-1
(4) foo = foo + j + e(j)
(5) return foo
我像这样分析时间复杂度:
(2) c1 (constant time)
(3) sum j=0 to n-1 (c2 + T(j))
(5) c3 (constant time)
=> T(n) = c1 + sum j=0 to n-1 (c2+ T(j)) + c3 , n>=1
我想显示指数下限,但没有估计,除了说c1 = c2 = c3 = 1(因为下限)。
=> T(n) = 1 + sum j=0 to n-1 (1+T(j)) + 1, n>=1
我的第一个问题:我会看一下前n个,寻找一个模式,并通过归纳显示指数下限。这样对吗?还有更好的方法吗?
我的第二个问题:如果我说代码行(2)和(5)只需要恒定时间,我可以忽略它们。然后我得到
T(n) = sum j=0 to n-1 (1+T(j)), n>=1
但是我还有另一个下限。这种方法有误吗?
答案 0 :(得分:0)
通常,您只对一个数量级感兴趣,而不是确切的值。因此,T(n)= 17 + 2n,T(n)= 3n-5和T(n)= n都是相同的:T(n)= O(n)。 在您的情况下,T(n)= 1 + Sum_ {0< = j< n}(1 + T(j))+ 1 = 2 + n + Sum_ {0< = j< N}(T(j))。 2已经被n占据并且可以被丢弃(n可能很重要 - 我们目前还不确定。)
现在,让我们看看T(n + 1)= 2 +(n + 1)+ Sum_ {0< = j< n + 1}(T(j))= 2 + n + 1 + Sum_ {0< = j< n}(T(j))+ T(n)= T(n)+ T(n)+1 = 2 * T(n)+1 = 2 ^(n + 1)* T(0)+ 2 ^第(n + 1)-1。考虑到T(0)= 2 = O(1),我们得到估计T(n)= O(2 ^ n)。