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.