精确分析复杂的递推关系(改变初始值)

精确分析复杂的递推关系(改变初始值)

设置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

从这个角度来说,这种方法更具有一般性。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值