复杂度分析之空间复杂度

自古美人都是妖i 提交于 2020-01-07 17:46:36

几种空间复杂度

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)。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!