复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。
如何分析、统计算法的执行效率和资源消耗
为什么需要复杂度分析?
事后统计法 :把代码跑一遍,通过统计、监控,得到算法执行的时间和占用的内存大小
这种评估算法执行效率的方法是正确的 , 但是,这种统计方法有非常大的局限性。
1. 测试结果非常依赖测试环境
2.测试结果受数据规模的影响很大
不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。
大O复杂度表示法
时间复杂度分析
1.只关注循环执行次数最多的一段代码
我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。
2.加法法则:总复杂度等于量级最大的那段代码的复杂度
总的时间复杂度等于量级最大的那段代码的时间复杂度。
3.乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
几种常见时间复杂度实例分析
空间复杂度分析
时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系。
空间复杂度全称就是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系。
常见的空间复杂度就是O(1)、O(n)、O(n2 ),像O(logn)、O(nlogn)这样的对数阶复杂度平时都用不到。
内容小结:
- 复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,可以粗略地表示,越高阶复杂度的算法,执行效率越低。
- 常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n2 )。
浅析最好、最坏、平均、均摊时间复杂度
1.最好情况时间复杂度:代码在最理想情况下执行的时间复杂度。
2.最坏情况时间复杂度:代码在最坏情况下执行的时间复杂度。
3.平均时间复杂度:用代码在所有情况下执行的次数的加权平均值表示。
4.均摊时间复杂度:在代码执行的所有复杂度情况中绝大部分是低级别的复杂度,个别情况是高级别复杂度且发生具有时序关系时,可以将个别高级别复杂度均摊到低级别复杂度上。基本上均摊结果就等于低级别复杂度。