zoukankan      html  css  js  c++  java
  • 【数据结构与算法】时间复杂度和空间复杂度

    一、阶数比较

    时间复杂度判断理论: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

  • 相关阅读:
    Git常用命令
    C++ 四种强制类型转换
    Linux系统日志及日志分析
    C/C++中的getline函数总结:
    标准C++中的string类的用法总结
    C++中map的基本操作和使用;
    一个C++类的注释:
    C++ 中宏的使用 --来自:http://blog.csdn.net/hgl868/article/details/7058906
    c++ 的vector
    c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
  • 原文地址:https://www.cnblogs.com/dream-to-pku/p/11471412.html
Copyright © 2011-2022 走看看