一、定义

时间和空间是程序的一个硬性指标,一个用来衡量 代码执行的速度 ,一个用来衡量 存储空间的大小

程序 =  数据结构 + 算法

  • 时间复杂度:就是执行程序的快慢,速度越快,时间复杂度就越好。

  • 空间复杂度:就是执行程序需要的存储空间的大小,执行程序需要的存储空间越小就越好。

二、时间复杂度的计算

表示方法

我们一般用 大O符号表示法来表示时间复杂度:T(n) = O(f(n)) n是影响复杂度变化的因子,f(n)是复杂度具体的算法。

常见的时间复杂度量级

  • 常数阶O(1)

  • 线性阶O(n)

  • 对数阶O(logN)

  • 线性对数阶O(nlogN)

  • 平方阶O(n²)

  • 立方阶O(n³)

  • K次方阶O(n^k)

  • 指数阶(2^n)

接下来再看一下不同的复杂度所对应的算法类型。

常数阶O(1)

int a = 1;
int b = 2;
int c = 3;
123

我们假定每执行一行代码所需要消耗的时间为1个时间单位,那么以上3行代码就消耗了3个时间单位。那是不是这段代码的时间复杂度表示为O(n)呢 ?其实不是的,因为大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。上面的算法并没有随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。

线性阶O(n)

for(i = 1; i <= n; i++) {j = i;j++;
}
1234

看这段代码会执行多少次呢?第1行会执行1次,第2行和第3行会分别执行n次,总的执行时间也就是 2n + 1 次,那它的时间复杂度表示是 O(2n + 1) 吗?No ! 还是那句话:“大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的”。所以它的时间复杂度其实是O(n);

对数阶O(logN)

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

可以看到每次循环的时候 i 都会乘2,那么总共循环的次数就是log2n,因此这个代码的时间复杂度为O(logn)。这儿有个问题,为什么明明应该是O(log2n),却要写成O(logn)呢?其实这里的底数对于研究程序运行效率不重要,写代码时要考虑的是数据规模n对程序运行效率的影响,常数部分则忽略,同样的,如果不同时间复杂度的倍数关系为常数,那也可以近似认为两者为同一量级的时间复杂度。

线性对数阶O(nlogN)

for(m = 1; m < n; m++) {i = 1;while(i < n) {i = i * 2;}
}
123456

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

平方阶O(n²)

for(x = 1; i <= n; x++){for(i = 1; i <= n; i++) {j = i;j++;}
}
123456

把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²) 了。

立方阶O(n³)、K次方阶O(n^k)

参考上面的O(n²) 去理解就好了,O(n³)相当于三层n循环,其它的类似。

三、空间复杂度计算

空间复杂度 O(1)

如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)。

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
12345

代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)。

空间复杂度 O(n)

int[] m = new int[n]
for(i = 1; i <= n; ++i) {j = i;j++;
}
12345

这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,后面虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)。

总结

评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。可能有的开发者接触时间复杂度和空间复杂度的优化不太多(尤其是客户端),但在服务端的应用是比较广泛的,在巨大并发量的情况下,小部分时间复杂度或空间复杂度上的优化都能带来巨大的性能提升,是非常有必要了解的。

大家好,下面是我的另一个号,会发一些比较私密的内容,欢迎大家关注!


