我被要求使用迭代方法分析以下递归方程的时间复杂度:
T(N)= T(N / 3)+ T(2π/ 3)+ N ^ 2
T(1)= 1
当我尝试扩展方程时,它会爆炸,我无法真正跟踪所有递归的“调用”和常量。 这是由于数据的不均匀划分造成的(1 \ 3 - 2 \ 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 - 你的答案是所有这些常数的总和......