求解递归关系:T(n)= T(n-1)+ T(n / 2)+ n

时间:2015-09-19 15:22:26

标签: algorithm math big-o recurrence

解决:T(n)= T(n-1)+ T(n / 2)+ n

我尝试使用递归树来解决这个问题。分别有两个分支T(n-1)T(n/2)T(n-1)会更深入。所以我们得到O(2^n)。这个想法是否正确?

5 个答案:

答案 0 :(得分:5)

不,你的想法不正确。复杂性是O(n)我也必须承认这个问题很难。

这是一个解决方案。 T(n) = T(n-1) + T(n/2) + n。由于您计算的内容非常大n,因此n-1n几乎相同。因此,您可以将其重写为T(n) = T(n) + T(n/2) + n

在这里我犯了一个错误,错误的解决方案开始了

T(n) = 1/2 * T(n/2) + n/2。如您所见,这种递归的复杂性将比原始递归复杂得多。

请注意,您不能在此处使用Master's定理,因为a < 1

您可以开始展开递归。

enter image description here

最后一次求和转换,因为它是几何级数。因此,递归将在某个时间停止,您可以选择某个时间点。我在T(1) = b时选择了它。这种情况发生在n/2^k = 1n = 2^k,这意味着k = log n

如果您将在递归中替换此k,则最大元素将以O(n)运行,因此这是此等式的运行时间。

错误结束,正确开始

T(n/2) + n = 0,等于T(n) = - 2n,因此它是线性的。这对我来说是违反直觉的(这里是减号),但是有了这个解决方案,我发现functional equation T(n)=T(n-1)+T(n/2)+n的解决方案非常接近-2n - 2

如果您将其插入等式中,您会看到对于任何n它只有1关闭。所以解决方案仍然是O(n)

P.S。再一次,CS类的一个非常奇怪的递归。

答案 1 :(得分:0)

你的推理是正确的,但你放弃的太多了。 (例如,说2x^3+4=O(2^n)也是正确的,但这不像2x^3+4=O(x^3)那样有用。)

我们要做的第一件事就是摆脱不均匀的术语n。这表明我们可能会寻找T(n)=an+b形式的解决方案。用它代替,我们发现:

an+b = a(n-1)+b + an/2+b + n

减少到

0 = (a/2+1)n + (b-a)

暗示a=-2b=a=-2。因此,T(n)=-2n-2是等式的解决方案。

我们现在想通过减去我们已经找到的解决方案来寻找其他解决方案。我们来定义U(n)=T(n)+2n+2。等式变为

U(n)-2n-2 = U(n-1)-2(n-1)-2 + U(n/2)-2(n/2)-2 + n

减少到

U(n) = U(n-1) + U(n/2).

U(n)=0是这个等式的一个明显的解决方案,但是这个等式的非平凡解决方案如何表现?

我们假设某些U(n)∈Θ(n^k)k>0,因此U(n)=cn^k+o(n^k)。这使得等式

cn^k+o(n^k) = c(n-1)^k+o((n-1)^k) + c(n/2)^k+o((n/2)^k)

现在,(n-1)^k=n^k+Θ(n^{k-1}),以便上述内容成为

cn^k+o(n^k) = cn^k+Θ(cn^{k-1})+o(n^k+Θ(n^{k-1})) + cn^k/2^k+o((n/2)^k)

吸收低阶项并减去常用cn^k,我们到达

o(n^k) = cn^k/2^k

但这是错误的,因为右手边比左边增长得快。因此,U(n-1)+U(n/2)增长速度超过U(n),这意味着U(n)必须比我们假设的Θ(n^k)增长得更快。由于任何k都适用,U(n)必须比任何多项式都快。

比任何多项式增长更快的事物的一个很好的例子是指数函数。因此,我们假设某些U(n)∈Θ(c^n)c>1,因此U(n)=ac^n+o(c^n)。这就是方程式 ac ^ n + o(c ^ n)= ac ^ {n-1} + o(c ^ {n-1})+ ac ^ {n / 2} + o(c ^ {n / 2}) 重新排列并使用某些增长数学顺序,这就变成了

