引言
一个算法的好坏通常是评估其运行时的时间复杂度和空间复杂度。算法的时间代价就是指算法执行时花费CPU的时间,与参与运算的数据量有关,通常很难事先计算得到。算法的时间效率指算法的执行时间随问题的增长而增长的趋势,通常采用时间复杂度来度量。
算法时间复杂度的渐进表示通常用大O表示法,大O表示法给出了函数f(x)的严格上限。其定义为:
预估指南
一些通用规则通常能帮助我们确定一个算法的运行时间。
- 循环:循环体的运行时间通常为循环体内语句的运行时间乘以循环次数
//循环n次 for(int i=0;i<n;i++) n+=1 //时间常数c
总时间=c*n=cn=O(n) - 嵌套循环:从内到外分析,时间是所有循环的乘积
总时间=//外层循化n次 for(int i=0;i<n;i++) //内层循环n次 for(int j=0;j<n;j++) k++;//时间常数c
- 顺序执行语句:每一条语句的运算时间和
总时间=k=1; //时间常数 //执行n次 for(i=1;i<n;i++) k++ //外层循环执行n次 for(j=1;j<n;j++) //内层循环执行n次 for(p=1;p<n;p++) k++;//时间常数
- if-then-else条件语句:最坏情况下的运行时间等于条件判断时间+最大值(then语句部分运行时间或者else语句部分运行时间)
总时间=if(length()==0) return false; else{ for(k=1;k<n;k++) p+=k; return true; }
- 对数级时间复杂度:通常会有变量倍增或者倍减的情况,此时时间复杂度为
,底数有倍数决定
总时间=for(int i=1;i<n;i=i*2) k++;
(底数为2)=
注:本篇博客只是列举了通常见到的几种类型,还有一种特殊类型递归并没有提及,该类型会在后续类型中以独立的博客展开。