• 【数据结构与算法】时间复杂度和空间复杂度


    一、阶数比较

    时间复杂度判断理论:O(1) <= O(log2(n)) <= O(n) <= O(n*log2(n)) <= O(n^2) <=...<=O(n^k) <= O(2^n)

    二、计算方法

    用常数1代替运行时间中的所有加法常数

    修改后的运行次数中只保留最高阶项

    去除最高阶项的系数

    三、常见的求时间复杂度例子

    1、常数阶

    int a=1;
    int b=a+2;

    这种只执行常数规模的情况时间复杂度是O(1)

    2、对数阶(O(log2n))

    1 int n=100;
    2 int i=1;
    3 while(i<=n){
    4 i=i*1;
    5 }

    在while循环里每次都将i乘以2,i距离n越来越近,如果循环x次之后i大于n此时这个循环退出也就是说2的x次方等于n那么x=log2n也就是说当循环log2n次以后,这个代码就结束了,此时这个短发的时间复杂度是O(log2n),o(LOG2n)的这个n是随着代码变化的,如果里面不是2倍递增则将发生相应变化eg:i=i*3 则时间复杂度为O(log3n)

    3、线性阶

    1 int j=0;
    2 for(int i=1;i<=n;i++){
    3 j++;
    4 }

    这个代码,for循环里面的代码会执行n编,因此它消耗的时间是随着n的变化而变化O(n)

    4、线性对数阶O(nlogN)

    1 int j=0;
    2 for(int i=1;i<=n;i++){
    3 j=1;
    4 while(j<n){
    5 j=j*2;
    6 }
    7 }

    线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。

    5、平方阶O(n2)

    1 int a=0;
    2 for(int i=1;i<=n;i++){
    3     for(int j=1;j<=n;j++){
    4        a=a+1;
    5       j++;
    6     }
    7 }

    如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²),这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(nn),即 O(n²) 如果将其中一层循环的n改成m,那它的时间复杂度就变成了 O(mn)

    1 for(i=o;i<n;i++){
    2 
    3         for(j=i;j<n;j++){
    4           
    5 }       
    6 
    7  }

     这里分析下,当i=0的时候,J可以循环N次,i=1的时候,J循环N-1次,所以得出:

      n+n-1+n-2+.....+1=(n+1)*n/2=N^2/2+N/2;也是O(n2)

    6、k次方阶

    同2次方阶

      

    https://www.cnblogs.com/coder-programming/p/11093608.html

  • 相关阅读:
    P1659 [国家集训队]拉拉队排练
    manacher小结
    P4555 [国家集训队]最长双回文串
    P3649 [APIO2014]回文串
    P3899 [湖南集训]谈笑风生
    插头dp练习
    luoguP3066 [USACO12DEC]逃跑的BarnRunning
    luoguP3769 [CH弱省胡策R2]TATT
    android 广播,manifest.xml注册,代码编写
    *.db-journal 是什么(android sqlite )数据库删除缓存
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/11471412.html
Copyright © 2020-2023  润新知