我对硕士定理有点兴奋,我试图通过递归求解2个大小为n
的子问题并结合解决方案,找出解决大小n-1
问题的算法的运行时间在不断的时间
所以公式是:
T(N) = 2T(N - 1) + O(1)
但我不确定如何制定主定理的条件
我的意思是我们没有T(N/b)
因此b
的主定理公式是b=N/(N-1)
吗?
如果是,那么a > b^k
k=0
显然是O(N^z)
,而z=log2
(N/N-1)
的基础为{{1}},我怎么能理解这个?假设到目前为止我是对的?
答案 0 :(得分:3)
啊,提示就足够了。解决方案实际上非常简单。 z变换双方,对术语进行分组,然后反向z变换以获得解决方案。
首先,将问题视为
x[n] = a x[n-1] + c
将z变换应用于双方(关于ROC有一些技术性,但暂时忽略它)
X(z) = (a X(z) / z) + (c z / (z-1))
求解X(z)得到
X(z) = c z^2 / [(z - 1) * (z-a)]
现在观察到这个公式可以重写为:
X(z) = r z / (z-1) + s z / (z-a)
其中r = c /(1-a)且s = -a c /(1-a)
此外,请注意
X(z) = P(z) + Q(z)
其中P(z)= rz /(z-1)= r /(1 - (1 / z)),Q(z)= sz /(za)= s /(1 - a(1 / Z))
应用逆z变换得到:
p[n] = r u[n]
和
q[n] = s exp(log(a)n) u[n]
其中log表示自然对数,u [n]是单位(Heaviside)阶跃函数(即对于n> = 0,u [n] = 1,对于n <0),u [n] = 0。
最后,通过z变换的线性:
x[n] = (r + s exp(log(a) n))u[n]
其中r和s如上所定义。
重新回到原来的问题,
T(n) = a T(n-1) + c
然后
T(n) = (c/(a-1))(-1+a exp(log(a) n))u[n]
其中exp(x)= e ^ x,log(x)是x的自然对数,u [n]是单位步长函数。
这告诉你什么?
除非我犯了错误,否则T会随着指数增长而增长。在合理的假设下,这实际上是指数增加的函数a> 1。 1.指数由a(更具体地说,a的自然对数)控制。
再简化一次,请注意exp(log(a)n)= exp(log(a))^ n = a ^ n:
T(n) = (c/(a-1))(-1+a^(n+1))u[n]
所以O(a ^ n)用大O表示法。
现在这是一个简单的方法:
把T(0)= 1
T(n) = a T(n-1) + c
T(1) = a * T(0) + c = a + c
T(2) = a * T(1) + c = a*a + a * c + c
T(3) = a * T(2) + c = a*a*a + a * a * c + a * c + c
....
请注意,这会创建一个模式。具体是:
T(n) = sum(a^j c^(n-j), j=0,...,n)
把c = 1给出
T(n) = sum(a^j, j=0,...,n)
这是几何系列,其评估结果为:
T(n) = (1-a^(n+1))/(1-a)
= (1/(1-a)) - (1/(1-a)) a^n
= (1/(a-1))(-1 + a^(n+1))
表示n> = 0。
注意,使用z变换方法,此公式与上面给出的c = 1相同。再次,O(a ^ n)。
答案 1 :(得分:1)
甚至不要考虑师父的定理。当你获得主要定理时,你只能使用Masther定理。 1的一般形式为T(n)= aT(n / b)+ f(n)。
相反,想一想这样。您有一个递归调用,在每次递归调用时将输入n的大小递减1。并且在每次递归调用时,成本都是常数O(1)。输入大小将减少,直到达到1.然后,您将累计用于进行递归调用的所有成本。 他们有几个人? ñ。所以这需要O(2 ^ n)。
答案 2 :(得分:0)
看起来你无法根据主定理来解决这个问题。
一个好的开始是绘制递归树以理解模式,然后用替换方法证明它。您也可以多次展开公式,看看它的位置。
另请参阅此问题,该问题解决了2个子问题,而不是a
:
Time bound for recursive algorithm with constant combination time
答案 3 :(得分:0)
可能你会想到这样吗
当
n = 1, T(1) = 1
n = 2, T(2) = 2
n = 3, T(3) = 4
n = 4, T(4) = 8
n = 5, T(5) = 16
很容易看出这是一个几何系列1 + 2+ 4+ 8 + 16...
,其总和是
第一学期(ratio^n - 1)/(ratio - 1)
。对于这个系列,它是
1 * (2^n - 1)/(2 - 1) = 2^n - 1.
这里的主导词是2^n
,因此该函数属于Theta(2^n)
。您可以通过执行lim(n->inf) [2^n / (2^n - 1)] = +ve constant.
因此该函数属于Big Theta (2^n)