• 算法-复杂度


    大O表示法 

    评估算法性能,主要评估的问题是输入规模n与元素的访问次数f(n)的关系

    O(g(n)),g(n)是这个算法的复杂度上界。

    例如O(n^2),算法的最大消耗就是n^2,因为评估是往往把低阶项和常用省略。

    所谓复杂度就是看循环内的语句执行次数的量级。

    理解对数

    2^4 = 16

    以2为底数,增长10次就到达了1024

    n^2就是整体取值的趋势

    4 = log2^16,表示16以2为底数减少,减少4次为1

    也可表示当指数以log2^n的速度增长时,那么对数整体以n^2的速度增长

    从计算的角度理解复杂度

    如果计算机一秒能处理O(n)的运算10的八次方次,那么一秒能处理O(n^2)的运算就为10的四次方次,一秒能处理O(n^3)的运算为500次。CPU处理的运算的次数是一样的,但是解决的问题的多少是不同的,能解决O(n)类型的问题10的八次方个的话,只能解决O(n^3)类型的问题500个,如果能将O(n^3)的问题转换为O(n)类型的问题,那么问题的解决效率将大大提高。

    问题的复杂度高,意味着处理一个问题将花费的时间长,单位时间内计算的单位就很小,也就是计算的很慢。

     相同的问题,如果复杂度是n,意味着有n的数量级次计算,如果是n^3,意味着有n^3数量级次计算。

    递归形式算法的性能分析

     求n的阶乘

    1. static int f1(int n){
    2. if(n==1)
    3. return 1;
    4. return n*f1(n-1);
    5. }

    乘n是常数阶运算O(1),T(n)=O(1)+T(n-1),每次运算都是O(1),一共有n次,就是n*O(1),得O(n)。

    斐波那契

    1. public static int f1(int n){
    2. if(n==1 || n==2) return 1;
    3. return f1(n-1) + f1(n-2);
    4. }

    T(n) = T(n-1)+T(n-2)+O(1)

                约等于  2*T(n-1)+O(1)= 2*(T(n-2)+T(n-3)+O(1))+O(1)

                约等于 2*2*T(n-2)+3O(1)

                减多少次就乘多少个2

                 最后得2^n

  • 相关阅读:
    八个开源免费单点登录(SSO)系统
    机器人方向的刚性需求→个人思考←
    Bootstrap警告和轮播插件详解【前端Bootstrap框架】
    matlab将十六进制转换为十进制(hex2dec函数)
    【FAQ】一则关于PYTHON与SHELL处理文本乱码的问题
    js语法(es6)
    ModStartBlog v8.2.0 独立友情链接页面,博客列表样式优化
    网络地址转换NAT
    一文深入底层分析Redis对象结构
    slam资料汇总
  • 原文地址:https://blog.csdn.net/weixin_52972575/article/details/125790717