白话数据结构和算法02:3分钟搞明白,什么是大O时间复杂度,如何计算大O时间复杂度

微信关注公众号:程序员成长软技能  。日拱一卒,功不唐捐!

前文总结中说到:数据结构和算法主要是解决如何低成本(少存储空间&少查找、写入时间)的操作数据的问题,也就是要在能解决问题的前提下,“少空间”和“少时间”的解决问题。那么如何比较不同方法的优劣,也就是如何比较不同方法使用空间的大小和运行时间的长短呢?常用方法有两种:事后统计法和事前估算法。

事后统计法

所谓事后统计法,就是运行算法后,统计算法执行的时间和使用的内存空间。这种方法有时候也是可用的,但存在以下缺点:

  • 需要先编写不同的算法,然后统计比对,浪费开发人力和时间成本

  • 算法依赖的运行环境以及环境的状态,可能会影响到算法的效果

  • 测试数据准备不当,比如量太小,高效率算法的效果可能体现不出来

事前估算法

由于上边所述“事后统计法”的缺点,所以需要有个不需要执行代码,甚至不需要编写代码(使用伪代码),也不用准备测试数据,就可以事前粗略估算的方法。而算法的优劣,主要是从所占用的「时间」和「空间」两个维度去考量。
时间维度:指执行当前算法所消耗的时间,通常用「时间复杂度」来描述。
空间维度:指执行当前算法需要占用的内存空间,通常用「空间复杂度」来描述。
所以,这种事前估算法就是是下边所要说的,时间复杂度、空间复杂度估算法。

时间复杂度

站在CPU的角度看,算法的每段代码都执行在"取数-计算-写数"的操作,虽然每个操作的具体执行时间不尽相同,但为了方便估计,我们假设每行代码的执行时间都是一样的,在此假设下,算法的执行总时间就和执行代码的行数成正比了。那么,如何计算执行代码的行数呢?

​执行行数计算方法

示例1:计算1-100所有数字之和, 我们设计两种算法:

算法1

1    public int getSum1(int n ){
2        int sum=0;
3        for (int i = 1; i < n ; i++) {
4            sum += i;
5        }
6        return  sum;
7    }

算法2

1    public int getSum2(int n ){
2        int sum = (1+n)*n/2;
3        return  sum;
4    }

如上,两种算法都可以达到求1-100所有数字之和的目的,但两种算法执行的代码行数是不同的。算法1编写代码一共7行,但是因为3、4、5因为循环的原因会执行n遍,所以执行代码行数一共是4+3n。算法2编写代码一共4行,并且是顺序没有循环的执行,所以执行代码行数和方法参数n没有关系,一共是4行。从该例中可以总结如下计算方法:

  1. 非循环、分支情况:使用加法,即将顺序代码行数和分支执行相关代码行数加和

  2. 循环情况:使用乘法,执行行数一般和数据量n有关系,即将数据量n和循环内的执行代码行数相乘(多层循环,累乘)

大O复杂度表示法

从示例1可以看出,执行代码行数与数据量n存在某个关系函数,比如叫做执行行数公式,此时算法1执行行数公式是:f(n)=4+3n,算法2执行行数公式是:f(n)=4。而算法执行时间和执行代码行数成正比,大家一般习惯使用下边公式表达,也就是大O复杂度表示法:

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

  • n 表示数据的大小

  • T(n) 表示算法执行的时间

  • f(n) 表示算法执行代码的行数

  • O表示 T(n) 与 f(n) 存在正比关系

其实,大 O 时间复杂度实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度(asymptotic time complexity),简称时间复杂度。比如在算法中n很大时,10万、1亿等,执行行数公式中的 常数、低阶、系数三部分对“增长趋势”的影响很小,甚至都可以忽略,而只需要记录一个最大量级就可以了。

大O时间复杂度计算方法

如上所述,常数、低阶、系数三部分对“增长趋势”的影响可以忽略,而只保留最高项,所以计算方法如下(以含2阶的为例):

  1. 用常数 1 代公式中的常数项
    =>

  2. 只保留最高阶项
     =>

  3. 去除最高阶项的系数
    => =>

所以,用大 O 表示法表示示例1中算法复杂度的话,算法1:O(n),算法2:O(1)。

 

往期精彩回顾

  1. 《90后程序员职场报告》:平均月薪近20K,每6个程序员就有1个是女性

  2. 手把手教你画架构图,看一次就会了

  3. 8种最坑的SQL错误用法,第一个就很坑?

  4. 一个公司有没有未来,看它的老员工就知道了

  5. 【荐读】你靠什么在单位立足?

你可能感兴趣的:(数据结构,算法)