时间复杂度详解+例题分析

目录

导语简言

1.what-什么是时间复杂度

2.How-如何表示时间复杂度--大O表示法

概念

表达式推导

3.example-例题解析


导语简言

1.算法时间复杂度:算法执行时间与算法的语句执行次数成正比,算法中基本操作语句的执行次数的数量级模型,就是渐进时间复杂度,简称时间复杂度。

2.大O表示法:O(f(n)=T(n),它表示随问题规模n的增大,算法的执行时间增长率和f(n)增长率成正比,这称作算法的渐进时间复杂度。用极限的概念,突出时间增长率的决定因素,简化出阶数模型,略去系数等非主要因素,来表述渐进时间复杂度。

3.example简单例题,分析不同阶数的复杂度。

一道题快速完成大O表示的分析过程(1.归纳语句执行次数的最高数量阶,2.略去系数)

T(n)---f(n)---O(f(n))  大O去常数,凸显级数

public void On(int num){
        int i=0;
        while (i<num){
            i+=2;
        }
    }

T(n) = n/2 +1 (while块的语句执行 num/2次,再加上while外面的语句)

f(n) = n/2  (当n趋于无穷大,常数次没有影响了,可忽略)

大O去系数 O(n)

1.what-什么是时间复杂度

通俗说--时间复杂度是 一个通过定性描述算法语句执行次数,来预估算法运行时间的函数,自变量为-问题规模n。

描述出语句执行次数的函数关系,略去常系数就是时间复杂度了

表示算法执行效率

描述 算法的执行时间 与  输入值 之间的关系

定义:

算法中基本语句重复执行次数是问题规模n的某个函数T(n)=O(f(n)),它表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称 渐近时间复杂度,简称时间复杂度。

解释:

设计算法时需要考虑两个方面

  • 时间资源消耗
  • 空间资源占用

然而大部分情况下,两种资源消耗量是负相关的,什么空间换时间,时间换空间之类的 ,所以我们设计算法时需要找到一个平衡点,就是性价比最高的点。性(时间效率)/价(空间资源)。

我们为什么需要时间复杂度呢?

要想知道一个算法的运行时间,我们首先想到的是把算法实现出来,运行一遍,查看使用时间,这就是事后统计法

这种方式首先是得在算法实现后才能知道,如果不合适,还得重写,非常浪费人力成本,木已成舟,意义几乎没有。

再者,算法实际运行使用时间,受机器配置性能的影响,其结果不适合,作为普适数据判定算法。综上两点来说,事后统计法不太合适。

我们要的就是在设计阶段,能够通过一种规则,判断出算法的时间使用情况,并且结果不受具体机器限制,进而能够指导后续算法设计。这就是我们需要的-事前分析估计法。

所以

时间复杂度,就是适应上述要求,在忽略具体机器配置和性能差异,假设运行在理想模型的情况下,判断出算法时间消耗的方法。

理想模型,非数学莫属了

所以时间复杂度从定义上来说,就是一个以问题规模n为自变量,时间消耗为应变量的函数模型。而且结果不要求细致的表示时间,只要求大体级数表示就好。

那结果表示上尽量忽略细节,抽象出简洁模型,要不然一长串的自变量表达式也不太合适呀,所以就需要一定的表示规则来表示最后的时间复杂度结果。

作为一个普遍使用的工具,时间复杂度的表示也必须有共识性的统一规定了,下面介绍具体时间复杂度的表示方法。

2.How-如何表示时间复杂度--大O表示法

概念

大O表示法的字母O代表order(阶数),用大O符号描述函数通常只提供函数增长率的一个上界。称作 算法的渐进时间复杂度,简称为时间复杂度。

时间复杂度因其高抽象性,只作为阶数表示,其量级表示比较固定,常见的有以下几种。

  • 常数阶O(1)
  • 对数阶O(logN)
  • 线性阶O(n)
  • 线性对数阶O(nlogN)
  • 平方阶O(n²)
  • 立方阶O(n³)
  • K次方阶O(n^k)
  • 指数阶(2^n)

从上至下依次的时间复杂度越来越大,执行的效率越来越低。

表达式推导

我们回到问题初衷,为了分析估计算法执行所用的时间。

假设在理想模型上,执行一次简单语句的时间相同,为单位时间,那么算法的总时间就是

算法运行时间= 语句执行次数×语句执行一次的时间

除了一般顺序流程里面的每条语句一次,这种简单实现之外,大部分算法可能可能会用到循环,递归等实现,这样的话,算法内的语句执行次数,也是一个随着问题规模n变化的函数,记作T(n)。

进而分析T(n)随n的变化,确定T(n)的数量级。

每条语句执行的单位时间为常数,我们不必去关心,我们只需要确定执行次数T(n)的数量级模型,

也就能确定算法时间的数量级模型。

算法的渐进时间复杂度可以表示为

O(f(n)) = T(n)

T(n)是语句的执行次数,f(n)是T(n)的渐进函数,也是问题规模n的一个函数,O表示正比例关系

可以理解为大O表示的渐进时间复杂度就是对于T(n)的数量级模型表示。

关于f(n)的说明,

当n趋于无穷大时,存在T(n)的渐进函数T(n)/f(n) = C(常数)

O-order数量级表示,O(f(n))=C*f(n)=T(n)

例如

T(n)= 5n^{3}+3n^{2}+n+6

f(n) = n^{3}

当n区域无穷大时,T(n)/f(n) = 5,5f(n) = O(f(n)) = T(n)

渐进时间复杂度为 O(n^3^)

3.example-例题解析

O(1)--输入值作为值运算,不影响语句执行次数

public void O1(int num){
        int copy = num;
        int product = num*2;
        System.out.println(copy+product);
    }

O(log n)--2^f(n)^=T(n) f(n) = log~2~n   T(n) = O(log n)

public void OlogN(int num){
        int count = 0;
        for (int i=1;i<num;i=i*2){
            count++;
        }
        System.out.println(count);
    }

O(n)

public void ON(int num){
        int count = 0;
        for (int i=0;i<num;i++){
            count++;
        }
        System.out.println(count);
    }

O(nlogn)

public void ONlogn(int num){
        int count = 0;
        for (int i=0;i<num;i++){
            for(int j=1;j<num;j=j*2){
                count++;
            }
        }
        System.out.println(count);
    }

O(n²)

public void ONn(int num){
        int count = 0;
        for (int i=0;i<num;i++){
            for(int j=0;j<num;j++){
                count++;
            }
        }
        System.out.println(count);
    }

例题

1. O(1)  虽然n会影响语句执行的次数,但是 是在常数有限范围内影响的,没有无限的增长关系

public void Oc(int n){
        int i=10;
        int k=100;
        do{
            if (i<n){
                break;
            }
            i++;
        }while (i<k);
        System.out.println(i);
    }

2.O(n^{1/3})

public void Onk(int n){
        int y=0;
        while (y*y*y <=n){
            y++;
        }
    }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值