空间复杂度
1、百度词条给的解释:空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。比如直接插入排序的时间复杂度是O(n^2),空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了,因为每次递归都要存储返回信息。一个算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。
2、目前见过比较多的解释:算法的空间复杂度通过计算,算法所需的存储空间实现,算法的空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
这上面的定义都有点抽象下面是关于我自己的一点理解
3、关于我自己的一点理解,让我们先来分别看两段段代码:
代码一如下:
int[] arr=new int[n];
for(int i=0;i<arr,length;i++){
System.out.println(arr[i]);
}
代码二如下:
public void fun(int n){
for(int i=0;i<n;i++){
System.out.println(n);
}
}
分析代码一:
在代码一中arr数组的大小并不确定,所以该数组所占用的空间大小是所有元素之和,那么也就是说它的空间复杂度为n,记为O(n)。它的时间复杂度为n,记为O(n);
分析代码二:
在该方法中的代码并没有发生额外的分配空间的情况,不论输入值的大小空间的复杂度始终为1,所以记为O(1)。而时间复杂度为n,记为O(n)。
小结:
1、经过两段代码的分析,可以得出第一段代码数组的大小为n,也就是说程序为数内的元素分配了n个空间,那么空间复杂度就是O(n);
2、第二段代码中可以看出,在执行过程中其并没有发生任何的分配空间的情况,因此我们可以认为它的空间复杂度是常数级别的,就是O(1)
3、如果需要输入n个数据,每个数据因为需要和其他n个数据联系,所以要分配n*n个空间,或者说n的平方的空间,我们就说O(n²)个空间复杂度,这也是因为n是未知的,这个说明的经典的例子就是二维数组
小白一枚如果有误希望老哥们指点一下老弟