【数据结构】时间空间复杂度

时间复杂度

算法中基本操作重复执行的次数可以用n的某个函数 f(n)表示,因此算法的时间量度记作 T(n) = O(f(n))
它表示,随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。

若f(n)=amnm+am-1nm-1+…+a1n+a0是一个多项式,则T(n)=O(nm)。(没咋懂)
在计算复杂度时,可以忽略所有低次幂项和最高次幂的系数,由此简化算法分析。

分析算法时间复杂度的基本方法:

  • 找出所有语句中语句频度最大的语句作为基本语句;
  • 计算基本语句的频度得到问题规模n的函数f(n);
  • 取其数量级用符号“O”表示即可。

由于算法的时间复杂度考虑的只是对于问题规模n的增长率,所以有时可以不用精确计算其基本操作执行次数的情况下,只求出它关于n的增长率(也就是阶)即可。
例:
for (i=2; i<=n; ++i)
for(j=2; j<=i-1; ++j) { ++x; a[i][j]=x; }
语句== ++x == 的执行次数关于n的增长率为n2,它是语句频度表达式(n-1)(n-2)/2中增长最快的项,因此可以得出该程序段的时间复杂度为T(n)=O(n2)。

例:
常量阶:{x++; s=0;} //T(n)=O(1)
for(i=0;i<10000;i++){x++; s=0;} //T(n)=O(1)
线性阶:for(i=0;i<n;i++){x++; s=0;} //T(n)=O(n)
平方阶:x=0;y=0; for(k=1;k<=n;k++)x++;
for(i=1;i<=n;i++)for(j=1;j<=n;i++)y++; //T(n)=O(n2)
立方阶:x=1;
for(i=1;i<=n;i++)for(j=1;j<=n;i++)for(k=1;k<=n;k++)x++;//T(n)=O(n3)
对数阶:for(i=1;i<=n;i=i*2){x++; s=0;}//T(n)=O(log2n)
在这里插入图片描述

空间复杂度

渐进空间复杂度作为算法所需存储空间的度量,简称空间复杂度,它也是问题规模n的函数,记作:S(n) = O(f(n))
一般情况下,只分析算法所需的辅助空间就可以了,不考虑程序本身所占空间和输入数据所占空间。
若所需辅助空间对于输入数据量而言是个常数,则称该算法为原地工作。
例:
for(i=0;i<n/2;i++){
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}空间复杂度:O(1)

for(i=0;i<n;i++)b[i]=a[n-i-1];
for(i=0;i<n;i++)a[i]=b[i];空间复杂度:O(n)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值