数据结构与算法之美04

空间复杂度分析

时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度( asymptotic space complexity ),表示算法的存储空间与数据规模之间的增长关系。

1void print(int n) {
2  int i = 0;
3  int[] a = new int[n];
4  for (i; i <n; ++i) {
5    a[i] = i * i;
6  }
7  for (i = n-1; i >= 0; --i) {
8    print out a[i]
9  }
10}

跟时间复杂度分析一样,我们可以看到,第 2 行代码中,我们申请了一个空间存储变量 i ,但是它是 常量阶的,跟数据规模 n 没有关系,所以我们可以忽略。第 3 行申请了一个大小为 n 的 int 类型数 组,除此之外,剩下的代码都没有占用更多的空间,所以整段代码的空间复杂度就是 O(n)。

常见空间复杂度: O(1) 、 O(n)、 O(n^2)

小结:

复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的 增长关系,可以粗略地表示,越高阶复杂度的算法,执行效率越低。

复杂度分析法则

1 )单段代码看高频:比如循环。

2 )多段代码取最大:比如一段代码中有单循环和多重循环,那么取多重循环的复杂度。

3 )嵌套代码求乘积:比如递归、多重循环等

4 )多个规模求加法:比如方法有两个参数控制两个循环的次数,那么这时就取二者复杂度相加。

常用的复杂度级别?

多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括, O(1) (常数阶)、 O(logn) (对数阶)、 O(n) (线性阶)、 O(nlogn) (线性对数阶)、 O(n^2) (平 方阶)、 O(n^3) (立方阶)

非多项式阶:随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。包括, O(2^n) (指数阶)、 O(n!)

猜你喜欢

转载自www.cnblogs.com/fenqinearl/p/10853009.html