我需要解决复发问题
T(n)= 2T(n 1/2 )+ 1
我需要找到渐近时间的复杂性。我正在使用递归树方法,但我遇到了困难。我知道答案是Θ(log n),但我不知道如何达到这个目的。你是如何解决这种复发的?
答案 0 :(得分:3)
如果您看到重复T(n),其中一个术语取决于输入大小的平方根,那么定义新的重现通常很有用
S(k)= T(2 k )
因为k中的重复发生通常比n中的相应重复更容易使用。在我们的例子中,我们有
S(k)= T(2 k )
= 2T(√(2 k ))+ 1
= 2T(2 k / 2 )+ 1
= 2S(k / 2)+ 1
请注意,我们现在有一个与主定理所期望的形式相匹配的重复(并且通常比原始定义更容易使用)。我们可以通过许多不同的技术将这种重现解决为S(k)=Θ(k)。
既然我们知道S(k)=Θ(k),我们可以说T(n)?好吧,假设我们可以捏造不是2的精确幂的东西,我们可以说T(n)≈S(lg n),因为S(lg n)= T(2 lg n < / sup>)= T(n)。因此,我们得到了
T(n)= S(lg n)=Θ(lg n)
所以T(n)=Θ(lg n)。
这是达到这个结果的另一种方式,它不那么数学化,更直观。想象一下通过扩展原始递归T(n)形成的递归树的形状。在顶层,我们有一个大小为n的调用1个工作。在下一个级别,我们有两个大小为 2 √n的调用,共计2个工作。在下面的级别是四次调用大小 4 √n,总共4个工作。更一般地说,在k级,我们有2个 k 调用,每个调用 2 k √n工作。当n变得足够小(例如,n = 2)时,递归终止,这发生在某个级别k。那时,完成的工作总数将是
1 + 2 + 4 + 8 + 16 + ... + 2 k = 2(2 k ) - 1。
如果我们能解决k,我们就会知道完成了多少工作。请注意,当输入下降到2时,递归停止,这意味着我们想要的k是 2 k √n= 2的那个。求解k,我们看到该
2 k √n= 2
n = 2 2 k
lg lg n = k
一般来说,如果你看到一个因平方根因子而缩小的东西,你应该期望the number of iterations before the term drops to a constant is O(log log n)。因此,完成的总工作量为2(2 lg lg n )+ 1 = 2 lg n - 1 =Θ(lg n),如前所述。
答案 1 :(得分:1)
然后
其中N
是系列终止前的术语数。
但是N
是什么?这取决于 amit 评论的答案。假设n
中的T(n)
允许非整数值,而T
n < C
的{{1}}终止(= 0),对于某个常量C > 1
。
然后我们需要
因此,复杂性还取决于C
:
编辑:数据支持我的回答:
T
针对log n
,C = 1.5
:T
针对- log C
,n = 2^64
:如您所见,两者都是线性的。
答案 2 :(得分:0)
使用递归树方法,可以解决以下问题: follow this link