我最近在理解解决递归的替代方法时遇到了麻烦。我很少看关于该问题的在线讲座,但可悲的是它并没有告诉我太多(在其中一个中,我听说这是基于猜测的,这使我更加困惑),并且我正在寻找一些技巧。我的目标是使用替换方法解决三个不同的递归函数,找出它们的时间复杂度和T(32)的值。
功能1 定义为:
T(1)= 1
T(n)= T(n-1)+ n等于n> 1
我首先列出了前几次处决:
T(2) = T(2-1)+2 = 1+2
T(3) = T(3-1)+3 = 1+2+3
T(4) = T(4-1)+4 = 1+2+3+4
T(5) = T(5-1)+5 = 1+2+3+4+5
...
T(n) = 1+2+...+(n-1)+n = n(n+1)/2
然后我通过归纳证明,使用第一个 n 个自然数之和的公式, T(1)= 1 ,然后对于 n + 1 。对我来说很清楚,但是我不确定这是否是替代方法。还知道公式 T(n)= n(n + 1)/ 2 ,我很容易计算出T(32)= 528并计算了时间复杂度,即O(n ^ 2)。>
在示例(2)和(3)中,我只需要 n = 2 ^ k 的解决方案当 k 是自然数时,但是如果您向我推荐了一些文章,也说明了如何为所有 n 获取这些信息,那会很好(但是我想这要困难得多)比那)。
功能2 定义为:
T(1)= 0
T(n)= T(n / 2)+ 1,即使n> 1
对于奇数n> 1的T(n)= T((n + 1)/ 2)+1
由于只允许对 n = 2 ^ k 进行证明,因此根据我所获得的知识,我尝试通过以下方式进行验证:
T(n) = T(n/2) + 1
= T(n/4) + 1 + 1 = T(n/4) + 2
= T(n/8) + 1 + 2 = T(n/8) + 3
= T(n/16) + 1 + 3 = T(n/16) + 4
= T(n/2^i) + i // where i <= k, according to tutorials
这是我被困住的时刻,我无法继续进行下去。我想我的计算是正确的,但是我不确定如何寻找一个满足该功能的公式。得到正确的公式后,计算T(32)或时间复杂度将不是问题。
功能3 定义为:
T(1)= 1
T(n)= 2T(n / 2)+ 1,即使n> 1
对于奇数n> 1,T(n)= T((n – 1)/ 2)+ T((n + 1)/ 2)+ 1
我的计算:
T(n) = 2T(n/2) + 1
= 2(2T(n/4)+1) + 1 = 4T(n/4) + 3
= 4(2T(n/8)+1) + 3 = 8T(n/8) + 7
= iT(n/2^i) + 2^i - 1
再次涉及公式,我不确定该如何重写。
基本上,用替代方法求解递归是否意味着寻找和迭代公式?
答案 0 :(得分:0)
在重新研究了该主题之后,我发现自己做错了什么,并且没有让我的问题没有得到回答,我会尽力做到这一点。
第一个函数计算正确,归纳证明也是正确的-在此无需添加任何内容。
当我遇到第二功能时,我没有 请注意,我实际上正在使用替换 n = 2 ^ k 。这个 应该是这样的:
T(n) = T(n/2) + 1
= T(n/4) + 1 + 1 = T(n/4) + 2
= T(n/8) + 1 + 2 = T(n/8) + 3
= T(n/16) + 1 + 3 = T(n/16) + 4
= T(n/2^k) + k
= T(1) + k
= k
归纳证明: T(2 ^ k)= k 有效:
基本情况: k = 1,则T(2 ^ 1)= T(2)=1。(它不能为k = 0,因为2 ^ 0不大于1)
归纳步骤: 假设T(2 ^ k)= k,我们想显示T(2 ^(k + 1))= k + 1。由于 2 ^ k = n ,则 2 ^(k + 1)= 2 * 2 ^ k = 2n 。
T(2n) = T(n) + 1
= T(n/2) + 1 + 1
= T(n/4) + 2 + 1
= T(n/8) + 3 + 1
= T(1) + k + 1
= k + 1.
时间复杂度: O(log n)
T(32) = T(2 ^ 5)= 5
在第三个功能中,我每次都错过了该功能 本身的价值就翻了一番。
T(n) = 2T(n/2) + 1
= 2(2T(n/4)+1) + 1 = 4T(n/4) + 3
= 4(2T(n/8)+1) + 3 = 8T(n/8) + 7
= 8(2T(n/16)+1) + 7 = 16T(n/16) + 15
= 16(2T(n/32)+1) + 15 = 32T(n/32) + 31
= 2^k*T(n/2^i) + 2^k - 1
= 2^k*T(1) + 2^k - 1
= 2^k + 2^k - 1
= 2^(k+1) - 1
归纳证明: T(2 ^ k)= 2 ^(k + 1)-1 起作用:
基本情况: k = 1,则T(2 ^ 1)= T(2)=3。原始函数T(2)= 2T(1)+1 = 2 + 1 = 3,所以基本情况为真。
归纳步骤: 假设T(2 ^ k)= 2 ^(k + 1)-1,我们要显示T(2 ^(k + 1))= 2 ^(k + 2)-1。类似地,与第二个函数一样, 2 ^ k = n ,所以 2 ^(k + 1)= 2 * 2 ^ k = 2n 。
T(2n) = 2T(n) + 1
= 2(2T(n/2)+1) + 1 = 4T(n/2) + 3
= 4(2T(n/4)+1) + 1 = 8T(n/4) + 7
= 8(2T(n/8)+1) + 1 = 16T(n/8) + 15
= 2^(k+1) + 2^(k+1) - 1
= 2*2^(k+1) - 1
= 2^(k+2) - 1.
我们还可以看一下T(n)的前几个元素,分别是1、3、5、7、9等,因此T(n)= 2n-1
时间复杂度: O(n)
T(32) = T(2 ^ 5)= 2 ^(5 + 1)-1 = 64-1 = 63