算法的时间复杂度和空间复杂度(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
//空间复杂度只需要关注存储空间大小,与问题规模相关的变量

 

posted @   SpringChuXin  阅读(382)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
点击右上角即可分享
微信分享提示