what
复杂度分析是来衡量算法的执行效率和浪费空间,不需要具体测试数据的分析方法。
position
复杂度分析是算法学习的精髓,只要掌握了它,就掌握了一半数据结构和算法
why
##事后统计法
- 依赖测试环境
- 测试结果受测试数据影响很大
#大O复杂度表示法(渐进时间复杂度)
what
不表示真实的代码执行时间,表示代码执行时间随数据规模增大的变化趋势,所以也叫渐进时间复杂度。 所有代码的执行时间T(n)与每行代码的执行次数n成正比。规律:
**T(n)=O(f(n))**执行时间T(n),数据规模n,每行代码执行总次数f(n)。
how
- 当n特别大时,低阶、常量、系数,并不左右增长趋势,所以可以省去。所以在分析渐进时间复杂度的时候,只分析循环执行次数最多的那一段代码就可以了。
- 加法法则: 总的时间复杂度就等于量级最大的那块代码的时间复杂度
- 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
复杂度量级
注意:指数级和阶乘级为非多项式量级,效率非常低。其他的都是多项式量级
多项式量级
O(1)
只要没有循环和递归语句,即使有成千上万行代码也只是O(1).
O(logn),O(nlogn)
i=1;
while (i <= n) {
i = i * 2;
}
其实相当于一个等比数列,2的x次方=n,两边同时取对数,得到x=log2n
O(m+n)、O(m*n)
当一段代码涉及m,n两个数据规模,我们无法预估那个数据规模更大,不能利用简单的加法法则,但是乘法法则依然可以用
空间复杂度
表示算法的存储空间与数据规模之间的增长关系。 我们常见的空间复杂度就是 O(1)、O(n)、O(n2 )
总结
复杂度分析并不难,关键在于多练。在以后遇到问题的时候,要多用多练,就比较容易掌握。