算法的时间复杂度和空间复杂度(C语言版)

//逐步递增型爱你
#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 @ 2021-05-18 10:24  SpringChuXin  阅读(359)  评论(0编辑  收藏  举报