我已经解决了以下问题:
T(n) = T(n - 1) + n = O(n^2)
现在我计算出来的结果发现这个界限非常宽松。我是做错了什么还是本来就是这样的?
T(n) = T(n - 1) + n = O(n^2)
现在我计算出来的结果发现这个界限非常宽松。我是做错了什么还是本来就是这样的?
T(1) = c
T(n) = T(n-1) + n
T(n) = (n + 1) * n / 2 + c - 1
首先是基础情况。当 n = 1 时,它会提供所需的 c。
对于其他的 n:
T(n)
= (n + 1) * n / 2 + c - 1
= ((n - 1) + 2) * n / 2 + c - 1
= ((n - 1) * n / 2) + (2 * n / 2) + c - 1
= (n * (n - 1) / 2) + c - 1) + (2 * n / 2)
= T(n - 1) + n
所以这个解决方案是有效的。
为了首先得到猜测,注意当c = 1时,您的递归关系生成三角形数:
T(1) = 1:
*
T(2) = 3:
*
**
T(3) = 6:
*
**
***
T(4) = 10:
*
**
***
****
etc..
从直观上来看,三角形大约是正方形的一半,在大O符号表示法中,常数可以忽略,因此O(n^2)是预期的结果。
T(n) = T(n-1) + n = T(n-2) + (n - 1) + n =
= T(n-3) + (n-2) + (n-1) + n = ... =
= T(0) + 1 + 2 + ... + (n-1) + n
1/2*n*(n-1)
。从技术上讲,你在这里缺少边界条件,但是通过任何常数边界条件,你可以看到递归是O(n^2)
。看起来还不错,但取决于基本情况T(1)。假设您将执行n个步骤以将T(n)转换为T(0),每次n项都在0和n之间,平均为n/2,因此n * n / 2 =(n^2)/ 2 = O(n^2)。