1.为什么需要复杂度分析?
虽然跑性能测试可以得到算法的执行时间和占用内存空间大小,但是这种方式有两个局限。
第一个,测试结果非常依赖测试环境,不同硬件性能的测试环境跑出来的结果也是不同的
第二个,测试时结果受数据规模的影响很大。
我们需要一个不需要具体的测试数据来测试。就可以粗略的估算算法的的执行效率和资源消耗的方式。
这就是复杂度分析的由来。
2.大O复杂度表示法
T(n)=O(f(n))
- T(n):表示代码的执行时间
- n:表示数据规模的大小
- f(n):表示每行代码执行次数的总和
- O:表示代码的执行时间和f(n)表达式成正比
大O时间复杂度度实际并不具体代表代码的真正执行时间,只是表示代码执行时间随数据规模增长的变化趋势。
3.时间复杂度分析
3个分析技巧
-
1)只关注循环次数最多的一段代码
因为大O复杂度表示的是一种变化趋势,忽略表达式中的常量,低阶,系数,只需要记录一个最大阶的量级就可以了。
-
2)加法法则:总复杂度等于量级最大的那段代码的复杂度
-
3)乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
4.几种常见的时间复杂度分析
复杂度量级由低到高
- O(1)常量阶复杂度
- O(logn)对数阶复杂度
- O(n)线性阶复杂度
- O(nlogn)线性对数阶复杂度
- O(n^2)平方阶复杂度
- O(n^3)立方阶复杂度
- O(n^k)K次方阶复杂度
- O(2^n)指数阶复杂度
- O(n!)阶乘阶复杂度
5.空间复杂度分析
空间复杂度表示算法存储空间和数据规模增长的变化趋势。 常见的空间复杂度:O(1),O(n),O(n^2)