时间复杂度和空间复杂度,一看就懂,面试前必过一遍相关推荐

  1. 只有程序员看的懂面试圣经

    技术圈 只有程序员看的懂面试圣经|如何拿下编程面试 http://www.epubit.com.cn/article/197 当我最初开始参加编程面试的时候,我所有最心仪的公司都忽视了我.现在回头看那 ...

  2. 春招/秋招面试前必看一文。如何找到 BAT 的实习机会。找实习中的一些困惑,如何解决?。浅谈秋招。

    春招/秋招面试前必看一文 春节过完,不管是大三/研二.还是大四/研三,就要投入到最激烈的春招当中去了,各大公司将会正式招聘,由元旦期间拉开序幕(1 - 2 月),到彻底的进入白热化阶段(3 - 4 月 ...

  3. 一个HR人给应届生的面试建议,关于应届生面试自我介绍、常见问题及回答、面试礼仪、技巧等,非常全面、非常专业,面试前必看,晚了后悔呀。

    一个HR人给应届生的面试建议,关于应届生面试自我介绍.常见问题及回答.面试礼仪.技巧等,非常全面.非常专业,面试前必看,晚了后悔呀. 从事人力资源工作很多年了,多多少少积累了一些经验.已经有许多同仁发 ...

  4. 【面试相关】数据分析面试前必看知识点QA①

    趁着周末,决定花些时间来整理一下,属于我的数据分析学习地图. 第二篇:数据分析面试前必看知识点Q&A② 第一部分 知识框架 第二部分 面试准备 1.一开始先自我介绍,针对简历开始深入地问,目前 ...

  5. C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)

    排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序:   直接插入排序    希尔排序 (插入)  冒泡排序     快速排序  (交换) 直接选择排序  ...

  6. 只有程序员看的懂面试圣经|如何拿下编程面试

    http://www.jianshu.com/p/d34c335a6cfd 当我最初开始参加编程面试的时候,我所有最心仪的公司都忽视了我.现在回头看那个时候,我发现自己当时去参加面试都完全没做任何准备 ...

  7. 春招/秋招面试前必看一文

    春节过完,不管是大三/研二.还是大四/研三,就要投入到最激烈的春招当中去了,各大公司将会正式招聘,由元旦期间拉开序幕(1 - 2 月),到彻底的进入白热化阶段(3 - 4 月),竞争是相当的激烈,谁做 ...

  8. 小白一看就懂的前后端接口连接

    作为刚入职的小白,总是听前辈们说"连接口很简单的 ,一看就懂",由于鄙人实在是才疏学浅,实在是绕的头晕眼花,不知道怎么肥事.于是耐心用一下午仔细研究每一句代码,研究他们之间的联系, ...

  9. Java架构-面试前必须知道的MySQL命令【explain】

    刷面试题的时候,不知道你们有没有见过MySQL这两个命令:explain和profile(反正我就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记.今天发现自己的TODO LIST ...

最新文章

  1. unity中摄像机的控制---调整摄像机,不让他摔倒
  2. 郎凤娥谈定西实施煤粉锅炉改造项目
  3. 重构学习2-消除过长参数
  4. vue实现两个数组的合并
  5. 中石油训练赛 - 奎奎发红包(贪心)
  6. MySQL局域网内访问慢的原因及解决方法
  7. multi source replication mysql_MySQL 5.7多源复制(Multi-Source Replication)
  8. 【今日CV 计算机视觉论文速览 第109期】Wed, 1 May 2019
  9. python查看与修改工作目录
  10. fastapi 基础使用
  11. ATM机为什么不能存100张?
  12. 基于TMS320VC5507的语音识别系统实现
  13. Understanding LSTM Networks(理解LSTM网络-colah‘s blog)
  14. JavaScript学习(七)
  15. C/C++ 实现模拟键盘鼠标
  16. python爬虫怎么爬同一个网站的多页数据-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...
  17. idea社区版 html,利用IntelliJ IDEA社区版开发servlet
  18. python长度单位换算表_常用长度单位换算表
  19. tv 斐讯n1原生android_斐讯T1刷原生安卓TV
  20. Win7桌面为什么变黑了?Win10未激活

热门文章

  1. ajax请求模拟登录
  2. 持久代是方法区还是堆中的?
  3. Javascript中call函数和apply函数的使用
  4. php如何使用高阶函数
  5. sql server 创建唯一性非聚集索引语句_数据库专题—索引原理
  6. [WinForm] VS2010发布、打包安装程序(超全超详细)
  7. java微信web支付开发_微信支付java开发详细第三方支付功能开发之支付宝web端支...
  8. 第一季6:海思方案中uboot、kernel和rootfs的烧写方法
  9. 选购四轴飞行器的部件
  10. 【原】git命令行查看全部分支与远程分支不同步问题