作为开发人员,我们都希望在完成功能的基础上让代码运行的更快、更省空间,那如何衡量编写的代码是否更有效率,这就需要我们学会如何分析代码时间复杂度和空间复杂度.

什么是复杂度分析

执行时间和占用空间是代码性能的2个评判标准,我们分别用时间复杂度和空间复杂度去描述这2个标准,二者统称复杂度,复杂度描述的是算法执行时间(或占用空间)随数据规模的增长关系.

为什么需要复杂度分析

有人可能想问我代码运行一下不就知道他执行多长时间了吗,为什么还需要复杂度分析,确实你能够通过这种方法评估出代码的执行效率,但是这样会有一些局限性.

1.测试结果太过于依赖测试环境
同一段代码在不同处理器的机器上运行结果是显然不一样的,这时就不知道应该参考哪个测试结果.
2.测试结果受到数据规模的影响很大
两段不同的代码在数据量比较小的时候可能相差甚微,无法真实反映代码的性能问题.

所以我们需要一个不依赖测试环境同时也不需要有具体的测试数据就能粗略的估计代码的执行效率的方法,也就是复杂度分析.

如何进行复杂度分析

大O复杂度表示法
先看一段代码,求1,2,3...n的累加和

int calc(int n) {int sum = 0;  //第一行for(int i = 1; i <=n; i++) {sum = sum + i;}return sum;
}

我们来评估一下这段代码的执行时间,假设每行执行的时间一样,为row_time.第1行需要一个row_time的执行时间,第2,3行分别执行了n次,所以需要2n*row_time的执行时间,所以这段代码加起来总共的执行时间为(2n+1)*row_time,虽然我们并不知道row_time的具体时间,但我们发现代码的总执行时间T(n)与代码的执行次数n成正比.我们可以用公式来表示

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

T(n)代表代码的总执行时间,f(n)代表代码的执行次数,O代表T(n)与f(n)成正比.所以上面的例子中,T(n) = O(2n+1),我们可以看出大O时间复杂度表示代码执行时间随数据规模的变化趋势,我们简称为时间复杂度.

当n很大时,公式中的常量,系数都可以忽略不计,并不会对变化趋势有太大影响,我们只需记下一个最大量级即可,那么刚刚的例子最后就可以记为T(n) = O(n)

那以后的代码如何去分析其时间复杂度呢,我们有以下法则:
1.看代码执行次数最多的一段,比如循环
2.多段代码取最大量级,比如单循环和多重循环,应取多重循环的复杂度
3.嵌套代码复杂度等于嵌套内外代码复杂度的乘积,比如递归和多重循环等

平时我们有一些常用的复杂度级别,比如O(1) (常数阶)、O(logn) (对数阶)、O(n) (线性阶)、O(nlogn) (线性对数阶)、O(n²) (平方阶)

了解了时间复杂度,那么空间复杂度也不难理解了,时间复杂度表示的是算法执行时间随数据规模增长的变化关系,那空间复杂度则表示的是算法存储空间随数据规模增长的变化关系.

总结

复杂度用来分析算法执行效率与数据规模增长的变化关系,越高阶复杂度的的算法执行效率也就越低,上面列举的复杂度级别从低到高分别为O(1)、O(logn)、O(n)、O(nlogn)、O(n²).

