初学算法的小菜鸡 - 自学笔记 (第二天): 算法的评估标准 空间复杂度

昨天刚刚说完评估算法好坏的一种标准 -- 时间复杂度,从算法运行时间效率的角度考虑算法的好坏。今天我们来谈谈评估算法好坏的另外一种标准 -- 空间复杂度。

我们经常在一些武侠电影里看到一些宗师们总是爱说:‘天下武学唯快不破’。但是对于算法来说‘快’并不代表绝对的好,对于任何一个程序来说除了应该考虑尽可能快的计算出想要的结果之外,还要考虑尽可能的合理利用计算机的资源。

什么是空间复杂度呢?

根据昨天总结的时间复杂度的内容,我们大致可以猜到空间复杂度应该也是一个估计量。事实上我们可以利用程序的空间复杂度,可以对程序运行中需要多少内存有个预先估计。

空间复杂度(Space Complexity)记作S(n) 依然使用大O来表示,是对一个算法在运行过程中占用内存空间大小的量度,记做S(n)=O(f(n))。

这里需要再次强调一下空间复杂度并不是具体的程序运行时所占用的内存空间的具体结果,而是一个帮助估算所占用内存空间的度量。你也可以将它理解为空间变化趋势的抽象。

Carl大神还对空间复杂度概念中一些容易混淆的点给出了解释,例如博主本人就混淆了程序运行时所占内存空间大小和程序本身的大小的概念。

这里强调一下空间复杂度是考虑程序运行时占用内存的大小,而不是可执行文件的大小。

通过对于一些资料的阅读比较常用的空间复杂度有O(1)、O(n)、O(n²),来~上代码 (上才艺~小声哔哔): 

如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为 O(1)

int j = 0;
for (int i = 0; i < n; i++) {
    j++;
}

可能有些和我一样的童鞋,看到这里有点晕。这不是n变大了循环遍历的时间就更长了吗?怎么说不变呢?请注意这里并不是在讨论时间复杂度,所以不要盯着循环,应该盯着循环体内部的变量。对于一个拥有特定类型的变量来说它所占用的内存空间就是固定的,例如byte类型数据占1个字节,short类型数据占2个字节,int类型数据占4个字节等等。这些拥有固定类型的变量并不会因为其被赋予的数值大小的变化而影响所占内存空间的大小。

理解了这一点,聪明的童鞋们可能一下子就想到了什么时候空间复杂度是O(n),当消耗空间和输入参数n保持线性增长,这样的空间复杂度为O(n),没错就是一维数组。

int[] m = new int[n];
for(i=1; i<=n; ++i)
{
   m[i] = i;
}

我们定义了一个数组出来,这个数组占用的大小为n,虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,随着n的增大,开辟的内存大小呈线性增长,即 O(n)。

其他的 O(n^2), O(n^3) 我想童鞋们应该都可以以此例举出来了~二维数组,三维数组。

Carl大神还提到了有关空间复杂度是logn的情况,但没有给出详细的解释和例子。

空间复杂度是logn的情况确实有些特殊,其实是在递归的时候,会出现空间复杂度为logn的情况

事实上这里博主也并没有找到足够的资料有关空间复杂度是logn的情况,这里留一个小节,日后补上吧!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值