一个算法的复杂性体现在运行该算法时计算机所需资源的多少上,计算机资源最重要的是时间和空间资源,因此时间复杂度分为时间和空间复杂度。
时间复杂度:执行算法所需要的计算工作量
空间复杂度:执行算法所需要的内存空间
算法所占用的存储空间
算法程序在计算机存储器上所占用的存储空间,包括:
- 存储算法本身所占用的存储空间
- 算法的输入输出数据所占用的存储空间
- 算法在运行过程中临时占用的存储空间
存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。
算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。
算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地"进行的,是节省存储的算法;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元。
一个算法的空间复杂度只考虑在运行过程中临时占用的存储空间大小。
空间复杂度(Space Complexity)
既然时间复杂度不是用来计算程序具体耗时的,那么空间复杂度也不是用来计算程序实际占用的空间的,空间复杂度是表示算法的存储空间与数据规模之间的增长关系,同样反映的是一个趋势,记为S(n)=O(f(n))。
j计算空间复杂度,就看一个算法当中到底有没有使用到了额外的空间来进行存储数据,然后判断这个额外空间的大小会不会随着n的变化而变化,从而得到空间复杂度。
常见时间复杂度的一些实例(从低到高)
1. 空间复杂度 O(1)
算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,代码中的 i、j、m 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)。
int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
2. 空间复杂度 O(n)
这段代码中创建了一个一维数组,占用的存储空间大小为n,这段代码里面虽然有循环,但没有再分配新的空间,因此这段代码的空间复杂度 S(n) = O(n).
int n;
cin >> n;
int a[n];
for(int i=1; i<=n; ++i){
cout << i << endl;
}
一篇更好的文章推荐:
【算法复杂度——空间复杂度-Python】算法空间复杂度的详细介绍_ONLY_CHRIST的博客-CSDN博客_python空间复杂度怎么算