简述时间复杂度和空间复杂度

  任何一个程序都会有时间复杂度和空间复杂度两个属性,时间复杂度越高,程序运行的时间就会越长,空间复杂度越高,程序所占用的空间就会越大,我们想要优化程序,自然就要从这两个方面入手。

  衡量一个程序的时间复杂度,并不是简单的计时掐表能做到的。首先,计时掐表的误差是不可能消除的,而且计时的人对结果影响很大。其次,同一个程序在不同的机器上运行,消耗的时间肯定也是不同的。唯一不变的就是我们要测试的,组成这个程序的代码。

  衡量一段代码的时间复杂度,我们可以使用大O的渐进表示法,要简单的介绍大O,可以用下面几段简单的代码为例。

  void func1(int N) {
        int count = 0;
        for(int i = 0; i<N; i++){
          for(int j = 0; j<N; j++){
          count++;
          }
        }
        for(int k = 0; k<2*N; k++){
        count++;
        }
        int M = 10;
        while(M--> 0){
        count++;
        }
  }

  通过简单的计算,我们可以得到在这段代码执行的次数,最初 i , j 的两个for循环一共执行了N * N次,k 的 for 循环执行了2 * N次,最后while循环执行了10次,即程序总共执行了N ^ 2 + 2* N + 10;次。当N为10时,程序就会执行130次,N为100时,就执行10210。我们可以很明显的看见,当N越来越大时,后面加上的常数和低阶项的影响就会越来越小,而计算程序的时间复杂度时,我们并不是需要一个很精准的数值,只要得到一个大概的执行次数就可以了。因此,我们是可以去掉式子中的常数项和低阶项,如果最高项还乘了一个常数,也要把这个乘上去的常数去掉,只要留下一个最高阶项来表明程序大概的执行次数就可以了。那么这个例子的时间复杂度,用大O渐进表示法就可以表示为:O(N ^ 2)。如果一个程序有两个循环,分别执行了M和N次,通过大O渐进表示法推导就表示为O(M+N),如果为固定的常数次数,例如10次、100次,就表示为O(1)。

  当然,在实际的代码运行过程中,一个程序的执行次数可能并不是固定的,例如冒泡排序的执行次数就和数组排序几次就变成有序数组有关。在这种存在多种执行次数的情况中讨论时间复杂度,人们一般是讨论最坏情况的时间复杂度,即,这个数组在最后一次排序完成后才变成有序数组。

  空间复杂度是一个程序在运行过程中临时占用的空间大小的量度,这里我们计算的并不是这个程序具体占用了多少个bytes的空间,而是这个程序的变量个数。与时间复杂度一样,空间复杂度也用大O来表示。

  如果一个程序在运行过程中创建的变量数为固定的常数个,就表示为O(1)。如果为N个,就表示为O(N)。而如果一个程序在运行过程中,有函数递归了N次,每次开辟了N个空间,那么就可以表示为O(N^2),开辟的是固定的常数个空间,就表示为O(N)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值