程序的时间复杂度

一、概念

  1. 时间复杂度:随着n的不断变化,T(n)/f(n)逐渐趋近于一个常数,我们使用O(f(n))来表示时间复杂度

    我的理解就是:
    时间复杂度就是: 程序循环体内,执行次数最多的语句的执行次数,若并列的循环,则将并列循环的时间复杂度相加。
    时间复杂度排序:
    Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

  2. 步骤:

    1.首先找到执行次数最多的基本语句,一般都是在最内层循环的循环体内
    2.查看该基本语句执行的次数
    3.对于并列循环,则把复杂度相加,得出最后该程序的时间复杂度
    (保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数)

  3. 示例:

    时间复杂度:O(1)
    核心:n是不变的,就执行固定次数,有限的;
    Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是Ο(1)

    int sum=0,n=100;           //执行一次
    sum=(1+n)*n/2;             //执行一次
    System.out.println(sum);   //执行一次 

时间复杂度:O(log2n)
i一次增长2倍,也就是说,超过n需要执行多少次语句,即为时间复杂度。通过计算2^i=n,得到i=logn.所以时间复杂度为对数阶O(logn).

int i = 1;
while(i < n){
i * = 2;
} 

时间复杂度:O(n)
n是因为一次增长一步,n次后执行完了这条语句,所以为O(n)

例子1:
    int b =0;
    for(int i = 0; i < n; i++){
    b++;
    } 
例子2int i,sum=0,n=100;     //执行一次
    for(i=1;i<=n;i++)      //执行n+1次
    {
        sum=sum+i;         //执行n次
    }

    System.out.println(sum);  //执行一次  

时间复杂度:O(n2)

 例子1:
  for (i=1; i<=n; i++){
  for (j=1; j<=n; j++)
  {x++;}
  }
例子2int i,j,x=0,sum=0,n=100;     //执行一次
    for(i=1;i<=n;i++){           //执行n+1次
        for(j=1;j<=n;j++){       //执行n*(n+1)次
            x++;                 //执行n*n次
            sum=sum+x;
        }
    }
    System.out.println(sum);   //执行一次 


这段代码执行了2n^2+2n+3次,即O(n2),随着这段代码重复被执行的次数增多,随着n值增大,时间效率会爆炸式增长。

小结:

  1. O(1)常数阶:每条语句的频度都是1,算法的执行时间不随着问题规模n增大而增长,即使有上千条语句,其执行时间也不过是一个比较大的常数。
  2. O(n)线性阶:有一个n次循环的循环语句。随着n增长执行时间线性增长。
  3. O(n^2)平方阶:循环中嵌套一个循环的情况。
  4. 时间复杂度大小体现:
    这里写图片描述

参考:https://blog.youkuaiyun.com/c99463904/article/details/77414163

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值