空间复杂度

1,137 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

空间复杂度

空间复杂度是对程序执行过程中临时占用空间大小度量的指标,一般空间复杂度表示为S(n) = O(f(n)),其中n表示输入规模,fn表示一段程序代码。

空间复杂度和时间复杂度的有类似的情形如下

常量空间

常量空间的意思是该场景空间复杂度和输入规模n无关,那么常量空间的空间复杂度就可以表示为S(n) = O(1),类似如下代码

 public void methond1(int n)int m = 3; }

线性空间

线性空间一般和数组有关,如下代码,存在一个一维数组,那么该数组的大小和输入规模n成正比,所以该场景空间复杂度可以表示为S(n) = O(n)。

 public void methond2(int n)String[] arr = new String[n]; }

二维空间

当程序的内存占用为一个二维数组,如下代码,该二维数组和输入规模n是平方的关系,空间复杂度可以表示为S(n) = O(n2)。

 public void methond3(int n)String[][] arr = new String[n][n]; }

递归空间

以JAVA语言为例,在程序运行过程中会给当前运行的线程开辟一片内存空间,称为栈,方法调用过程就是压栈操作和出栈操作的过程,而递归简而言之就是当进入方法开始压栈,当方法返回就开始出栈,代码如下

 public void methond4(int n)if (n<=1){         return;     }     methond4(n-1); }

所以该场景的空间复杂度就是栈的深度,也就是输入规模n那么这里的空间复杂度可以表示为S(n) = O(n)。

空间复杂度和时间复杂度的取舍

空间复杂度和时间复杂度虽然都是衡量一个算法好坏的标准,但是空间复杂度在这个硬件飞速发展的时代显然没有时间复杂度那么的关键,因为内存空间越来越便宜,在时间复杂度和空间复杂度对比下上明显会偏重于时间复杂度。

所以我们在工作中往往会给程序多分配一些内存空间,也要提升程序的执行速度。