Algorithm 如何求解递推关系的一个特例

Algorithm 如何求解递推关系的一个特例,algorithm,complexity-theory,relation,recurrence,Algorithm,Complexity Theory,Relation,Recurrence,关于求解^k上的Tn=Tn-1+Tn-2+或^k上的Tn=a Tn/b+形式的递推关系,有很多示例和教程,其中有一些初始条件 我试图解决一个递归关系,它是这两种形式的混合,其中: Tn=Tn-2+2 Tn/2,初始条件为T0=1,T1=1 关于如何解决这个循环关系有什么建议吗 谢谢使用替换方法。好吧,让我退一步。替代法用于评估猜测,但猜测必须来自某个地方。我对这种复发没有太多的直觉,所以我会写下我的过程。我发现查看序列的开头很有用 >>> def T(n): ... if n

关于求解^k上的Tn=Tn-1+Tn-2+或^k上的Tn=a Tn/b+形式的递推关系,有很多示例和教程,其中有一些初始条件

我试图解决一个递归关系,它是这两种形式的混合,其中: Tn=Tn-2+2 Tn/2,初始条件为T0=1,T1=1

关于如何解决这个循环关系有什么建议吗


谢谢

使用替换方法。好吧,让我退一步。替代法用于评估猜测,但猜测必须来自某个地方。我对这种复发没有太多的直觉,所以我会写下我的过程。我发现查看序列的开头很有用

>>> def T(n):
...  if n==0: return 1
...  elif n==1: return 1
...  else: return T(n-2) + 2*T(n//2)
... 
>>> [T(n) for n in range(50)]
[1, 1, 3, 3, 9, 9, 15, 15, 33, 33, 51, 51, 81, 81, 111, 111, 177, 177, 243, 243, 345, 345, 447, 447, 609, 609, 771, 771, 993, 993, 1215, 1215, 1569, 1569, 1923, 1923, 2409, 2409, 2895, 2895, 3585, 3585, 4275, 4275, 5169, 5169, 6063, 6063, 7281, 7281]
数字之间的差距越来越大,所以可能是超线性的。另一方面,它似乎并没有变得足够快,成为指数级。也许是多项式。然后T2*n/Tn应该是有界的,但这似乎没有发生

>>> T(20)/T(10)
6.764705882352941
>>> T(50)/T(25)
13.955665024630543
>>> T(100)/T(50)
20.954112248499822
>>> T(200)/T(100)
35.791368360763435
这就是我开始替换的地方,看看会发生什么。让我们试试2^n

有更微妙的方法来修正界限,但任何形式的c^n似乎都是错误的想法:使用4^n+O1作为4^n/2+O1的界限是浪费的,这种直觉是由上面的实际数字支持的

让我来说明当我们试图用多项式(比如n^100)来约束时会发生什么

这看起来很有希望。对于所有的c>0,n^c/n=e^c*lnn/n的n->无穷大极限为1,并且从上面接近。我们所要做的就是得到一个界n^2/n*ln2>=1/1-4/n^2=1+4/n^2+O1/n^4,然后我们就设置好了。写

n^(c/n) = e^(c*ln(n)/n) >= 1 + c*ln(n)/n >= 1 + 4/n^2 + O(1/n^4) for large n.

虽然这个证明有一些不确定的地方,但它的复杂性似乎是拟多项式的。我证明的渐近表达式需要对所有n保持不变,除非它们不会,所以常数需要修补。这些细节往往单调乏味,没有教育意义。我们还应该证明一个匹配的下限,但上面的分析非常严密,我相信这是可以做到的。不过,我就到此为止。

这不是更像一道数学题吗?
T(0)  = 1 <= 4^0 = 1: check
T(1)  = 1 <= 4^1 = 4: check
T(n)  = T(n-2) + 2*T(n/2)
     <= 4^(n-2) + 4^(1/2 + n/2)
     <= 4^(n-2) + 4^(n - 1/2)  [since n - 1/2 >= 1/2 + n/2 for n >= 2]
     <= 4^n: check
T(n)  = T(n-2) + 2*T(n/2)
     <= (n-2)^100 + 2*(n/2)^100
      = n^100 + O(n^99) + 2^-99*n^100 + O(n^99): FAIL,
T(n)  = T(n-2) + 2*T(n/2)
     <= n^log(n-2) + 2*((n/2)^log(n/2))
      = n^(log(n) + log(1 - 2/n)) + 2*((n/2)^(log(n) - 1))
      = n^(log(n) + ln(1 - 2/n)/ln(2)) + 2*((n/2)^(log(n) - 1))
     <= n^(log(n) - 2/(n*ln(2))) + n^(log(n) - 1) / 2^(log(n) - 2)
        [by log(1 + x) <= x, often written 1 + x <= e^x]
      = n^log(n) / n^(2/(n*ln(2))) + 4*n^log(n) / n^2
n^(c/n) = e^(c*ln(n)/n) >= 1 + c*ln(n)/n >= 1 + 4/n^2 + O(1/n^4) for large n.