时间空间复杂度的计算

275 阅读2分钟

在算法中往往是更注重时间复杂度的比较,空间复杂度只要控制在一个合理的范围内就可以。

时间复杂度

以程序中运行次数最多的代码为准

for(int i = 0; i < n; i ++){
	for(int j = 0; j < m; j ++){
		num ++;
	}
}
第一层for循环从0-n运行n+1次
第二层从j=0->j=m运行n(m+1)次
num++运行n*m次

时间复杂度:(n+1)+n(m+1)+nm=n+1+nm+n+nm=2nm+2n+1(n+1)+n(m+1)+nm = n+1+nm+n+nm = 2nm+2n+1

当n和m趋近无穷时:2n2+2n+1=2n2=n22n^2+2n+1 = 2n^2 = n^2

对一个程序来说,它最简频度往往就是最深层次的循环结构中的某一条语句的执行次数。例如2n+1最简为n,同样2n2+2n+1=2n2=n22n^2+2n+1 = 2n^2 = n^2可以简化为n2n^2​,实际就是最内层循环中num++的执行次数

为了避免人们随意使用a、b、c等字符来表示运行时间,需要建立同一的规范:O(频度)所以上面代码时间复杂度是O(n2)O(n^2)

空间复杂度

程序运行过程中需要占用大小不等的存储空间:

  • 程序代码本身占用的存储空间
  • 程序中输入输出时也会占用一定的空间
  • 在程序运行的过程中,可能还会需要申请更多的临时空间

程序自身占用的空间取决于其包含的代码量,如果要压缩这部分空间就要求我们在实现这个功能的同时,尽可能的编写足够短的代码

输入输出的数据往往是由需求决定的,不同的算法对于同一个需求来说往往使用空间近似

对于算法空间复杂度影响最大的就是临时空间,不同的算法所申请的空间是不同的

int a;
System.out.print(a);
int b[10];

根据上面的代码可以看出,该段程序所使用的空间不随着a的值更改而更改。将第三行的代码更改为

int b[a];

此时,程序运行时所申请的空间就会和a挂上钩

所以,当程序所占用的存储空间和输入值无关,则空间复杂度为O(1);反之,有关的话:

  • 随着输入的a增大,程序申请的临时空间成线性增长,则空间复杂度为O(n)
  • n2n^2增长,则空间复杂度为O(n2n^2),以此类推