时间复杂度 | 您所在的位置:网站首页 › bf算法时间复杂度最坏 › 时间复杂度 |
From https://blog.csdn.net/weixin_40422192/article/details/121662313 时间频度:一个算法花费的时间与算法中语句的执行次数 成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 时间复杂度 一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O( f(n) ),称O( f(n) ) 为算法的渐进时间复杂度,简称时间复杂度。
常见的时间复杂度: 常数阶O(1) 对数阶O(log2n) 线性阶O(n) 线性对数阶O(nlog2n) 平方阶O(n^2) 立方阶O(n^3) k次方阶O(n^k) 指数阶O(2^n) 常见的算法时间复杂度由小到大依次为: Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <Ο(2n) , 随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低 常数阶O(1)
对数阶O(log2n)
说明:在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n也就是说当循环 log2n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(log2n) 。 O(log2n) 的这个2 时间上是根据代码变化的,i = i * 3 ,则是 O(log3n) . 例如: log2为底数的算法是: LOG2(N) 相当于2的多少次方(立方)等于N 例:LOG2(8)=3 相当于,2的3次方等于8 线性阶O(n)
说明:这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度 线性对数阶O(nlogN)
说明:线性对数阶O(nlogN) 其实非常容易理解,将时间复杂度为O(logn)的代码循环N遍的话,那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN) 平方阶O(n²)
说明:平方阶O(n²) 就更容易理解了,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²),这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(nn),即 O(n²) 如果将其中一层循环的n改成m,那它的时间复杂度就变成了 O(mn)
平均时间复杂度和最坏时间复杂度 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。 最坏情况下的时间复杂度称最坏时间复杂度。一般讨论的时间复杂度均是最坏情况下的时间复杂度。 这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比最坏情况更长。 平均时间复杂度和最坏时间复杂度是否一致,和算法有关(如图:)。
时间复杂度计算方法 1 形如 T(n) = a * T(n-1) + f(n) 的时间复杂度计算方法 这种形式的复杂度计算,只能用递推的方式 例1: T(n)=T(n-1)+n (1) T(n-1)=T(n-2)+n-1 (2) T(n-2)=T(n-3)+n-2 (3) T(n-3)=T(n-4)+n-3 (4) …… T(3)=T(2)+3 (n-2) T(2)=T(1)+2 (n-1) T(1)=T(0)+1 (n) 将(n)式带回(n-1) 式,将(n-1)式带回(n-2) 式,将式子依次带回,最后带回(4) 式,(3) 式,(2) 式,(1) 式。带入式子结果如下: T(n)=T(0)+1+2+3+……+n-3+n-2+n-1+n 计算结果如下: T(n)=1+1+2+3+……+n-3+n-2+n-1+n T(n)=1+(1+n)*n/2 故算法的时间复杂度为 O(n2) 2 形如 T(n) = a * T(n/b) + f(n) 的时间复杂度计算方法 有一种方法叫做主方法(Master method)是用来专门计算这种形式的时间复杂度的,方法具体如下:
下边举例进行说明: 例1: T(n) = 25*T(n/5) + n^2 因为:a=25,b=5,d=2,f(n) = n^2 所以此例符合Master method 中的第二种情况,所以 直接就可以得到:T(n) = n^2 * logn
参考:https://blog.csdn.net/ym563099457/article/details/119208061 递归算法的时间复杂度 求x的n次方
时间复杂度为O(n)
每次n-1,递归了n次时间复杂度是O(n),每次进行了一个乘法操作,乘法操作的时间复杂度一个常数项O(1),所以这份代码的时间复杂度是 n * 1 = O(n)。
时间复杂度忽略掉常数项-1之后,这个递归算法的时间复杂度依然是O(n)。
依然还是看他递归了多少次,可以看到这里仅仅有一个递归调用,且每次都是n/2 ,所以这里我们一共调用了log以2为底n的对数次。 每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的O(logn)。 汉诺塔问题
时间复杂度:
汉诺塔问题的时间复杂度是指数级别的。 |
CopyRight 2018-2019 实验室设备网 版权所有 |