复杂度
复杂度分析
- 数据结构和算法的目标:快、省,即执行效率和资源消耗。
- “事后统计法”具有很大局限性,提前预估效率很重要。
- 复杂度分析是学习算法的精髓和分析算法的利器。
时间复杂度
- 假设每行代码执行时间意义,所有代码的执行时间
T(n)
和每行代码的执行次数n
成正比。
T(n) = O (f(n))
- 大O时间复杂度表示代码执行效率随数据规模增长的变化趋势,也叫渐进时间复杂度。
- 当n很大时,低阶、常量、系数并不左右增长趋势,可以省略,只需要记录最大量级。
- 只关注循环次数最多的一段代码.
- 加法法则:总复杂度等于量级最大的那一段代码。
- 乘法法则:嵌套代码的复杂度等于内外代码复杂度之积。
- 常见复杂度量级
- 非多项式量级: O ( 2 n ) , O ( n ! ) O(2^n),O(n!) O(2n),O(n!),称为NP算法,效率较低。
- 多项式量级: O ( 1 ) , O ( l o g n ) , O ( n ) , O ( n l o g n ) , O ( n k ) O(1),O(logn),O(n),O(nlogn),O(n^k) O(1),O(logn),O(n),O(nlogn),O(nk)。
O ( 1 ) O(1) O(1)
int i = 1 ;
int j = 2 ;
int sum = i + j ;
常量级时间复杂度的表示方法,即便有 3 行,也是 O(1) ,并非 O(3) 。一般情况下,只要不存在循环、递归,复杂度都为 O(1) ,与代码量无关。
O ( l o g n ) 、 O ( n l o g n ) O(logn)、O(nlogn) O(logn)、O(nlogn)
int i = 1 ;
while ( i <= n )
{
i = i * 2 ;
}
这段代码的复杂度为 O ( l o g 2 n ) O(log_2n) O(