「主定理」

不问归期 提交于 2019-12-09 20:03:08

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

    撒花了

 

    (几乎全部来源于网络)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!