一、复杂度分析
1、为什么进行复杂度分析?研究算法与数据结构,目的在于“快执行+省存储空间”,故对代码的复杂度进行分析是极有必要的;
2、对比事后统计法(应该就是评论区里说的性能测试)的优点在于:后者依赖测试环境,且受数据规模的影响大,标准难把控;
3、概念:不利用测试数据,粗略估算代码的执行效率。
二、大O复杂度表示方法
1、T(n)=O(F(n)) :T(n)代表代码执行时间,F(n)代表代码总执行次数,O表示代码执行时间与代码总执行次数成正比。
2、大O时间复杂度代表代码执行时间随数据规模增长的变化趋势,数据规模超大时,低阶、常量、系数并不能左右增长趋势,所以只需记录最大量级即可。
三、常见的时间复杂度的分析方法:
1、只关心循环执行次数最多的代码;
2、加法法则,取量级更大的那个:T(n)=O(max(f(n),g(n)));
3、乘法法则,嵌套代码复杂度=嵌套内外复杂度的乘积:T(n)=O(f(n)*g(n));
四、常见时间复杂度
第一种:多项式时间复杂度(按数量级递增)
1、O(1) 常量阶,代码执行时间不随n增大而增大,见于无循环无递归代码,不论多少行~O(1)是一种表示方式(不论多少行);
2、O(logN)对数阶,因为对数可以互相转换,且常量系数可忽略,所以忽略对数的底;
3、O(n)线性阶;
4、O(nlogN)对数线性阶;
5、各种次方阶。
第二种:非多项式时间复杂度:O(2的n次方) 和 O(n!) 属于非常低效的算法
第三种:O(m+n)与O(m*n),代码复杂度由两个数据规模决定,由于无法得知m、n哪个量级更大,故不能直接取其一。
五、空间复杂度分析
1、定义:算法存储空间与数据规模增长的关系,主要看声明的空间存储变量所需要的控件存储量
2、O(1)、O(n)、O(n平方),个人认为可参考基本数据类型、一维数组、二维数组,希望老师可以加上代码举例。
六、关于复杂度分析与性能测试孰优孰略的思考
此处,附上他人的一段分析,感觉特别有道理:
在实际编程中,时刻关心理论时间,空间度模型是有助于产出效率高的程序的,同时,因为渐进式时间,空间复杂度分析只是提供一个粗略的分析模型,因此也不会浪费太多时间,重点在于在编程时,要具有这种复杂度分析的思维。
七、附加信息
(对于空间复杂度没有落实到代码的理解,摘抄的附加信息)
1、存储一个二进制数,输入规模(空间复杂度)是O(logn) bit:
比如存储8的二进制需要3个bit,存储16的二进制需要4个bit,存储某个二进制数,自然要O(logN)bit。