Algorithm 无法理解此重复出现的复杂性
我对主定理有点耳目一新,我试图通过递归地解决大小Algorithm 无法理解此重复出现的复杂性,algorithm,recursion,complexity-theory,asymptotic-complexity,master-theorem,Algorithm,Recursion,Complexity Theory,Asymptotic Complexity,Master Theorem,我对主定理有点耳目一新,我试图通过递归地解决大小n-1的2个子问题并在恒定时间内组合解决方案,来计算出一个算法的运行时间。 所以公式是: T(N)=2T(N-1)+O(1) 但我不知道如何才能表述主定理的条件。 我的意思是我们没有主定理公式的t(N/b),在这种情况下b=N/(N-1)? 如果是,因为显然a>b^k因为k=0并且是O(N^z)其中z=log2以(N/N-1)为基数,我如何理解这一点?假设我到目前为止是对的?看起来你不能用主定理来描述这个问题 一个好的开始是绘制递归树来理解模式,然
n-1
的2个子问题并在恒定时间内组合解决方案,来计算出一个算法的运行时间。所以公式是:
T(N)=2T(N-1)+O(1)
但我不知道如何才能表述主定理的条件。
我的意思是我们没有主定理公式的
t(N/b)
,在这种情况下b=N/(N-1)
?如果是,因为显然
a>b^k
因为k=0
并且是O(N^z)
其中z=log2
以(N/N-1)
为基数,我如何理解这一点?假设我到目前为止是对的?看起来你不能用主定理来描述这个问题
一个好的开始是绘制递归树来理解模式,然后用替换方法证明它。您还可以将公式展开几次,看看它的方向
另请参见此问题,它解决了2个子问题,而不是a
:
不要去想马斯特定理。只有当一般形式T(n)=aT(n/b)+f(n)中的b>1时,才可以使用马斯特定理 相反,你可以这样想。您有一个递归调用,它在每次递归调用中将输入的大小n递减1。在每次递归调用时,代价是常数O(1)。输入大小将减小,直到达到1。然后将用于进行递归调用的所有成本相加。
他们有多少人?N所以这需要O(2^n) 啊,这些暗示够了。解决办法其实很简单。对两侧进行z变换,将项分组,然后进行z逆变换以获得解 首先,将问题视为
x[n] = a x[n-1] + c
将z变换应用于两侧(ROC有一些技术上的问题,但我们暂时忽略)
求解X(z)得到
现在请注意,此公式可以重新编写为:
X(z) = r z / (z-1) + s z / (z-a)
其中r=c/(1-a)和s=-AC/(1-a)
此外,请注意
X(z) = P(z) + Q(z)
其中p(z)=rz/(z-1)=r/(1-(1/z)),Q(z)=sz/(z-a)=s/(1-a(1/z))
应用逆z变换以获得:
p[n] = r u[n]
及
其中log表示自然对数,u[n]是单位(Heaviside)阶跃函数(即u[n]=1表示n>=0,u[n]=0表示n 1。指数由a(更具体地说,a的自然对数)控制
再简化一下,请注意exp(log(a)n)=exp(log(a))^n=a^n:
所以O(a^n)用大O表示法
现在有一个简单的方法:
放置T(0)=1
请注意,这将创建一个模式。具体来说:
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+2+4+8+16…
,其和为
第一项(比率^n-1)/(比率-1)
。对于本系列,它是
1 * (2^n - 1)/(2 - 1) = 2^n - 1.
这里的主要术语是2^n
,因此该函数属于Theta(2^n)
。您可以通过执行lim(n->inf)[2^n/(2^n-1)]=+ve常量来验证它。
因此,函数属于大θ(2^n)首先,这是定义不清的,因为T(1)需要定义,所以让我们将它定义为T1。其次,这实际上是一阶线性递归关系。我要给你一个提示。这样看:x[n]=a x[n-1]+C更正了OP中的一个输入错误。在公式中写入了
a
而不是2
。这会改变你的答案吗?更正了OP中的一个输入错误。在公式中写入了a
而不是2
。这会改变你的答案吗?我的OP是关于如何将主定理应用于具有a
b
和k
的公式>递归的值正如我上面解释的,你不能直接将Master定理的公式应用于这个。但是你可以从Master定理的基础上画一个递归树,并计算出总时间。+1指出Master定理中的b>1
!我完全忘了!对不起,我的第二条评论,实际上是O(2^n)。这是因为您在每一步进行两次递归调用。然后,递归调用的数量将在n变为1时成倍增加。对于拉门问题,我深表歉意,但什么是ROC?我甚至不记得什么是z-transform
。但您的解决方案与教科书中的解决方案是相同的结果。因此+1@Cratylus,我加了一句简单的方法,这可能更符合你所学的内容。似乎你可以扩展术语并注意到它是一个几何级数。这是这个方程的运气。它并不总是那么干净。z变换方法适用于比1更高的阶数和时髦的组合。例如,如果T(n)=a T(n-1)+b T(n-2)会怎么样+c T(n-3)+d。简单的扩展并不总是很好。不管怎样,对我来说是很好的复习。我已经15年没有做过这件事了。似乎是正确的答案,但我必须学习它才能理解它。对于megreat答案来说太高级了。对于使用z变换的分析证明来说+1。
T(n) = a T(n-1) + c
T(n) = (c/(a-1))(-1+a exp(log(a) n))u[n]
T(n) = (c/(a-1))(-1+a^(n+1))u[n]
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)
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 = 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^n - 1)/(2 - 1) = 2^n - 1.