时间复杂度及空间复杂度的计算

时间复杂度:执行的次数和问题规模之间的函数关系。

时间复杂度计算方法:
1.用常数1取代运行时间中的所有加法常数;
2.只考虑最高阶项,低阶项直接丢掉;
3.系数不要,指数不能丢。

最后,得到的最后结果就是时间复杂度。

常见的时间复杂度:
按数量级递增排列,常见的时间复杂度有:
常数阶O(1),对数阶O( log n ),线性阶O(n),平方阶O(n^2),立方阶O(n^3),...,k次方阶O(n^k),指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
也就是:
常用的时间复杂度所耗费的时间从小到大依次是:O(1) < O(logn) < (n) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

// 常数阶
x=x+1  时间复杂度是O(1),因为,按照时间复杂度的定义来说,n和问题的规模没有关系。当然,按照时间复杂度计算方法第一条也可以得出结果为O(1)。

 

// 线性阶
for (i=1;i<=n;i++)

x=x+1;

时间复杂度是O(n),因为问题规模会随着n的增长而变得越来越大,并且这种增长是线的。

 

// 平方阶

for(i=1;i<=n;i++)

for(j=1;j<=n;j++)

x=x+1;

上面这段代码外层执行n次,外层循环每执行一次,内层循环就执行n次,那总共程序想

从这两个循环出来,需要执行n*n次,也就是n的平方。所以时间复杂度O(n^2)。

 

// 对数阶

int i = 1, n = 100; 

while( i < n )

{

i = i * 2;

}
由于每次i*2之后,就距离n更近一步,假设有x个2相乘后大于或等于n,则会退出循环。于是由2^x = n得到x = log(2)n,所以这个循环的时间复杂度为O(logn)。

算法的空间复杂度:实现该算法需要额外的辅助空间及问题规模的函数关系
算法的空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。
使用递归空间复杂度为O(n);

其他的常数则为O(1)。

猜你喜欢

转载自blog.csdn.net/weixin_41298329/article/details/81284946