精确分析复杂的递推关系(改变初始值)
设置a(n)=m*a(n/2)+n*a(n/4)+n^2
现在推导当m,n满足一定的关系的时候,时间复杂度不再由n^2决定。
按照前面相同的变换方式有:
a(k)=m*a(k-1)+n*a(k-2)+n^2
特征方程是x^2-m*x-n=0
这样假设其中的大的解{m+sqrt(m^2+4*n)}/2>4
现在假设m=3,这样有3+sqrt(9+4*n)>8
Go
sqrt(9+4*n)>5
Go
n>4
现在就假设n=5;
现在求a(n)的精确通项公式;
按照以前的惯例,设置n=2^k,则有
a(k)=a(k-1)+a(k-2)+(2^k)^2
用方法求得a(k)=A*4^k+B*(3+sqrt(29)/2)^k+C*(3-sqrt(29)/2)^k
在这里我们先假定A=B=C=1,然后再反推a(1),a(2),a(3)的值。
从k的角度解线性方程组,正向推导可以解答
a(1)=formula(1)=7,
a(2)=formula(2)=35,
a(3)=formula(3)=136
如果按照这种直接取的方式,是不能保证a(1),a(2),a(3)拥有a(n)=m*a(n/2)+n*a(n/4)+n^2这种关系的。所以需要做假定;
设置A=-4.0001,C=0,求B的值,
因为必须满足关系formula(3)=5*formula(1)+3*formula(2)+2^(3-1)^2,
所以下面写个程序求C的值。
对这个关系formula(3)=5*formula(1)+3*formula(2)+n^2做下变形有:
formulatest(3)+(* b (pow x1 3))=5*{formulatest(1)+(* b (pow x1 1))}+
3*{formulatest(2)+(* b (pow x1 2))} + 4^2
Go
(setq temp (- (formulatest 3)
(* 5
(formulatest 1))
(* 3
(formulatest 2))
16))
得到a的值为
(setq b (/ temp
(+ (* 5
(pow x1 1))
(* 3
(pow x1 2))
(* -1
(pow x1 3)))))
下面写程序来证明:
(setq x1 (/ (+ 3
(sqrt 29))
2))
(setq x2 (/ (- 3
(sqrt 29))
2))
[345]> a
-4.0001
[346]> b
52.0
[347]> c
0
[348]> (formula 1)
202.01387
[349]> (formula 2)
850.0412
[350]> (formula 3)
3576.193
(defun formulatest (n)
(+ (* a (pow 4 n) )
(* c (pow x2 n))))
(defun formula (n)
(+ (* a (pow 4 n) )
(* b (pow x1 n))
(* c (pow x2 n))))
(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)
202.01387
(if (eq n 2)
850.0412
(+ (* 3
(expr (/ n
2) ))
(* 5
(expr (/ n
4)))
(pow n
2)))))
(defun test (n)
(if (> n 0)
(progn
(print (expr (pow 2 (1- n))))
(print 'compare)
(print (formula n))
(print (/ (formula n) (* b (pow x1 n) )) )
(test (- n 1)))
(print 'over)))
[351]> (test 10)
8.3066384E7
COMPARE
8.306639E7
0.9519325
1.9764536E7
COMPARE
1.9764538E7
0.9496183
4702126.0
COMPARE
4702126.5
0.9471926
1118524.3
COMPARE
1118524.4
0.9446502
266033.88
COMPARE
266033.9
0.9419853
63265.316
COMPARE
63265.32
0.9391922
15042.784
COMPARE
15042.786
0.9362646
3576.1929
COMPARE
3576.193
0.93319595
850.0412
COMPARE
850.0412
0.9299797
202.01387
COMPARE
202.01387
0.9266085
OVER
OVER
注意其中的比率一直都在0.92左右,也就是说主要是由x2决定的,我们的假定获得了实现。
其中有一个特别特别重要的地方,那就是关于a的取值,这里的a的值是经过无数次的实验之后发现,只有当a取这个-4的非常小范围的飘动的值时候,a的值才会和b的值比较接近。这种情况可以和上一篇中的类似情况做一个比较说明,前面a=-4,b=4.485563,但在这里如果a=-4的化,b=0,因为已经假定c=0,不利于做比率的判定实验,所以对a的值稍微做了调整。
下面有a 和b的关系比较程序:
(defun formulatestex (a c n)
(+ (* a (pow 4 n) )
(* c (pow x2 n))))
(defun mid (a )
(- (formulatestex a 0 3)
(* 5
(formulatestex a 0 1))
(* 3
(formulatestex a 0 2))
16))
(defun result (a)
(/ (mid a)
(+ (* 5
(pow x1 1))
(* 3
(pow x1 2))
(* -1
(pow x1 3)))))
(defun compare (a)
(if (> a -4.1)
(progn
(print a)
(print 'compare)
(print (result a))
(compare (- a 0.001)))
(print 'over)))
(compare -4)
-4.002
COMPARE
1048.0
-4.003
COMPARE
1572.0
-4.0039997
COMPARE
2096.0
-4.0049996
COMPARE
2622.0
-4.0059996
COMPARE
3146.0
-4.0069995
COMPARE
3668.0
-4.0079994
COMPARE
4194.0
-4.0089993
COMPARE
4720.0
-4.0099993
COMPARE
5242.0
...
...
-4.0179987
COMPARE
9436.0
-4.0189986
COMPARE
9960.0
-4.0199986
COMPARE
10484.0
-4.0209985
COMPARE
11010.0
-4.0219984
COMPARE
11534.0
-4.0229983
COMPARE
12056.0
-4.0239983
COMPARE
12582.0
-4.024998
COMPARE
13108.0
-4.025998
COMPARE
13630.0
-4.026998
COMPARE
14154.0
-4.027998
COMPARE
14680.0
-4.028998
COMPARE
15204.0
-4.029998
COMPARE
15728.0
-4.0309978
COMPARE
16252.0
-4.0319977
COMPARE
16776.0
-4.0329976
COMPARE
17300.0
...
...
-4.0509963
COMPARE
26736.0
-4.051996
COMPARE
27260.0
-4.052996
COMPARE
27786.0
-4.053996
COMPARE
28310.0
-4.054996
COMPARE
28832.0
-4.055996
COMPARE
29358.0
-4.056996
COMPARE
29884.0
-4.057996
COMPARE
30406.0
-4.0589957
COMPARE
30930.0
-4.0599957
COMPARE
31456.0
-4.0609956
COMPARE
31980.0
-4.0619955
COMPARE
32504.0
-4.0629954
COMPARE
33028.0
...
...
-4.098993
COMPARE
51900.0
-4.0999928
COMPARE
52424.0
OVER
OVER
特别的检查如下几个值就能发现这会总比较的意义;
[368]> (result -4)
0
[369]> (result -5)
524288.0
[370]> (result -6)
1048576.0
[371]> (result -7)
1572864.0
[372]> (result -8)
2097152.0
[373]> (result -9)
2621440.0
从这个角度来说,这种方法更具有一般性。