递归树和替换方法

时间:2011-04-22 20:43:57

标签: algorithm recursion performance

我有这个练习:

“使用递归树来确定递归T(n)= T(n / 2)+ n ^ 2的良好渐近上界。使用替换方法验证您的答案”

我制作了这个递归树

http://i.stack.imgur.com/kebwg.png

我认为k - >无穷大(在我的书中,当T中的输入变为1时,他们经常会停止重复,但我不认为是这种情况,当我没有其他信息时)。

我的结论是:

http://i.stack.imgur.com/8ogEh.png

当我使用替换方法时,我假设T(n)= O(n ^ 2)

然后完成以下步骤:

http://i.stack.imgur.com/i13dJ.png

当n> 0且c> 0时,我发现以下情况适用于某些选择c

http://i.stack.imgur.com/VijkP.png

因此T(n)<= cn ^ 2

我的问题是:“这是正确的做法吗?”

2 个答案:

答案 0 :(得分:2)

首先,正如菲利普所说,你的递归树是错误的。它最终并没有影响复杂性,但你得到的常数是错误的。

T(n) becomes
n^2 + T(n/2) becomes
n^2 + n^2/4 + T(n/4) becomes
...
n^2(1 + 1/4 + 1/16 + ...)

在一个地方停留在无限远地区,主要是品味和选择更方便的事情。在这种情况下,我会像你一样做,并使用无限和,因为我们可以使用几何系列公式来得到T(n) <= (4/3)n^2


唯一困扰我的是,你的证据最终倾向于非正式的。很容易迷失在非正式的证据中,所以如果我必须对你的作业进行评分,我会通过感应更加舒适,如下所示:

声明

We wish to prove that T(n) <= (4/3)*n^2, for n >= 1

c n0 的具体值使证明更加可信,所以如果可以,请将它们放入。通常你需要运行一次证明才能找到值,然后回来把它们放进去,就好像你已经知道它们一样:)在这种情况下,我希望我的4/3猜测来自递归树结果正确。

通过归纳证明:

基本情况(n = 1):

T(1) = 1 

(你没有明确表示T(1)的值,但我想这应该是在原来的练习中)

T(1)  = 1
     <= 4/3
      = (4/3)*1^2
T(1) <= (4/3)*1^2

正如我们想要的那样。

归纳案例(n> 1):

(这里我们假设所有n'&lt; n)的归纳假设T(n') <= 4/3*(n')^2

我们知道

T(n) = n^2 + T(n/2)

归纳假设:

T(n) <= n^2 + (4/3)(n/2)^2

做一些代数:

T(n) <= n^2 + (4/3)(n/2)^2
      = n^2 + (1/3)n^2
      = (4/3)n^2
T(n) <= (4/3)*n^2

正如我们想要的那样。


可能看起来很无聊,但现在我可以肯定我的答案是正确的!

答案 1 :(得分:1)

您的递归树是错误的。它应该是这样的:

N ^ 2
|
(N / 2)^ 2
|
(N / 4)^ 2
|
...
|
(N / 2 ^ k)的^ 2

一旦T达到1,你就可以安全地停止,因为你通常计算离散的“步数”,并且没有“0.34步”这样的东西。

由于您在每次迭代中将n除以2,因此k等于log2(n)