简析时间复杂度和空间复杂度
一、说明
时间复杂度和空间复杂度是用来评价算法效率高低的2个标准,身为开发者肯定会经常会听到这2个概念,但它们分别是什么意思呢?
其实这两个概念从字面意思上也能看出一二:
- 时间复杂度:就是说执行算法需要消耗的时间长短,越快越好。比如你在电脑上打开计算器,如果一个普通的运算要消耗1分钟时间,那谁还会用它呢,还不如自己口算呢。
- 空间复杂度:就是说执行当前算法需要消耗的存储空间大小,也是越少越好。本来计算机的存储资源就是有限的,如果你的算法总是需要耗费很大的存储空间,这样也会给机器带来很大的负担。
二、时间复杂度的计算
表示方法
我们一般用“大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;
我们假定每执行一行代码所需要消耗的时间为1个时间单位,那么以上3行代码就消耗了3个时间单位。那是不是这段代码的时间复杂度表示为O(n)呢 ?
其实不是的,因为大O符号表示法并不是用于来真实代表算法的执行时间的,它是用来表示代码执行时间的增长变化趋势的。
上面的算法并没有随着某个变量的增长而增长,那么无论这类代码有多长,即使有几万几十万行,都可以用O(1)来表示它的时间复杂度。
线性阶O(n)
for(i = 1; i <= n; i++) {j = i;j++;
}
看这段代码会执行多少次呢?
第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;
}
可以看到每次循环的时候 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;}
}
线性对数阶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++;}
}
把 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;
代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)。
空间复杂度 O(n)
int[] m = new int[n]
for(i = 1; i <= n; ++i) {j = i;j++;
}
这段代码中,第一行new了一个数组出来,这个数据占用的大小为n,后面虽然有循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,即 S(n) = O(n)。
总结
评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。可能有的开发者接触时间复杂度和空间复杂度的优化不太多(尤其是客户端),但在服务端的应用是比较广泛的,在巨大并发量的情况下,小部分时间复杂度或空间复杂度上的优化都能带来巨大的性能提升,是非常有必要了解的。
简析时间复杂度和空间复杂度相关推荐
- STL中sort算法简析
STL里sort算法简析 文章目录 STL里sort算法简析 一.引入 二.正解 三.源码 **`sort的源码`**: **`其中,__introsort_loop便是内省式排序:`** 插入排序 ...
- python时间复杂度和空间复杂度是指_时间复杂度和空间复杂度
To conquer oneself is to conquer all. 前言 iOS开发想进大厂,算法是必须会的,最近一段时间都在学习算法,一直在看都没有记录下来,最近迭代版本已经开发完毕,有点闲 ...
- 什么是时间复杂度与空间复杂度
目录 算法效率 时间复杂度 概念 大O的线性表示法 时间复杂度举例 空间复杂度 空间复杂度的定义 空间复杂度举例 时间复杂度与空间复杂度是用来分析一个算法的效率的. 算法效率 算法效率分析分为两种:第 ...
- 【路径规划】A*算法方法改进思路简析
A*算法方法改进思路简析 0. 前言 1. A*算法的总体流程 2. A*算法的改进 2.1 启发函数的选择与优化 2.1.1 预估函数的选择 2.1.2 为启发函数增加权重系数 2.1.3 节点比较 ...
- java数据结构-----时间复杂度、空间复杂度
文章目录 1.前言 2.算法与时间复杂度.空间复杂度的关系 3.时间复杂度 4.常见时间复杂度举例 5.空间复杂度 6.常见的空间复杂度举例 1.前言 当我们设计一个算法的时候要考虑他的效率,例如,使 ...
- ICDE-2020 论文简析:依赖感知空间众包中的任务分配 - Task Allocation in Dependency-aware Spatial Crowdsourcing
ICDE-2020 论文简析:依赖感知空间众包中的任务分配 - Task Allocation in Dependency-aware Spatial Crowdsourcing 研究背景 研究目标 ...
- js时间复杂度、空间复杂度
算法(Algorithm)是指用来操作数据.解决程序问题的一组方法.对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别. 那么我们应该如何去衡量不同 ...
- 时间复杂度,空间复杂度(超详细)真香
文章目录 算法的时间复杂度和空间复杂度 复杂度的分析 一. 时间维度 事后统计法 事前分析估算的方法 时间复杂度 (1)时间频度 (2)时间复杂度 大O符号表示法 常见的时间复杂度量级 常数阶O(1) ...
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- 数据结构(02)— 时间复杂度与空间复杂度转换
1. 时间复杂度转化为空间复杂度 常用的降低时间复杂度的方法有递归.二分法.排序算法.动态规划等,降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构. ...
最新文章
- android 固定底部导航,如何设置android底部导航栏位置固定在android
- Linux常用的基本命令vi、ps、kill(四)
- Mysql之乐观锁悲观锁:乐观锁检查数据状态 悲观锁更新时锁定数据
- PowerDesigner教程系列(五)概念数据模型
- java 练手小项目
- 处理器阉割版和满血版有什么区别?
- 域名交易的信息差,原来还可以这样赚钱
- hdu1879继续畅通工程(最小生成树kru算法)
- c语言中合法的字符型常量是,字符串变量是什么意思
- 印度BIS认证产品范围和注意事项
- 0基础怎么学习SEO?
- 2016年中国新增装机同比及风电开发分析
- 基于 vue.js + elementUI 后台管理系统 (html)模板
- 睡地板的女高管,也被马斯克裁了!推特丧心病狂的第八轮裁员来了
- navicat执行sql文件报错:1840-@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
- 一个苦逼程序员日常的 10 个扎心瞬间
- mysql里面使用技巧_MySQL的使用技巧
- 2020-09-08
- Huawei U8825d 对4G手机内存重新分区过程[把2Gb内置SD卡容量划分给DATA分区使用]...
- [驱动]BL0937
热门文章
- python numpy 计算标准差
- 解决xcel数据导入MySQL数据库【日期数据格式混乱】的问题
- 计算机网络与Netty - F2F
- [CGAL]建立一个正四面体
- 投入产出分析方法简介以及投入产出表
- Spring和SpringMVC配置中父子WebApplicationContext的关系
- 服务器中转发器干啥用,转发器是什么意思
- PHP如何使用Ds\Deque clear()函数?用法示例
- java hadoop是什么_hadoop是什么语言
- 跟着“不睡觉的怪叔叔”一起学习openlayers入门