精确分析复杂的递推关系(nlogn算法的初始条件)
这一次将改变初始条件状态,使得A将占有主要的时间。从而时间复杂度不再是n*logn,而是n;
这样可以获得b(k)=A*2^k+B*k*2^k
这里先设置A=100,然后再来定B的值,有:
100*4+B*2*4= 2* {100*2+B*1*2 } +2
Go
B*8=B*4+2
Go
B=1/2
从这里可以看出不管A的值为多少,B的值都是1/2????
这里可以得到a(1)=100*2+1/2*1*2=201
下面写程序来证明:
(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)
201
(+ (* 2
(expr (/ n
2)))
n)))
(setq A 100)
(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)))
[17]> (test 10)
107520
COMPARE
107520
53504
COMPARE
53504
26624
COMPARE
26624
13248
COMPARE
13248
6592
COMPARE
6592
3280
COMPARE
3280
1632
COMPARE
1632
812
COMPARE
812
404
COMPARE
404
201
COMPARE
201
OVER
OVER
可以看到用公式算的结果与用程序算的结果是一样的。也就是说初始值能够影响最终的状态,这同样也能明白为什么算法书籍上总是要假定a(1)=O(1)的原因了,如果不做这样的假定,公式就有可能变成我们现在所讨论的状态了。