我有一个测验,要求我找出一个程序的递归关系的解决方案:
算法采用的时间量T(n)通常是大小的函数, n,输入数据。假设您编写了一个显示以下时间重现的程序:
T(n)= T(n / 2)+ a,如果n> 1
T(n)= b,如果n = 1
以下是我的尝试:
T(n / 2)= T(n / 4)+ a T(n / 4)= T(n / 8)+ a
所以:
T(n)= T(n / 4)+ 2 * a = T(n / 8)+ 3 * a = T(n / K)+ 3 * a
到此为止,我想让程序终止的T(n)= 1,所以我做
n / K = 1 - > K = n
我得到了:
T(n / n)+ 3 * a = b + 3a
然而答案显示该程序具有对数复杂度,解决方案应为T(n)= a * log2(n)+ b
我不明白如何获得上述解决方案,任何人都可以帮助我吗? 谢谢!
答案 0 :(得分:0)
这样想。在每次迭代中,你将问题大小n减半:从n到n / 2到n / 4,依此类推。你可以想象一下"树",通常你有一个像T(n)= a * T(n / b)+ f(n)的公式然后在你的树中每个节点都有度a和问题大小在每个节点处除以b。在您的情况下,树在每个级别的问题大小的一半,但树节点的程度保持一个。
n/2: a
\
n/4: a
\
n/8: a
\
...
\
n/n: b + a
我假设你看到这棵树有多深,以及如何达到你所描述的解决方案的复杂程度。
另一种查看它的方法,更接近您的具体练习:在每次迭代中,您添加a
对吗?您多久添加一次a
?