空间复杂度分析
时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。类比一下,空间复杂度全称就是渐进空间复杂度( 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!)