复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构与算法的内容基本上就掌握了一半。
一、为什么要复杂度分析
①测试结果非常依赖测试的环境;
②测试结果受数据规模的影响很大;
③掌握复杂度分析,将能编写出性能更优的代码,有利于降低系统开发和维护成本。
二、时间复杂度(渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系)分析
时间复杂度分析法则:
①只关注循环执行次数最多的一段代码;
②加法法则:总复杂度等于量级最大的那段代码的复杂度;
③乘法法则:嵌套的代码的复杂度等于嵌套内外的代码的复杂度的乘积;
复杂度量级:
名称 | 复杂度 |
---|---|
常数阶 | O(1) |
对数阶 | O(logn) |
线性阶 | O(n) |
线性对数阶 | O(nlogn) |
平方阶 | O(n2) |
立方阶 | O(n3) |
k次方阶 | O(nk) |
指数阶 | O(2n) |
阶乘阶 | O(n!) |
三、空间复杂度(表示算法的存储空间与数据规模之间的增长关系)分析
常见的空间复杂度都是O(1)、O(n)、O(n2)。
四、如何掌握好复杂度分析方法?
复杂度分析关键在于多练,所谓孰能生巧。