目录
时间复杂度
推论解释:
目的:
估算一个算法的执行时间,通过时间复杂度进行表示。
分析过程
算法执行时间相关因素
与算法执行时间相关的因素:算法选用的策略,问题的规模,编写程序的语言,编译产生的机器代码的质量,计算机执行指令的速度。其中后三者受计算机硬件和软件的制约,因此只考虑前两条。
所谓问题的规模,就是算法求解的输入量。如:对n个号码排序,n可称为问题的规模;求n阶矩阵的转置,n可称为问题的规模。
估算算法执行时间
那么,一个算法的执行时间如何估算?
分析:算法都是由控制结构(顺序、分支、循环三种)和原操作(对固有数据类型的操作,如:赋值、比较)构成的。算法的执行时间可以看成是所有原操作的执行时间之和;计算表达式为:算法输入量*单次执行时间。
注意:多数情况下,计算最深层循环内的语句的执行时间之和就可以代表该算法的执行时间的量级。
时间复杂度的计算
示例一:
代码:
{++x;s=0;}
说明:
该语句只执行一次,没有问题规模即算法输入量的影响。
那么,上述代码的执行时间就是执行一次{++x;s=0;}的耗时。
时间复杂度表示为:T(n) = O(1)。
示例二:
代码:
for(i=1; i<=n; ++i) {
++x;
s+=x;
}
说明:
循环内语句{++x; s+=x;}执行的次数受算法的输入量n影响,上述代码的执行时间与算法输入量n成线性相关。
那么,上述代码的执行时间为:n*执行一次{++x;s+=x;}的耗时。
时间复杂度表示为: T(n) = O(n)。
示例三:
代码:
for(i=1; i<=n; ++i ) {
for( j =1; j<= n; ++j ) {
++x;
s+=x;
}
}
说明:
循环内语句{++x; s+=x;}执行的次数受算法的输入量n影响,上述代码的执行时间与算法输入量n成平方比,因为外层循环n次,内层循环n次,循环内语句共执行n*n次。
那么,上述代码的执行时间为:n2*执行一次{++x;s=0;}的耗时。
时间复杂度表示为: T(n) = O(n2)。
常见的时间复杂度
常数阶 O(1),
对数阶 O(log n),
线性阶 O(n),
线性对数阶 O(nlog n),
平方阶 O(n2),
立方阶 O(n3),
指数阶 O(2n),
阶乘阶 O(n!)。
注意:以上时间复杂度,从上到下依次增长
注意:以上所述时间复杂度均指最坏的时间复杂度
空间复杂度
推论解释:
目的:
了解空间复杂度。
分析过程
空间复杂度的相关因素
与空间复杂度相关的因素:算法本身的存储空间,输入数据的存储空间,算法在运行过程中临时占用的存储空间。其中,算法本身的程序代码所占的存储空间对不同的算法而言没有数量级的差距,不予考虑;算法的输入量与问题的规模相关,通常输入数据所占空间只取决于问题本身,和算法无关,也可不予考虑;因此,只需要考虑算法运行过程中临时占用的存储空间。
空间复杂度表示方式:
S(n) = O(f(n))