时间复杂度、空间复杂度
▲复杂度
时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。递归总次数*每次递归中基本操作执行的次数
空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。临时占用存储空间的度量
设计算法时,时间复杂度要比空间复杂度更容易出问题,所以一般情况一下我们只对时间复杂度进行研究。一般面试或者工作的时候没有特别说明的话,复杂度就是指时间复杂度。
时间复杂度:
时间复杂度实际上是一个函数,代表基本操作重复执行的次数,进而分析函数虽变量的变化来确定数量级,数量级用O表示,所以算法的时间复杂度为:
T(n)=O(f(n));
在一个算法存在最好、平均、最坏三种情况,我们一般关注的是最坏情况,原因是,最坏情况是任何输入实例在运行时间的上界,对于某些算法来说,最坏情况出现的比较频繁,从大体上来看,平均情况和最坏情况一样差。
一般O(n)的计算方法:
—用1代替所有运行时间中出现的加法常数;
—在修改后的运行函数中保留最高阶的项;
—如果最高阶的项系数不是1,则去除这个项系数。
递归算法的时间复杂度为:递归总次数*每次递归中基本操作执行的次数
空间复杂度(Space Complexity):S(n)=O(f(n));
是对一个算法在运行过程中临时占用存储空间的度量,一个算法在计算机存储器上所占用的存储空间包括存储算法本身所占用的空间,算数和输入输出所占用的存储空间以及临时占用存储空间三个部分,算法的输入输出数据所占用的存储空间是由待解决的问题来决定的,通过参数表由调用函数而来,它随本算法的不同而改变,存储算法本身所占用的存储空间有算法的书写长短成正比。算法在运行过程中占用的临时空间由不同的算法决定。
常数时间 O(1),对数时间 O(log n),线性时间 O(n),线性对数时间 O(n log n),平方时间 O(n^2)
int x = 90; int y = 100; while (y > 0) { if (x > 100) { x = x - 10; y--; } else { x++; } }
时间复杂度:O(1)【循环常数100次】,空间复杂度:O(1)【只有两个临时变量】;
2、当有若干个循环时,时间复杂度是和嵌套层数最多的循环语句中最内层的频度决定的
for (i = 0; i < n; i++) { for (j = 0; j < i; j++) { for (k = 0; k < j; k++) { x++; } } }
时间复杂度:O(n^3)【循环常数n*i*k次】,空间复杂度:O(1)【只有1个临时变量】
3、求二分法的时间复杂度
int select(int a[], int k, int len) { int left = 0; int right = len - 1; while (left <= right) { int mid = left + ((right - left) >> 2); if (a[mid] == k) { return 1; } else if (a[mid] > k) { right = mid - 1; } else { left = mid + 1; } } return NULL; }
分析:

在最坏的情况下循环x次后找到,n/(2^x)=1;x=log2n;
所以二分查找的时间复杂度为:O(log2n)【基本操作次数】;空间复杂度O(1)【只有1个临时变量】;
对数时间的所在地常见以二分查找为代表。
4、用递归算法求n的阶乘
int fac(int n) { if (n <= 2) { return n; } else { return fac(n - 1)*n; } }
n的阶乘的时间复杂度很简单:就是n次递归算法,所以为O(n)【循环n次】,空间复杂度O(n)【嵌套方法中临时变量n个】,递归的深度是n。
常数阶O(1)
对数阶O(log2n)
线性阶O(n)
线性对数阶O(nlog2n)
平方阶O(n2)
立方阶O(n3)
k次方阶O(nk)
指数阶O(2n)
源码,是痛苦的,又是快乐的,如果没有这痛苦,也就没有了这快乐!
本文作者:好Wu赖
本文链接:https://www.cnblogs.com/erlongxizhu-03/p/14072826.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现