精确分析复杂的递推关系(nlogn算法的由来)

来源:互联网 发布:如果马谡不失街亭 知乎 编辑:程序博客网 时间:2024/05/10 12:24

精确分析复杂的递推关系(nlogn算法的由来)

设置a(n)=2*a(n/2)+n,按照以前的相同的处理方式有:

b(k)=2*b(k-1)+2^k

Go

b(k-1)=2*b(k-2)+2^(k-1)

这样可以获得b(k)=A*2^k+B*k*2^k

在这里先设置初始值,设置a(1)=1,则a(2)=2*1+2=4

故有:

A*2+B*1*2=1

A*2^2+B*2*2^2=4

Go

A=0

B=1/2

 

 

下面写程序来证明:

(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)

       1    

         (+  (*  2

                 (expr (/  n  

                           2)))

             n)))

 

(setq  A  0)

(setq  B  1/2)

 

(defun  formula (n)

(+  (*   A 

         (pow  2  n))

    (*   B

         n

         (pow  2  n)))) 

 

 

(defun  test (n)

(if (> n 0)

  (progn 

       (print (expr  (pow 2 (1- n))))

       (print  'compare)

       (print (formula n))   

       (test (- n 1)))

  (print 'over)))

 

[8]> (test  10

 

5120

COMPARE

5120

2304

COMPARE

2304

1024

COMPARE

1024

448

COMPARE

448

192

COMPARE

192

80

COMPARE

80

32

COMPARE

32

12

COMPARE

12

4

COMPARE

4

1

COMPARE

1

OVER

OVER

从这里b(k)=A*2^k+B*k*2^k也能看出,其中B*k*2^k将起主要作用,特别是在目前的情况下,因为A=0,这点表现得更加清楚。

原创粉丝点击