假设现在你一个程序,共循环n次,第一次所用时间为1,
第i次循环所用时间是前一次的x倍
为了好算假定x<1,那么可以猜到这个时间是收敛的
$T=\sum\limits_{i=0}^n x^i$
根据等比数列球和公式
$T=\frac{1-x^n}{1-x}$
当n趋于$\infty$时,
$T=\frac{1}{1-x}$
根据常识这个值在$x<0.9$时和$1$没什么区别
而且$n$根本不用到$\infty$而是很快就收敛到那个地方
例如$x=0.5$时$5$次就收敛到了$1.96(2)$
$x=0.7$时$10$次$3.26(3.33)$
即使$x=0.99$也在$500$次是就到了$99.34(100)$
所以在有限次递归的程序里,
近似可以看成整个程序的复杂度就是
第一次循环的复杂度与一个常数相乘
(哪怕$x$开到$0.99$这个常数才到$100$)
反过来,如果每一次循环都是前一次的$x$倍$(x>1)$
近似可以看成最后一层的复杂度与一个常数相乘,
有了这个认识可以来看主定理
现有一个递归问题,每个大小为n的节点需要$n^d$的复杂度
然后分裂成$a$个大小为$n/b$的子节点,当大小为1时回溯
复杂度是什么亚子?
$T=\sum\limits_{i=0}^{log_b n} a^i * (\frac{n}{b^i})^d$
$T=n^d * \sum\limits_{i=0}^{log_b n} (\frac{a}{b^d})^i$
这时需要讨论$a$和$b^d$的大小关系了
$a==b^d:$
$T=n^d log_b n$
$a<b^d:$(只关心第一层复杂度)
$T=n^d$
$a>b^d:$
$T=n^d (\frac{a}{b^d})^{log_b n}$
$T=n^d \frac{a^log}{b^{log*d}}$
$T=n^d \frac{a^log}{n^d}$
$T=a^{log_b n}=n^{log_b a}$
最后一步是怎么做到的
由于$log_b a * log_b n == log_b n * log_b a$
所以$b^{log_b a * log_b n}==b^{log_b n * log_b a}$
又因为$b^{log_b num}==num$
所以$a^{log_b n}==n^{log_b a}$
撒花了
(几乎全部来源于网络)
来源:https://www.cnblogs.com/yxsplayxs/p/12013060.html