算法的时间复杂度和空间复杂度(java)

一、时间频度

时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,那个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度

举例:
在这里插入图片描述在这里插入图片描述

这里就只执行了一次。所以下面这段代码的执行时间要比上面的短很多。

二、时间复杂度

(1)一般情况下,算法的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若某个辅助函数f(n),使得当n趋近与无穷大时,T(n)/f(n)的极值为不等于零的常数,则称f(n)是T(n)的同数量级函数。
记做T(n)=o(f(n)),故O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

(2)T(n)不同,但是时间复杂度可能相同,如T(n)=5n²+7n+5 与 T(n)=9n²+2n+1 时间复杂度都是O(n²)

(3)时间复杂度的计算方法 例如上面的:T(n)=5n²+7n+5 直接忽略常数项,一次项,以及最高次项的系数。

常见的时间复杂度

1、常数阶O(1)
2、对数阶O(log2^n)
3、线性阶O(n)
4、线性对数阶O(nlog2^n)
5、平方阶O(n^2)
6、立方阶O(n^3)
7、k次方阶O(n^k)
8、指数阶O(2^n)

常见时间复杂度对应图
在这里插入图片描述
在这里插入图片描述

常见的算法时间度由小到大排序: O(1)<O(log2^n) <O(n) <O(nlog2^n) <O(n2)<O(n3)
<O(n^k) <O(2^n)
n越大,时间复杂度增大,算法的执行效率越低

举例:
常数阶O(1)
在这里插入图片描述

无论这段执行了多少行,只要他没有循环结构,那么他的时间复杂度就是常数1,即使他有几千几万行代码,他的时间复杂度还是1.

对数阶O(log2^n)
在这里插入图片描述

在while循环里面,每次都将i乘2,乘完以后,i距离n也越来越近,循环到x次后,i也就大于2了,此时循环也就结束了,也就是说2的x次方等于n,那么x=log2^n
也就是当循环到log2^n次以后代码就结束了。 所以这段代码的时间复杂度为O(log2^n) ,如果i=i*3
,则对应的时间复杂度就是O(log3^n)

线性阶O(n)
在这里插入图片描述

再例如这段代码,for循环里面的代码会执行n遍,因此他消耗的时间是随着n的时间变化而变化的,因此这类代码的时间复杂度都可以用O(n)来表示。

线性对数阶O(nlog^n)
在这里插入图片描述

线性对数阶O(nlog^N)。 将时间复杂度为时间复杂度为O(log^n) 的代码循环N遍的话,那么他的时间复杂度就是n*O(log^N),
也就是O(log^N)。

平方阶O(n²)
在这里插入图片描述

双重for循环,那么他的时间复杂度就是O(n²) 如果将这里的n改成a,b 那么他的时间复杂度就是O(m*n)

三、空间复杂度

空间复杂度:定义为一个算法所耗费的储存空间。
空间复杂度跟算法需要占用的临时工作单元数与解决规模问题n有关,空间复杂度会随着时间复杂度的n的增大而增大,当n较大时,将占用较多的储存单元。

猜你喜欢

转载自blog.csdn.net/weixin_46457946/article/details/113048490
今日推荐