- 时间复杂度
算法中基本操作重复执行的次数是问题规模n的某个函数f(n),分析f(n)随n的变化情况并确定T(n)的数量级,用”O”表示数量级,来给出算法的时间复杂度。
T(n) = O(f(n))
该式表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称为算法的渐进时间复杂度,简称时间复杂度。 时间复杂度的分析方法
1.时间复杂度就是函数中基本操作所执行的次数- 一般默认的是最坏时间复杂度
- 忽略掉常数项
- 关注运行时间的增长趋势,关注函数式中增长最快的表达式,忽略系数
- 计算时间复杂度是估算随着n的增长函数执行次数的增长趋势
- 递归算法的时间复杂度为:递归总次数*每次递归中基本操作所执行的次数
常用的时间复杂度有以下几种,算法时间复杂度依次增加: O(1)常数型 O(log2 n)对数型 O(n)线性型 O(nlog2 n)二维型 O(n^2)平方型 O(n^3)立方型 O(2^n)指数型
4.空间复杂度
算法的空间复杂度不是计算实际占用空间,而是计算整个算法辅助空间单元的个数。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的空间,算法的输入输出数据所占用的存储空间,以及算法在运行过程中临时占用的存储空间。与问题的规模没有关系。算法的空间复杂度S(n)定义为该算法所耗费空间的数量级。
即S(n) = O(f(n))
若算法执行时所需要的辅助空间相对于数量n而言是一个常数,则称这个算法的辅助空间为O(1)。
递归算法的空进复杂度:递归深度*每次递归所要的辅助空间,如果每次递归所要的辅助空间是常数,则递归的空间复杂度为O(N).举例
【1】若是算法执行时间不随问题的规模n的增长而增长,此类算法的时间复杂度为O(1)
int x = 91, y = 100;
while(y>0)
{
if(x>100)
{
x -= 10;
--y;
}
else
++x;
}
T(n) = O(1)
【2】当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。
int x = 1, i, j, k;
for(i=1; i<=n; ++i)
{
for(j=1; j<=i; ++j)
{
for(k=1; k<=j; ++k)
{
++x;
}
}
}
这段代码中平度最大的是++x,内循环的执行次数虽然与问题的规模n没有直接关系,但却与外层循环的变量取值有关系,而最外层的循环次数与n有关,因此可以从内曾向外层分析语句++x的执行次数。即改程序的时间复杂度为T(n) = O(n^3)