精确分析复杂的递推关系(n*logn*logn算法的由来)
设置a(n)=2*a(n/2)+n*logn,按照以前的相同的处理方式有:
b(k)=2*b(k-1)+2^k*k
Go
通过解答这个方程可以获得b(k)=A*k^2*2^k+B*k*2^k+C*2^k
现在做假设a(1)=1,a(2)=4,a(4)=16,(这些值是通过原始方程推的,当然第一个是假定的)
这样有:
A=1/4
B=-1/4
C=1/2
在这里特别值得提下的是在解这个线性方程的过程中发现C的值在中间过程中可以被消掉。也就是说A,B具有特定的关系,这种关系不因C的值而改变。
下面写程序来证明:
(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
(/ (log n)
(log 2))))))
(setq A 1/4)
(setq B -1/4)
(setq C 1/2)
(defun formula (n)
(+ (* A
(pow n 2)
(pow 2 n))
(* B
n
(pow 2 n))
(* C
(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)))
[11]> (test 20)
1.0013901E8
COMPARE
100139008
4.508877E7
COMPARE
45088768
2.0185088E7
COMPARE
20185088
8978432.0
COMPARE
8978432
3964928.0
COMPARE
3964928
1736704.0
COMPARE
1736704
753664.0
COMPARE
753664
323584.0
COMPARE
323584
137216.0
COMPARE
137216
57344.0
COMPARE
57344
23552.0
COMPARE
23552
9472.0
COMPARE
9472
3712.0
COMPARE
3712
1408.0
COMPARE
1408
512.0
COMPARE
512
176.0
COMPARE
176
56.0
COMPARE
56
16.0
COMPARE
16
4.0
COMPARE
4
1
COMPARE
1
OVER
OVER
从目前的这种状况看的话,时间复杂度还是由A决定的,随着n的变大,这种关系表现得越明显。
本文探讨了复杂的递推关系a(n)=2*a(n/2)+n*logn,通过求解得到b(k)=A*k^2*2^k+B*k*2^k+C*2^k,并利用数学推理确定了A、B、C的值。通过编程验证,展示了算法的时间复杂度主要由A决定,随着n增大,这一趋势愈发明显。
1万+

被折叠的 条评论
为什么被折叠?



