简析时间复杂度和空间复杂度

简析时间复杂度和空间复杂度一 说明时间复杂度和空间复杂度是用来评价算法效率高低的 2 个标准 身为开发者肯定会经常会听到这 2 个概念 但它们分别是什么意思呢 其实这两个概念从字面意思上也能看出一二 时间复杂度 就是说执行算法需要消耗的时间长短 越快越好 比如你在电脑上打开计算器 如果一个普通的运算要消耗 1 分钟时间 那谁还会用它呢 还不如自己口算呢 空间复杂度 就是说执行当前算法需要消耗的存储空间大小 也是越少越好 本来

一、说明

时间复杂度和空间复杂度是用来评价算法效率高低的2个标准,身为开发者肯定会经常会听到这2个概念,但它们分别是什么意思呢?

其实这两个概念从字面意思上也能看出一二:

  • 时间复杂度:就是说执行算法需要消耗的时间长短,越快越好。比如你在电脑上打开计算器,如果一个普通的运算要消耗1分钟时间,那谁还会用它呢,还不如自己口算呢。
  • 空间复杂度:就是说执行当前算法需要消耗的存储空间大小,也是越少越好。本来计算机的存储资源就是有限的,如果你的算法总是需要耗费很大的存储空间,这样也会给机器带来很大的负担。

二、时间复杂度的计算

表示方法

常见的时间复杂度量级

  • 常数阶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; 

线性阶O(n)

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

对数阶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)。

总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199791.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午12:12
下一篇 2026年3月20日 下午12:12


相关推荐

  • MySQL最左匹配原则,道儿上兄弟都得知道的原则

    MySQL最左匹配原则,道儿上兄弟都得知道的原则自 MySQL5 5 版本起 主流的索引结构转为 B 树 B 树的节点存储索引顺序是从左向右存储 在检索匹配的时候也要满足自左向右匹配 目录一 最左匹配原则的原理二 违背最左原则导致索引失效的情况三 查询优化器偷偷干了哪些事儿四 需要你 mark 的知识点 1 如何通过有序索引排序 避免冗余执行 orderby2 like 语句的索引问题 3 不要在列上进行运算 4 索引不会包含有 NULL 值的列 5 尽量选择区分度高的列作为索引 6 覆盖索引的好处 通常我们在建立联合索引的时候 相信建立过索引的同学们会发现

    2026年3月19日
    3
  • 【MySQL】使用Visio绘制数据库关系模型图

    【MySQL】使用Visio绘制数据库关系模型图使用Visio绘制数据库关系模型图1新建项目文件—新建–软件和数据库—数据库模型图点击后,出现如下界面:2绘制左侧“实体关系”中将“实体”形状拖放到绘制界面,如下图3编辑实体名称,如下图:4编辑列点击“列”如下图:完成实体:客人信息表GuestRecord,如下截图完成实体:客房表Room(同上操作),如下图5关系绑定5.1添加列RoomID到客人信息表5.2将“实体关系”中的关系工具拖放到某个实体上(鼠标不松开),直到该实体边框变红色,松开;箭头指

    2022年7月16日
    16
  • 2019计算机二级考试的一些心得、经验和资料总结分享

    做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!相信很多在校的计算机以及计算机相关专业的同学都知道计算机考级的事情,也有很多同学规划着要考二级等等。那么计算机考级到底有没有用?这个仁者见而智者见智,总的来说,如果有时间,考了肯定比考是有优势的!我建议大学的同学,如果有时间,还是学习计算机相关的专业,能考的话一定去考一下。也有很多同学想考但苦于没有资料或者不能…

    2022年2月28日
    55
  • 2025 年 AI 编程利器:Cursor Pro 订阅与自定义 AI 实战(含 OpenAI API 集成)

    2025 年 AI 编程利器:Cursor Pro 订阅与自定义 AI 实战(含 OpenAI API 集成)

    2026年3月15日
    2
  • 已知圆心及半径,通过MATLAB画圆「建议收藏」

    已知圆心及半径,通过MATLAB画圆「建议收藏」已知圆心及半径,使用MATLAB画圆文章目录已知圆心及半径,使用MATLAB画圆一、原理简介二、转换过程三、结果展示一、原理简介条件中已知圆的半径可以等价于极坐标系中的ρ,所以能根据已知的半径转换为直角坐标系中点的坐标来画圆。转换的原理是使用极坐标与直角坐标之间的转换公式来实现,公式如下:x=ρcosθy=ρsinθ二、转换过程主要分一下几步完成1.设置圆的一周由多少个点组成;2.设置圆周上点与点之间的间隔角度;3.设置圆心的坐标;4.读取半径值;5.求取X、Y轴坐标;6.画

    2022年6月19日
    42
  • SpringBoot 项目部署到服务器上(Jar包)

    SpringBoot 项目部署到服务器上(Jar包)1.部署方式Springboot和普通web应用程序不一样,其本质上是一个Java应用程序,那么又如何部署呢?通常来说,Springboot部署会采用两种方式:全部打包成一个jar,或者打包成一个war。现在讲一下打包成jar部署。2.打包成jar第一种方法(idea)1.clean2.package第二种方法(命令行):…

    2022年6月18日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号