目录
1.为何需要进行复杂度分析
对于代码的执行过程,我们完全可以通过对整个过程实施监控、日志的方式获取到整个代码执行过程中的详细数据,但这种验证式的做法称为事后统计法,这种方法存在一定的缺陷。
- 测试结果非常依赖测试环境,使用的设备的差异会的出不同的统计结果
- 既然称为测试,那么就代表着往往不能够充分考虑各种情况,这就会导致由于测试数据的特殊性而使得测试结果不能充分客观的反映代码的效率
2.时间复杂度分析
其实分析算法的时候既存在时间复杂度的分析,也存在空间复杂度的分析,但是由于空间复杂度分析相对简单且硬件成本下降,所以很多时候人们更注重分析时间复杂度(后边这部分属于个人观点)。
3.大O时间复杂度表示法
以下列这段代码作为例子分析其时间复杂度:
int cal(int n){
int sum = 0;
int i = 1;
for (; i <= n ; i ++){
sum = sum + i;
}
return sum;
}
如果将上方这段代码回归到硬件层面,其实每一行对应的指令执行次数是存在差异的(如果你写过汇编应该很清楚加法和赋值是不同的,如果再回归的二进制机器码,鄙人也没有使用过),但是这里用于分析算法时认为执行每行代码的时间为一个单位时间,即为unitTime。那么,以上代码执行完要使用多少个unitTime呢?
答案是:T(n) = (2n + 3) * unitTime。
那么下方这个例子呢?
int cal(int n){
int sum = 0;
int i = 1;
int j = 1;
for (; i <= n; i++){
j = 1;
for (; j <= n ; j++){
sum = sum + i * j;
}
}
return sum;
}
答案是:T(n) = (2n^2 + 2n + 3) * unitTime
可以看出,算法执行的时间T(n)是一个关于n的函数,