复杂度分析之空间复杂度

几种空间复杂度

1. 常量空间

当算法的存储空间大小固定,和输入规模没有直接的关系时,空间

复杂度记作O(1)。例如下面这段程序:

  1. void fun1(int n){
  2. int var = 3;
  3. }

2. 线性空间

当算法分配的空间是一个线性的集合(如数组),并且集合大小和

输入规模n成正比时,空间复杂度记作O(n)。
例如下面这段程序:

  1. void fun2(int n){
  2. int[] array = new int[n];
  3. }

3. 二维空间

当算法分配的空间是一个二维数组集合,并且集合的长度和宽度都

与输入规模n成正比时,空间复杂度记作O(n2)。
例如下面这段程序:

  1. void fun3(int n){
  2. int[][] matrix = new int[n][n];
  3. }

4. 递归空间

递归是一个比较特殊的场景。虽然递归代码中并没有显式地声明变量或集合,但是计算机在执行程序时,会专门分配一块内存,用来存储“方法调用栈”。“方法调用栈”包括进栈和出栈两个行为。当进入一个新方法时,执行入栈操作,把调用的方法和参数信息压入栈中。当方法返回时,执行出栈操作,把调用的方法和参数信息从栈中弹出。

下面这段程序是一个标准的递归程序:

  1. void fun4(int n){
  2. if(n<=1){
  3. return;
  4. }
  5. fun4(n-1);
  6. }
    假如初始传入参数值n=5,那么方法fun4(参数n=5)的调用信息先
    入栈。
    接下来递归调用相同的方法,方法fun4(参数n=4)的调用信息入
    栈。
    以此类推,递归越来越深,入栈的元素就越来越多。
    当n=1时,达到递归结束条件,执行return指令,方法出栈。
    最终,“方法调用栈”的全部元素会一一出栈。
    由上面“方法调用栈”的出入栈过程可以看出,执行递归操作所需要
    的内存空间和递归的深度成正比。纯粹的递归操作的空间复杂度也是线
    性的,如果递归的深度是n,那么空间复杂度就是O(n)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值