精确分析复杂的递推关系(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,这点表现得更加清楚。