更好地猜测上限

时间:2013-01-07 11:31:05

标签: algorithm complexity-theory

这是来自“算法简介”的问题,其编号为4.4-5,并且描述如下:

  

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

我发现计算递归树的重复是很困难的。我给出的答案

  

Math.pow(2,n)的

似乎太松了。也许有更好的猜测存在。谢谢你的帮助。

2 个答案:

答案 0 :(得分:11)

希望我没有犯错误:))

让我们A(n)=T(n/2)+n

0. T(n)=T(n-1)+A(n)=T(n-2)+A(n-1)+A(n)=...=A(1)+A(2)+...+A(n)
   T(n)=sum[1..n]A(n)
   T(n)=sum[i=1..n]T(i/2)+sum[i=1..n]i

假设n/2为整数除法,T(n/2)=T((n+1)/2)为偶数n,因此第一个和由两个相等的一半组成:T(1)+T(1)+T(2)+T(2)+...

1. T(n)=2*sum[1..n/2]T(i)+n*(n-1)/2

T(n)<=T(m) for every n<=m

以来
2. T(n)<=n*T(n/2)+n*(n-1)/2

T(n/2)>=n/2>=(n-1)/2

以来
3. T(n)<=n*T(n/2)+n*T(n/2)=2*n*T(n/2)

我们只考虑n=2^k,因为T是单调的:n=2^kU(k)=T(2^k)

4. U(k)<=2*(2^k)*U(k-1)=2^(k+1)*U(k-1)

L(k)=log2 U(k)

5. L(k)<=k+1+L(k-1)

就像我们在step0和step1之间做的那样

6. L(k)<=k*(k-1)/2+k=k*k/2-k/2+k<=k*k

7. U(k)=2^L(k)<=2^squared(k)

8. T(n)=U(log2 n)<=2^squared(log2 n)

答案 1 :(得分:1)

递归关系似乎产生了一个亚指数和超线性计算时间,这意味着任何选定的基都可以作为上限给定足够大的n

您选择的2^n是一个很好的答案,也可能是他们在书中寻找的答案。这是一个简单的解决方案,即使对于非常小的n值也是有效的。 (尽管如此,我理解你为什么提出这个问题,因为即使对于中等大的T(n),它确实比n增长得快得多。)

给定T(1) = 1(或其他一些常量),递归方程为n的前几个值提供了如下运行时间。

T(1) = 1          n^1 = 2
T(2) = 4          n^2 = 4
T(3) = 11         n^3 = 8
T(4) = 19         n^4 = 16
T(5) = 35         n^5 = 32
T(6) = 52         n^6 = 64
T(7) = 78         n^7 = 128
T(8) = 105        n^8 = 256
T(9) = 149        n^9 = 512

我们可以看到选择2^n作为上限对所有值T(6)及以上都有效。

如果你想要一个低于2^n的下界,你可以选择一个较低的基数(权衡它只对更高数量的n有效)。但我必须补充一点,它仍然与你已经拥有的解决方案基本相同。

任何大于1的基数都可以做但更具体一点我们可以看到递归方程T(n) = T(n-1) + T(n/2) + nT(n) = T(n-1) + T(n-2)方程n>5的限制。

这与Fibonacci序列的递归关系相同,并且遵循this问题的答案中的步骤,其计算复杂度与黄金比率(1+sqrt(5))/2 = 1,618匹配n的幂}。

绘制实际值,我们可以看到n T(n)的值受((1+sqrt(5))/2)^n限制。从图中看,它似乎是值n=13及以上。

Computational complexity of algorithm.

所有这些说,我已经考虑了一些关于使用一些亚指数函数来近似运行时间。它似乎并不容易完成,正如我所说,我相信你已经找到了预期的答案。