算法的时间复杂度和空间复杂度(C语言版)
1 2 3 4 5 6 7 8 9 10 11 12 13 | //逐步递增型爱你<br>#include <stdio.h> void loveYou( int n){ //n为问题的规模 int i=1; //爱你的程度 1次 while (i<=n){ //n+1次 i++; //每次加1 n次 printf( "I love you%d\n" ,i); //n次 内层循环执行了n*n次 } printf( "I love you more than %d\n" ,n); //1次 } int main(){ loveYou(10); return 0; } //T(n)=3n+3 时间开销—基本运算的频度 时间复杂度n |
代码运行:
问题1:是否可以忽略表达式某些部分?
我们可以直接保留时间开销最大的那一项,也就是最高阶的那一项,在最高阶的那项里,常数系数也可以忽略(都变为1),只关注最高阶的数量级即可。
Tn=O(f(n))——大O表示同阶<<==>>当n-->无穷的时候,Tn的精确表达式/f(n)=k(用数学思维来描述),即二者之比皆为常数。
a)加法规则 T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n))) 多项相加,只保留最高阶的项,且系数变为1
b)乘法规则 T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n)) 多项相乘,都保留
问题2:如果有好几千行代码?按照这种方法需要一行一行数?
结论1:顺序执行的代码指挥影响常数项,可以忽略。
结论2:只需要挑循环中的一个基本操作分析它的执行次数与n的关系即可。
结论3:如果有多层嵌套循环,只需关注最深层循环循环了几次。
算法复杂度大小:
O(1)<O(log2n)<O(n)<O(nog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)
口诀==>常对幂指阶
算法的空间复杂度:
空间复杂度:空间开销与问题规模n之间的关系
放在内存后的程序代码不是我们看到的高级语言的代码,而是经过编译后形成的相应指令。放入内存后,CPU开始运行,先传入参数n和局部变量i(此时一共需要8个字节去存放数据),其实可能还有别的参数什么的,但是道理都是类似的。
不管问题规模n怎么变化,算法在执行的过程中,他所需要的内存空间大小都是固定不变的常数值,空间复杂度都是常数阶。
空间复杂度都是常数阶的算法,可以称算法原地工作(算法所需内存空间为常量)。
void test(int n){
int flag[n];
int i;
}
//假设一个变量占4B,则所需内存空间为4n+8 存放参数n(4个字节) int型数组占4n i又占4个字节==>S(n)=O(n)=n
//空间复杂度只需要关注存储空间大小,与问题规模相关的变量
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