数据结构与算法笔记(1)复杂度分析
算法复杂度分析
一、什么是复杂度分析?
- 对算法运行所需要时间的分析叫时间复杂度分析
- 对算法运行时所占用的空间的分析叫空间复杂度分析
二、 为什么需要复杂度分析?
- 1.测试结果非常依赖测试环境
- 2.测试结果受数据规模的影响很大 *
三、怎么对复杂度进行分析?
-
1. 只关注循环次数最多的一段代码
大O这种复杂度表示方法只是一种变化趋势。我们通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了。所以,我们在分析一个算法、一段代码的时间复杂度的时候,只关注循环执行次数最多的那一段代码就可以了。
-
2. 加法法则:总复杂度等于量级最大的那段代码的复杂度
如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n)))=O(max(f(n), g(n))).
-
3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么T(n)=T1(n)T2(n)=O(f(n))O(g(n))=O(f(n)*g(n)).也就是说,假设 T1(n) = O(n),T2(n) = O(n ),则 T1(n) * T2(n) = O(n )。落实到具体的代码上,我们可以把乘法法则看成是嵌套循环
复杂度量级
- 常量级别 O(1)
- 对数阶级 O(logn)
- 线性阶 O(n)
- 线性对数阶 O(nlogn)
- 平方阶 O(n^2)、立方阶O(n^3)...k次方阶 O(n^k)
- 指数阶O(2^n)
-
阶乘阶O(n!)
对于刚罗列的复杂度量级,我们可以粗略地分为两类,多项式量级和非多项式量级。其中,非多项式量级只有两个:O(2 ) 和 O(n!)。 我们把时间复杂度为非多项式量级的算法问题叫作NP(Non-DeterministicPolynomial,非确定多项式)问题。当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的执行时间会无限增长。所以,非多项式时间复杂度的算法其实是非常低效的算法。
空间复杂度
我们常见的空间复杂度就是 O(1)、O(n)、O(n ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。而且,空间复杂度分析比时间复杂度分析要简单很多。
最好、最坏、平均、均摊时间复制度
-
最好时间复杂度
最好情况时间复杂度就是,在最理想的情况下,执行这段代码的时间复杂
-
最坏时间复杂度
最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度
-
平均情况时间复杂度
用代码在所有情况下执行的次数的加权平均值表示
-
均摊时间复杂度
在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。