「不会」主定理

    假设现在你一个程序,共循环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}$

    撒花了

 

    (几乎全部来源于网络)

posted @ 2019-12-09 19:45  Yxsplayxs  阅读(224)  评论(3编辑  收藏  举报