计算具有相互依赖关系的递归算法的复杂度

Calculating complexity for recursive algorithm with codependent relations

我最近写了一个基于递归算法的程序,求解用 2x1 多米诺骨牌平铺 3xn 板的方法数:

F(n) = F(n-2) + 2*G(n-1)

G(n) = G(n-2) + F(n-1)

F(0) = 1, F(1) = 0, G(0) = 0, G(1) = 1

我尝试使用我知道的方法(例如递归树和扩展)来计算复杂度,但 none 得出了任何答案。其实我从来没有遇到过这种关系相互依赖的递归。

是我用错了方法,还是用错了方法?如果是这样,谁能提供解决方案?

编辑:我在 CS Stack Exchange 上问过同样的问题,那里也给出了很好的答案。 https://cs.stackexchange.com/questions/124514/calculating-complexity-for-recursive-algorithm-with-codependent-relations

它是指数级的。剩下要做的就是找到基地。首先定义一个向量值函数V(n)如下。

       ( F(n)   )
V(n) = ( F(n-1) )
       ( G(n)   )
       ( G(n-1) )

现在我们有 V(n) = A * V(n-1),其中 A 是一些矩阵。如果我没有搞砸的话,那个矩阵是:

[ 0 1 2 0 ]
[ 1 0 0 0 ]
[ 1 0 0 1 ]
[ 0 0 1 0 ]

根据您的初始条件:

       ( 1 )
V(1) = ( 0 )
       ( 1 )
       ( 0 )

现在我们有了以下规则。 V(n+1) = A^n * V(1)。如果您熟悉矩阵数学,就会知道这个指数的增长由主特征值决定。哪个(检查 https://www.dcode.fr/matrix-eigenvalues 后)恰好是 sqrt(2+sqrt(3)).

所以F(n) = O(sqrt(2+sqrt(3))^n).

(这背后的理论通常用斐波那契数列来解释,但它可以应用于任何差分方程。)