c^n = o(c^n)

这是错误的(再次),因为左手边比右边增长得快。因此, U(n)的增长速度超过U(n-1)+U(n/2),这意味着U(n)的增长速度必须慢于我们假设的Θ(c^n)。由于任何c>1都是如此,U(n)必须比任何指数增长更慢。

这使我们进入准多项式的领域,其中ln U(n)∈O(log^c n)和次指数,其中ln U(n)∈O(n^ε)。其中任何一个都意味着我们要查看L(n):=ln U(n),其中前面的段落暗示L(n)∈ω(ln n)∩o(n)。根据我们方程的自然对数,我们有

ln U(n) = ln( U(n-1) + U(n/2) ) = ln U(n-1) + ln(1+ U(n/2)/U(n-1))

L(n) = L(n-1) + ln( 1 + e^{-L(n-1)+L(n/2)} ) = L(n-1) + e^{-(L(n-1)-L(n/2))} + Θ(e^{-2(L(n-1)-L(n/2))})

所以一切都归结为:L(n-1)-L(n/2)增长的速度有多快?我们知道L(n-1)-L(n/2)→∞,否则L(n)∈Ω(n)L(n)-L(n/2)可能同样有用,因为L(n)-L(n-1)∈o(1)远小于L(n-1)-L(n/2)

不幸的是,这是我能够解决问题的方法。我没有看到控制L(n)-L(n/2)增长速度的好方法(我几个月来一直盯着这个)。我唯一可以结束的是引用另一个答案:“CS类的一个非常奇怪的递归”。

答案 2 :(得分:0)

我认为我们可以这样看:

T(n)=2T(n/2)+n < T(n)=T(n−1)+T(n/2)+n < T(n)=2T(n−1)+n

如果我们应用大师定理,则:

Θ(n∗logn) < Θ(T(n)) < Θ(2n)

答案 3 :(得分:0)

请记住,T(n) = T(n-1) + T(n/2) + nT(n) = T(n-1) + n大(渐近)仅适用于渐近为正的函数。在这种情况下,我们有T = Ω(n^2)

请注意,T(n) = -2(n + 2)是泛函方程的一个解,但它对我们不感兴趣,因为它不是渐近正解的解决方案,因此O的表示法不是有有意义的应用。

您还可以轻松检查T(n) = O(2^n)。 (如果需要,请参考yyFred解决方案)

如果您尝试对类型为n^a(lgn)^b且具有a(>=2)b正常数的函数使用O的定义,您会发现Substitution也不可行方法。

实际上,唯一允许使用Substitution Method进行证明的函数是指数函数,但是我们知道该递归的增长速度不如T(n) = 2T(n-1) + n快,因此,如果T(n) = O(a^n),我们可以a < 2

假设T(m) <= c(a^m)(对于某些常数c)是实数和正数。我们的假设是该关系对所有m

T(n) <= (1/a+1/a^(n/2))c(a^n) + n

我们可以通过将假设更改为低阶项来轻松摆脱n。重要的是:

1/a+1/a^(n/2) <= 1

a^(n/2+1)-a^(n/2)-a >= 0

更改变量:

a^(N+1)-a^N-a >= 0

我们希望找到一个尽可能紧密的键,因此我们正在寻找最低的a。我们在上面发现的不等式接受a的解,该解非常接近1,但是a是否可以任意接近1?答案是否定的,让a的格式为a = (1+1/N)。将a替换为不等式并应用限制N -> INF

e-e-1 >= 0

这是荒谬的。因此,上面的不等式具有某个固定数N*作为最大解,可以通过计算找到。一个快速的Python程序使我能够找到a < 1+1e-45(稍作推断),因此我们至少可以确定:

T(n) = ο((1+1e-45)^n)

答案 4 :(得分:-3)

T(n)=T(n-1)+T(n/2)+nT(n)=T(n)+T(n/2)+n相同,因为我们正在解决n的极大值。 T(n)=T(n)+T(n/2)+n只有在T(n/2) + n = 0时才能为真。这意味着T(n) = T(n) + 0 ~= O(n)