zoukankan      html  css  js  c++  java
  • 计算算法时间复杂度的主方法的一种较为简洁的记忆方法

      这阵子在认真地看着算法导论,之前看到第四章计算分治法的时间复杂度的计算方法被称为“主方法”,运用这个主方法可以快速地口算出分治算法的递归式的时间复杂度,以下给出算法导论里关于主方法的描述吧,我就直接截图

    不得不说,算法导论是一本非常偏向于数学的算法书,里面的对于各种算法结论的正确性大都有着严格的数学上的推导。之前对于主方法的描述只是大略地看了一下,看是看懂了,但是当时没有刻意将这个结论记下来,当我往后看遇到递归式求解部分的时候发觉还是忘记了主方法的求解过程,只能模糊记得部分而已,昨天晚上再复习的时候,发觉这个描述可以不用带有让人烦恼的 ε ,我是采用了如下的记忆方法~

          对于递归式 $T(n) = a * T(n/b) + f(n)$

           1.我们不妨设$f(n) = n^k$,   我们可以求出$ k$ 的值

           2.我们再求出$log_{b} a$;

              3.比较$log_{b} a$ 与$ k$的大小

           4.如果$k >log_{b} a$, 有 $T(n) = Θ(f(n))$;  如果$ k <log_{b} a$  有 $T(n) = Theta (n^(log_{b}a))$;如果$k = log_{b} a$

    则$T(n) = Theta (lg n * n^(log_{b}a))$;

    比如$T(n) = 9*T(n/3) + n$;

    有 $log_{3} 9 = 2  $ ;$ f(n) = n^1$ 得到 $k = 1$   有$ 2 > 1$ 即得到 $T(n) = Θ(n^2)$;

    这样的方法应该会简单点吧~  我只是觉得算导里面每次对于递归式的求解都要拿一个ε来说事总是有点不爽的感觉,虽然这种方法失去了数学上的严谨证明.

    额 继续努力吧 骚年~~~
  • 相关阅读:
    C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类
    [AngularJS + Webpack] Requiring CSS & Preprocessors
    [AngularJS + Webpack] Requiring Templates
    [AngularJS + Webpack] ES6 with BabelJS
    [Flux] 3. Actions
    [RxJS] Aggregating Streams With Reduce And Scan using RxJS
    [RxJS] map vs flatMap
    [RxJS] Stream Processing With RxJS vs Array Higher-Order Functions
    [MODx] Solve cannot upload large file
    [React + webpack] hjs-webpack
  • 原文地址:https://www.cnblogs.com/jusonalien/p/3930776.html
Copyright © 2011-2022 走看看