精确分析复杂的递推关系(多项式函数算法形式改变)
设置a(n)=8*a(n-1)+3^n+7^n,按照以前的相同的处理方式有:
a(n-1)=8*a(n-2)+3^(n-1)+7^(n-1)
Go
上面两个式子(1)-7*(2)有:
a(n)-7*a(n-1)=8*{ a(n-1)- 7* a(n-2) } + 3^n - 7* 3^(n-1)
化简有:
a(n)-7*a(n-1)=8*{ a(n-1)- 7* a(n-2) } + - 4* 3^(n-1)
从这里可以看出其中将只存在一个多项式函数,按照这种思维可以获得a(n)的通项公式:
a(n)=A*7^n+B*8^n+C*3^n
在这里先假定初始值为a(1),有如下方程组合:
A*7+B*8+C*3=a(1)
A*7^2+B*8^2+C*3^2=8*a(1)+7^2+3^2
A*7^3+B*8^3+C*3^3=8* { 5*a(1)+7^2+3^2 } +7^3+3^3
GO
按照如下方式来解线性方程,与前面日志相比这里有了变化:
(2)-(1)*8有:
A*7*(-1)+C*3*(-5)=7^2+3^2
(3)-(2)*8有:
A*7^2*(-1)+C*3^2*(-5)=7^3+3^3
从这里可以看出A与C的关系还是固定的,并且可以解得
A=-7
C=-5/2
回代有a(1)=8*B-49-9/5
这里假设B=100
下面写程序来证明:
(defun pow (num count)
(if (or (> count 1) (eq count 1) )
(* num
(pow num
(- count 1) ) )
1))
(defun slayer ( count)
(if (or (> count 1) (eq count 1) )
(* count
(slayer
(- count 1) ) )
1))
(defun expr (n)
(if (eq n 1)
(- (* 8.0
B)
49
9/5)
(+ (* 8
(expr (- n
1)))
(pow 3
n)
(pow 7
n))))
(setq A -7)
(setq B 100)
(setq C -3/5)
(defun formula (n)
(+ (* A
(pow 7 n))
(* B
(pow 8.0 n))
(* C
(pow 3 n))))
(defun test (n)
(if (> n 0)
(progn
(print (expr n))
(print 'compare)
(print (formula n))
(test (- n 1)))
(print 'over)))
[64]> (test 10)
1.0539682E11
COMPARE
1.0539682E11
1.3139286E10
COMPARE
1.3139285E10
1.6373641E9
COMPARE
1.637364E9
2.0394909E8
COMPARE
2.0394909E8
2.539042E7
COMPARE
2.5390418E7
3159005.3
COMPARE
3159005.3
392744.4
COMPARE
392744.4
48782.8
COMPARE
48782.8
6051.6
COMPARE
6051.6
749.2
COMPARE
749.2
OVER
OVER
这其中有个很微妙的逻辑,本来我的计划是希望能将A变为0,但在这里不行,因为它与C的关系是固定的,如果要求a(1)为正数,那么B必须为正数,这样因为8的指数最大,所以时间复杂度由它决定了。
在这个形式上的变化过程中,我们可以获得很多启示,特别是其中的AC间的固定关系,还有A,C的符号变化规则。。。这些包含了所有的信息,决定了最终的时间复杂度。