分析不均匀递归算法的复杂性

时间:2013-03-20 10:19:49

标签: algorithm recursion code-analysis

我被要求使用迭代方法分析以下递归方程的时间复杂度:

  

T(N)= T(N / 3)+ T(2π/ 3)+ N ^ 2

     

T(1)= 1

当我尝试扩展方程时,它会爆炸,我无法真正跟踪所有递归的“调用”和常量。 这是由于数据的不均匀划分造成的(1 \ 3 - 2 \ 3)。

使用迭代方法有更简单的方法来解决这个问题吗?

非常感谢。

3 个答案:

答案 0 :(得分:0)

如果我没有遗漏任何东西,似乎是O(n ^ 2)......

首先,T单调增长(对于几个第一个值你可以手动检查,其余的是通过归纳 - 如果函数在[1..10]中是单调的,那么它将在[1 ..]上单调。 15]等等。

T(n)=T(n/3)+T(2n/3)+n^2<=2T(2n/3)+n^2
T(n)<=n^2+2*(2n/3)^2+4*(4n/9)^2+...
     =sum[k=0..log3(n)]((8/9)^k*n^2)
     =n^2*sum[k=0..log3(n)](8/9)^k
    <=n^2*sum[k=0..inf](8/9)^k
    <=C*n^2

答案 1 :(得分:0)

Here是一篇论文,显示了对类似公式的分析:T(n)= T(n / 3)+ T(2n / 3)+ n

使迭代化的一种方法需要使用类似于解析器\编译器工作的方法

应用你的公式:T(n)= T(n / 3)+ T(2n / 3)+ n ^ 2,n = 1..9产生

T(0) = 0

T(1) = T(1/3) + T(2/3) + 1

T(2) = T(2/3) + T(4/3) + 4

T(3) = T(1) + T(2) + 9

T(4) = T(4/3) + T(8/3) + 16

T(5) = T(5/3) + T(10/3) + 25

T(6) = T(2) + T(4) + 36

T(7) = T(7/3) + T(14/3) + 49

T(8) = T(8/3) + T(16/3) + 64

T(9) = T(3) + T(6) + 91

T(3m) = T(m) + T(2m) + 9m^2

..也许这可以给你一些提示

答案 2 :(得分:0)

这里的帮助是不要将任何数字相乘,而是根据权力来写出所有数字。这一切都是手工完成的,我在前几次扩展中得到了以下内容:

T(n) = T((1/3)n) + T((2/3)n) + n^2
     =    T((1/3^2)n) 
       + 2T((2/3^2)n) 
       +  T((2^2/3^2)n) 
       + [n^2]                      #constants from the first expansion
       + [((1/3)n)^2 + ((2/3)n)^2]  #constants from the second expansion
     =    T((1/3^3)n) 
       + 3T((2/3^3)n) 
       + 3T((2^2/3^3)n) 
       +  T((2^3/3^3)n) 
       + [n^2] 
       + [((1/3)n)^2 + ((2/3)n)^2] 
       + [((1/3^2)n)^2 + ((2/3^2)n)^2 + ((2^2/3^2)n)^2] #constants from 3rd expansion

这有点难以辨别,但似乎发生的事情是你得到T s的二项式系数,其中x扩展看起来像这样:

T(n) = sum((x choose i) * T(((2^i)/(3^x))n), i from 0 to x)
       + constants

在每个步骤中,在展开x处添加的其他常量是T来自展开x-1的参数,平方,因为它们最终都会变得平方,这要归功于{ {1}}。因此,给定扩展n^2的所有 new 常量都等于:

y

所有扩展NewConsts(y) = sum(((y - 1) choose i) * (((2^i)/(3^(y-1)))*n)^2, i from 0 to y - 1) 处的常量等于

x

所以,假设以上所有都是正确的,我不是100%肯定的,我猜你必须弄清楚常数何时停止重要 - 也就是说,n^2 + sum(NewConsts(y), y from 1 to x) 是{{1}等于0 - 你的答案是所有这些常数的总和......