时间复杂度与空间复杂度

空间复杂度

类似于算法的时间复杂度,空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n)),它也是问题规模n的函数。

void PrintN(int N){
    int i;
    for(i=1;i<=N;i++){
        printf("%d\n",i);
    }
}//空间复杂度为O(1)
void print(int N){
    if(N){
        print(N-1);
        printf("%d\n",N);
    }
}//空间复杂度为O(n)

时间复杂度

时间复杂度,全称渐进时间复杂度记做,T(n) = O(f(n))
f(n)是问题规模n的函数,它表达的是算法中基本操作重复执行的次数(频度)。
T(n)是算法中所有语句的频度之和,它的数量级和f(n)是同数量级的。
因此,分析整个算法的时间复杂度其实就是分析算法最深层语句的数量级。
而O(f(n))就是算法中最深层语句的频度的数量级,O的含义是f(n)的数量级。

其严格的的数学定义是:
若f(n)是正整数n的一个函数,则T(n)=O(f(n))表示存在一个正的常数M,
使得当n>=N时都满足|Xn|<=M|f(n)|
复杂度的渐进表示法

我们在分析一个程序时,不需要一步步求出来总共运行了多少步,事实上,我们只关心随着函数规模n的增大,时间复杂度增长的性质。
T(n)=O(f(n))表示存在常数C>0,N>0使得当n>N时有T(n)<=Cf(n)
f(n)表示T(n)的一个上界
T(n)=Ω(g(n))表示存在常数C>0,N>0使得当n>N时有T(n)>=Cg(n)
g(n)表示T(n)的一个下界
一个函数的上下界往往不是唯一的,我们只讨论最小上界和最大下界。

double f(int n,double a[],double x){
    double p=a[0];
    for(int i=1;i<=n;i++){
        p += (a[i]*pow(x,i));
    }
    return p;
}//时间复杂度位O(n^3)
double f_better(int n,double a[],double x){
    double p=a[n];
    for(int i=n;i>0;i--){
        p=a[i-1]+x*p;
    }
    return p;
}//时间复杂度为O(n^2)

复杂度分析的小技巧

  • 加法规则:T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))
  • 乘法规则:T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))
  • 常见的渐进时间复杂度:O(1)<O(log n)<O(n)<O(n*log n)<O(n2)<O(2n)<O(n!)<O(nn)
  • 一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度
  • if-else 结构的复杂度取决于if的条件判断复杂度和两个分支部分的复杂度,总体复杂度取三者中最大值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值