时间复杂度与空间复杂度分析相关推荐

  1. 算法时间复杂度、空间复杂度分析

    算法时间复杂度 在计算机程序编写前,依据统计方法对算法进行估算,经过总结,我们发现一个高级语言编写的程序程序在计算机上运行所消耗的时间取决于下列因素: 1.算法采用的策略和方案; ⒉编译产生的代码质量 ...

  2. 时间复杂度和空间复杂度分析

    基本概念 算法:是解决某一特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示有一个或者多个操作.对于一个特定问题进行求解,可以使用不同的算法,或许最终结果是一样的,但在此过程中消 ...

  3. 递归算法时间复杂度和空间复杂度分析与举例

    文章目录 前言 1.递归算法性能分析公式 1.1 时间复杂度计算公式 1.2 空间复杂度计算公式 1.3 例子 1.3.1 暴力算法 1.3.2 递归算法 1.3.3 优化递归算法 总结 前言 根据代 ...

  4. 时间复杂度和空间复杂度分析技巧

    一.算法效率度量 如何度量一个算法的执行效率/时间呢?可以利用计算机的计时功能,来度量算法执行效率高低.这种方法也叫事后统计法. 事后统计法有很大的局限性: 测试结果依赖环境:不同的处理器.不同的操作 ...

  5. c语言——直接插入排序实现(时间复杂度与空间复杂度分析)

    c语言--直接插入排序 插入排序就是将一个记录插入到已排好序的序列中,从而得到一个新的有序序列. 哪里有一个排好序的序列 那问题是我们要排序的是一个数组,哪里来一个排好序的序列呢?这时,我们可以把数组 ...

  6. Pyhton 描述 归并排序算法详解 时间复杂度,空间复杂度分析

    算法描述分析: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有 ...

  7. 时间复杂度、空间复杂度的分析--王争数据结构与算法学习笔记

    我们使用时间复杂度和空间复杂度来衡量算法代码的执行效率,那么为什么要这么麻烦需要自己去衡量一遍呢?把代码跑一遍,通过统计.监控,就能得到算法执行的时间和占用的内存大小.为什么还要做时间.空间复杂度分析 ...

  8. 分析时间复杂度和空间复杂度(一级)

    什么叫时间复杂度,并且告诉大家我们一般求时间最坏复杂度,下边我们该怎么求时间复杂度呢,没有必要去求他真实的计算次数,所以我们最后把这个问题简化了,怎么来简化?1. 找出算法中的基本语句,基本语句是哪个 ...

  9. 时间复杂度空间复杂度分析

    时间复杂度:   一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),进而分析f(n)随n的变化情况并确定T(n)的数量级.这里用"O"来表示数量级,给出算法的 ...

最新文章

  1. GIT服务器搭建(转载)
  2. 【学习笔记】6、标准数据类型—数字类型
  3. Codeforces 1314 题解
  4. python怎么变成exe文件_如何在python中知道CPython可执行文件是否是调试版本?
  5. 真格量化-持仓量第n档卖方主力跟随策略
  6. 就谈个py 的装饰器 decorator
  7. cocoapods 安装失败 ERROR: Error installing cocoapods: ERROR: Failed to build gem native extension.
  8. kmp算法next计算方法_KMP 算法详解
  9. php mysql cpu100_mysql进程占服务器cpu100%的解决方法
  10. oracle-in/exists
  11. 全景Engine智能管理软件7.0-PLG模式全新上线
  12. WIN10电脑热点无法共享
  13. 利用CK11N改标准价格需要注意的地方
  14. Win7 64 位 Vcode Python安装与环境配置
  15. 【ZOJ 4062】Plants vs. Zombies
  16. pypy安装pip以及利用pip安装其它库使用教程
  17. 使用微服务/ API网关(如Solo Gloo)公开在AWS EKS中运行的微服务
  18. java编程思想读书笔记汇总
  19. CKPlayer播放M3U8文件 (加载失败)问题
  20. 【某CMS漏洞】SQL注入漏洞分析

热门文章

  1. Orders matters: seq2seq for set 实验
  2. cgroup介绍、安装和控制cpu,内存,io示例
  3. MySQL常见命令 [转]
  4. 从算法+数据结构到MVC
  5. Javascript学习------内部对象
  6. mint 15用fcitx框架安装中文谷歌输入法
  7. .net 中,使用c# 语言 ,执行exe程序。
  8. 巧解Android时区加载过慢的问题
  9. 读书笔记之《实战Java虚拟机》(2):认识Java虚拟机的基本结构
  10. 秒解决PHP 500的问题