时间复杂度
求解时间复杂度一般分为以下几个步骤:
- 找出算法中的基本操作(基本语句) :算法中执行次数最多的语句就是基本语句,通常是最内层循环的循环体部分。
- 计算基本语句执行次数的数量级:只需要计算基本语句执行次数的数量级,即保证函数中的最高次幂正确即可。像最高次幂的系数和低次幂可以忽略。
- 用大 O 表示法表示时间复杂度:将上一步中计算的数量级放入 O 渐进上界符号中。
同时,在求解时间复杂度还要注意一些原则:
- 加法原则:总的时间复杂度等于量级最大的基本语句的时间复杂度。
如果 T1(n)=O(f1(n)),T2(n)=O(f2(n)),T(n)=T1(n)+T2(n),则 T(n)=O(f(n))=max(O(f1(n)),O(f2(n)))=O(max(f1(n),f2(n)))。
- 乘法原则:循环嵌套代码的复杂度等于嵌套内外基本语句的时间复杂度乘积。
如果 T1=O(f1(n)),T2=O(f2(n)),T(n)=T1(n)T2(n),则 T(n)=O(f(n))=O(f1(n))O(f2(n))=O(f1(n)f2(n))。
常见的时间复杂度:
- 常数O(1)
- 线性O(n)
- 平方O(n^2)
- 阶乘O(n!)
- 对数O(log2n)
- 线性对数O(nlog2n)
根据从小到大排序,常见的算法时间复杂度主要有:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)。
空间复杂度
相比于算法的时间复杂度计算来说,算法的空间复杂度更容易计算,主要包括「局部变量(算法范围内定义的变量)所占用的存储空间」和「系统为实现递归(如果算法是递归的话)所使用的堆栈空间」两个部分。
根据从小到大排序,常见的算法空间复杂度主要有:O(1) < O(log2n) < O(n) < O(n^2) < O(2^n) 等。